IO流

字节流

字节输出流

FileOutputStream的作用:

​ 可以把程序中的数据写到本地文件上,是字节流的基本流

步骤:

  1. 创建字节输出流对象
    1. 参数是字符串表示的路径或者File对象都是可以的
    2. 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
    3. 如果文件已经存在,则会清空文件
  2. 写数据
    1. write方法的参数是整数,但是实际写到本地文件中的是整数再ASCII上对应的字符
  3. 释放资源
    1. 每次使用完流之后都要释放资源
    2. 先开的最后关闭
1
2
3
4
5
6
7
8
9
10
11
12
//创建对象的第二个参数是续写打开的开关
//默认false:关闭续写,创建对象会清空文件
//手动传递true:开启续写,创建对象不会清空文件
FileOutputStream fos = new FileOutputStream("myio\\a.txt", false);
//一次写一个字节数据
fos.write(97);
//一次写一个字节数组数据
byte[] bytes = {97, 98, 99};
fos.write(bytes);
//一次写一个字节数组的部分数据
//参数二:起始索引 参数三:个数
fos.write(bytes, 1, 2);

字节输入流

FileInputStream的作用:

​ 操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

步骤:

  1. 创建字节输入流对象
    1. 如果文件不存在,直接报错
  2. 读数据
    1. 一次读一个字节,读出来的是数据是ASCII上对应的数字
    2. 读到文件末尾了,read方法返回-1
  3. 释放资源
    1. 每次使用完流之后都要释放资源
    2. 先开的最后关闭
1
2
3
4
5
FileInputStream fis = new FileInputStream("myio\\a.txt");
while ((fis.read()) != -1) {
System.out.println(fis.read());
}
fis.close();

字符流

字符输出流

字符输入流

FileReader的作用:

​ 操作本地文件的字符输入流,可以把本地文件中的数据读取到程序中来

步骤:

  1. 创建字符输入流对象
    1. 如果文件不存在,直接报错
  2. 读数据
    1. 按字节进行读取,遇到中文了,一次读多个字节,读取后解码,返回一个整数
    2. 读到文件末尾了,read方法返回-1
  3. 释放资源
    1. 每次使用完流之后都要释放资源
    2. 先开的最后关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FileReader fr = new FileReader("myio\\a.txt");
int ch;
//read()在读取后,方法的底层会进行解码并转成十进制,最终把十进制的数据作为返回值
while ((ch = fr.read()) != -1) {
//如果想看到字符,进行强转即可
System.out.println((char)ch);
}

//read(char[] buffer)在读取后,会同时进行读和强转的操作
char[] chars = new char[1024];
while ((len = fr.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
fr.close();

异常处理

  • JDK7以前:只能手动释放资源
1
2
3
4
5
6
7
try {
可能出现异常的代码;
}catch(异常类名 变量名) {
异常的处理代码;
}finally {
执行所有资源释放操作;
}
  • JDK7:资源用完自动释放
1
2
3
4
5
try (创建流对象1; 创建流对象2){
可能出现异常的代码;
}catch(异常类名 变量名) {
异常的处理代码;
}
  • JDK9:资源用完自动释放
1
2
3
4
5
6
7
创建流对象1;
创建流对象2;
try (流1;流2){
可能出现异常的代码;
}catch(异常类名 变量名) {
异常的处理代码;
}