概述:

img

一、IO流原理及流的分类

img

img

流的分类

  • 按操作数据单位不同分为:字节流(8bit)(二进制文件),字符流(按字符)(文本文件)
  • 按数据流的流向不同分为:输入流,输出流
  • 按流的角色的不同分为:节点流,处理流/包装流

二、Java操作文件方式

1、创建文件

1
2
3
1. new File(String pathName);             //根据路径创建一个File对象
2. new File(File parent, String child); //根据父目录文件+子路径构建
3. new File(String parent, String child); //根据父目录+子路径构建

在创建文件对象后,对象只是存储在内存中,并没有实际在硬盘中创建,需要调用文件对象的 createNewFile() 方法才可真正创建。

1
2
3
4
5
6
7
8
public static void main(String[] args) {
File file = new File("e:\\test.txt");
try {
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}

2、 获取文件信息方法

  • getName //获取文件名
  • getAbsolutePath //获取绝对路径
  • getParent //获取文件父级目录
  • length //获取文件字节数
  • exists //判断文件是否存在,返回bool类型
  • isFile //判断是否是文件,bool类型
  • isDirectory //判断是否是目录,bool类型

3、 创建目录

用mkdir方法,如果要创建多级目录,用mkdirs方法。

4、 删除文件或者目录

用Delete方法,当用delete方法删除目录时,只能用来删除空目录。

三、流

1. 字节流(二进制文件)

  • InputStream 字节输入流
  • OutputStream 字节输出流

img

如:拷贝图片文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    //将 1.jpg 文件中的内容读取到 2.jpg 中
static void FileCopy() {
String oldFile = "F:\\Programs\\JetBrains\\JavaSEprogram\\BiliBili\\src\\com\\pushihao\\File_\\File\\1.jpg";
String newFile = "F:\\Programs\\JetBrains\\JavaSEprogram\\BiliBili\\src\\com\\pushihao\\File_\\File\\2.jpg";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
byte[] buf = new byte[1024];
int readLen;

try {
fileInputStream = new FileInputStream(oldFile);
fileOutputStream = new FileOutputStream(newFile, true);
while ((readLen = fileInputStream.read(buf)) != -1) {
fileOutputStream.write(buf, 0, readLen);
}

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
fileOutputStream.close();

System.out.println("文件拷贝完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

2. 字符流(文本文件)

  • Reader 字符输入流
  • Writer 字符输出流

img

对应方法有:

img

img

3. 处理流

img

四、字节流和处理流

注意:字节是最基本的单位,字节流既可以处理二进制文件,也可以处理字符文件

1. 处理流 BufferedReader 和 BufferedWriter

  • BufferedReader 和 BufferedWriter 属于字符流,是按照字符来读取数据的,不能操作二进制文件
  • 关闭处理流时,只需要关闭外层流即可(外层流指高级的那层流)
1
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));

关闭时,只需要关闭最外层即可

1
bufferedReader.close();

常用方法:

  1. BufferedReader
  • readLine 读取一行,但并不会读取换行符
  1. BufferedWriter
  • newLine 插入一个与系统相关的换行
  • write 多种重载,写入文件

    2. 处理流 BufferedInputStream 和 BufferedOutputStream

  • BufferedInputStream 和 BufferedOutputStream 是字节流,处理二进制文件

    3. 对象流 ObjectInputStream 和 ObjectOutputStream

  • 顾名思义,对象流就是可以把一个对象保存到文件(序列化)或者把对象从文件中读取出来(反序列化)
  • 序列化和反序列化
    1. 序列化就是在保存数据时,保存数据的值和数据类型
    2. 反序列化就是在恢复数据时,恢复数据的值和数据类型
    3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,而为了让某个类是可序列化的,该类必须实现如下两个接口之一
      • Serializable //这时一个标记接口
      • Externalizable
1
2
3
4
5
6
7
8
9
10
11
//序列化示例
public static void WriteFile() throws Exception {
Dog dog = new Dog("pillage", 18);
String filePath = "F:\\Programs\\JetBrains\\JavaSEprogram\\BiliBili\\src\\com\\pushihao\\File_\\File\\obj01.os";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeObject(dog);
oos.close();
System.out.println("保存完毕!");
}

//class Dog implements Serializable

注意事项:

  1. 读写顺序要一致

  2. 序列化和反序列化所使用的类一定要是同一个类,因为在序列化的过程中,会把包信息也加入在内

  3. serialVersionUID 是序列化的版本号,可以提高兼容性(在类中新增属性时,只要版本号相同,他也会认为是同一个类。例如:private static final long serialVersionUID = 1L;

  4. 序列化对象时,默认将里面所有的属性都进行序列化,但除了static 和 transient 修饰的成员

  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口

  6. 序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

  7. 要求序列化或反序列化对象,需要实现 Serializable 接口

4. 标准输入输出流

System.in 和 System.out

  • System 类的 public final static InputStream in = null

  • System.in 的编译类型 InputStream, 运行类型 BufferedInputStream(对应键盘)

  • System.out 的编译类型 PrintStream,运行类型 PrintStream(对应屏幕/显示器)

5. 转换流

InputStreamReader 和 OutputStreamWriter

作用:字节流转成字符流,可以解决字符乱码问题

使用:

  1. InputStreamReader 是 Reader 的子类,可以将 InputStream(字节流)包装/转换成 Reader(字符流)
  2. OutputStreamWriter 是 Writer 的子类,可以将 OutputStream(字节流)包装/转换成 Writer(字符流)
  3. 当处理纯文本的数据时,使用字符流效率往往会更高,而且可以解决中文乱码的问题
  4. 可以在使用时指定文件编码格式(比如 utf-8,gbk 等)
1
2
3
4
5
6
7
//将a.txt用字节流方式打开并转成utf-8字符流形式,然后再包装成处理流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\a.txt"), "utf-8"));

//OutputStreamWriter
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("E:\\a.txt"), "gbk");
outputStreamWriter.write("psh");
outputStreamWriter.close();

6. 打印流

PrintStream 和 PrintWriter

打印流只有输出流,没有输入流,打印并不一定打印到屏幕上,也可以打印到文件里,网页上等等( 用System.setOut(); 方法 )。

  • PrintStream 是字节流,PrintWriter 是字符流

五、Properties类

  • 专门用于读写配置文件的集合类

    • 配置文件格式:

      键1=值1

      键2=值2

  • 注意:键值对不需要有空格,值不需要用引号引起来,默认是 String 类型

  • Properties常用方法

    • load 加载配置文件的键值对到 Properties 对象
    • list 将数据显示到指定设备
    • getProperty(key) 根据键获取值
    • setProperty(key, value) 设置键值对到 Properties 对象(底层还是哈希表)
    • store 将 Properties 中的键值对存储到配置文件,在 idea 中,保存信息到配置文件,如果含有中文,会存储为 unicode 码