Java IO

IO流类别

按照流向划分

  • 输入流
  • 输出流

以当前程序作为参照物,当数据流入 则使用输入流,数据流出 则使用输出流。

按照处理单位划分

  • 字节流:字节流就是用于读取文件的字节数据的,读取到的数据不会经过任何的处理
  • 字符流: 读取到的字节数据还会帮你转换成你看得懂的字符数据,读取的是以字符作单位的数据。 字符流 = 字节流 + 解码

字节流

输入字节流:

InputStream 抽象类 输入字节流的基类;
FileInputStream 读取文件数据的输入字节流;
BufferedInputStream 缓冲输入字节流,该类的本质其实只是在内部维护了一个8kb的字节数组而已,主要是提高我们的读取文件的效率。

凡是缓冲流都没有读写文件的能力

使用FileInputStream 读取文件数据步骤

  1. 找到目标文件
  2. 建立数据的输入通道
  3. 读取文件的数据

输出字节流:

OutputStream 抽象类 所有输出字节流的父类;
FileOutputStream 向文件输出数据的输出字节流;
BufferedOutputStream 缓冲输出字节流,为了提高写文件数据的效率

使用FileOutputStream步骤

  1. 找到目标文件
  2. 建立数据的输出通道

FileOutputStream要注意的细节:

  1. new FileOutputStream的时候,如果目标文件不存在,那么会先创建目标文件,然后再写入
  2. new FileOutputStream(file)如果目标文件已经存在了,那么会先清空目标文件的数据,然后再写入新的数据
  3. 写入数据的时候如果需要以追加的形式写入,那么需要是使用new FileOutputStream(file,true)这个构造函数
  4. 使用write(int b)方法的时候,虽然参数接受的一个int类型的数据,但是实际上只会把数据的低八位写出,其他24为丢弃

BufferedOutputStream 需要注意的事项

  1. 使用BufferedOutputStream的write方法时,数据其实是写入了BufferedOutputStream内部维护的字节数组中,只有你调用BufferedOutputStream的close方法或者是flush方法数据才会真正的写到硬盘上去或者内部维护的字节数组已经存储满数据了,这时候数据也会写到硬盘上去。
  2. BufferedOutputStream的close方法实际上关闭的就是你传入的OutputStream对象的close方法。
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
32
33
//字节流的输入与输出应用——文件的复制
public class CopyDemo {
public static void main(String[] args) {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream("D:\\test\\test.txt");
outputStream = new FileOutputStream("D:\\test.txt");
byte[] buf = new byte[1024];
int len = 0;
while( (len = inputStream.read(buf)) != -1){
outputStream.write(buf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

字符流

输入字符流

Reader 抽象类,所有输出字符流的基类;
FileReader 读取文件字符数据的输入字符流;
BufferedReader 该类出现的目的:提高读取文件字符数据的效率,对FileReader的功能进行了拓展—readLine()。

输出字符流

Writer 抽象类 所有输出字符流的基类
FileWriter 向文件输出数据的输出字符流
BufferedWriter 缓冲输出字符流,目的:为了提高文件数据的效率以及拓展FileWriter的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//字符流拷贝
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("D:\\test\\test.txt");
Writer writer = new FileWriter("D:\\test.txt");
int ch = -1;
char [] arr=new char[1024];
while ((ch = reader.read(arr)) != -1) {
writer.write(arr,0,ch);
}
reader.close();
writer.close();
}
}

Properties

Properties主要用来读取配置文件,或者网配置文件中写文件,但现在由于springboot自动化配置的使用,properties使用也减少了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//常用读取配置文件
public class GetProperties {
private static String path = "src/test.properties";
private static String value = "";
public static String getProperty(String key) {
try {
Properties props = new Properties();
BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(path)));
props.load(input);
value = props.getProperty(key);
} catch (IOException e) {
e.printStackTrace();
}
return value;
}
}

注意事项:

  1. 往Properties添加数据的时候,千万不要添加非字符串类型的数据,如果添加了非字符串类型的数据,那么properties的处理方式就是进行强制类型转换,强转报错。
  2. 如果properties的数据出现了中文字符,那么使用store方法时,千万不要使用字节流,如果使用了字节流,那么默认使用iso8859-1码表进行保存,如果出了中文数据建议使用字符流。
  3. 如果修改了properties里面 的数据,一定要重新生成一个配置文件。

转换流

InputStreamReader : 输入字节流——>输入字符流

OutputStreamWriter : 输出字节流——>输出字符流。

转换流的作用

  1. 可以把字节流转换成字符流
  2. 可以制定任意的码表进行读写数据

zhuanhuanliu.jpg
具体使用参考文档,使用较简单。

------------- 感谢阅读-------------