一直搞不太懂java里的io问题,感觉java.io里面的类很多、很复杂而且很混乱,每次进行文件读写时都会费好多脑筋,
毕竟java里的文件读写是避免不了的=.=,写着写着自己也就明白了~
java io流的分类(两类):
1.根据数据流向分为:输入流和输出流,其中的“输入”和“输出”是相对于内存而言的;输入流用于把数据读取到内存中,输出流则相反。
2.根据数据单位分为:字节流和字符流,它们的区别如下:
- 1). 字节流的基本单位是字节(8位),字符流的基本单位是Unicode码元(2个字节,16位);
- 2). 字节流适用范围小,用于处理二进制数据或文本,字符流适用范围大,不仅能够处理文本数据,还能处理音频、图片等。
- 3). 字节流默认不使用缓冲区,字符流使用缓冲区。
相应的,java.io中具有这4个重要的抽象类,在此基础上有很多子类。
\ | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
java io流的主要子类:
字节流(派生关系):
字符流(派生关系):
1.读文件的一般步骤:
- 创建文件对象:
File file = new File(文件的路径);
- 创建流对象:
FileReader fr = new FileReader(file);
根据java api,FileReader对象会使用默认的字符集和字节缓冲区大小: - 注1:如果需要使用缓冲区,则用FileReader对象构建一个BufferedReader对象:
BufferedReader bf = new BufferedReader(fr);
,可以使用指定输入缓冲区大小的构造函数,以指定缓冲区大小~ - 注2:如果要进行转码,需要使用FileInputStream对象构建一个InputStreamReader对象来处理,即:
FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis);
,可以使用指定字符集的构造函数,以指定字符集~ - 注3:如果即需要转码、又需要使用缓冲区的话,在注2的基础上,用InputStreamReader对象构造BufferedReader对象即可:
BufferedReader bf = new BufferedReader(isr);
- 读文件:
read()
和readLine()
,根据java api:
int read():Reads a single character.
String readLine():Reads a line of text.
2.写文件的一般步骤:同理~
实例链接: Java IO——文本增、删、查
参考链接:java使用IO读写文件总结、Java API,感谢作者!