Java IO简介
来源:互联网 发布:公共场所网络上报 编辑:程序博客网 时间:2024/06/05 16:25
流 分为字节流和字符流
字节流的父类是 InputStream 是一个抽象类,不可实例化
比较常用的子类有 FileInputStream 和 BufferedInputStream
都是通过字节读取,区别是BufferedInputStream 存在缓冲区,一次性读取较多的字节存放在缓冲区,读取文件的时候优先从缓冲区读,性能比FileInputStream好
BufferedInputStream 的构造方法中需要传入InputStream实例,一般传入FileInputStream实例
字符流的父类是Reader,同理也是一个抽象类,不可实例化
常见的子类有InputStreamReader
InputStreamReader是字节流通向字符流的桥梁,因为InputStreamReader的构造参数里面可以传入一个字节流的对象,InputStream。
与InputStream的区别是一个字符一个字符读取,InputStreamReader的构造函数中可以设置字符集属性,防止在读取中文内容时乱码,
构造方法如下:
InputStreamReader(InputStream in, String charsetName)
FileReader是InputStreamReader的子类,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,在FileReader的
使用过程中会出现中文乱码,并不推荐使用
BufferedReader与InputStreamReader功能类似,构造方法是传入一个Reader,一般是传入InputStreamReader,
但是多了readLine方法,可以直接返回String类型的字符串,也有缓冲区的实现。
输出流
字节输出流的父类是 OutputStream 是一个抽象类,不可实例化
常见的子类有FileOutputStream,构造参数传入一个File即可。核心是write(byte b[])方法,write方法的主要作用是把byte数组写入文件中。如果需要在文件
的末尾追加内容,需要在FileOutputStream的构造参数append设为true,如下所示:
FileOutputStream fos = new FileOutputStream(f2, true);
BufferedOutputStream是最常见的字节输出流,同BufferedInputStream,它也存在一个缓冲区,在写文件时会先将字节写入缓冲区,然后再从缓冲区读。
需要注意的是,使用BufferedOutputStream有一个flush()方法,他的作用是强制输出缓冲流的内容
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(bytes);
bos.flush();
bos.close();
在如上代码中,如果同时注释flush方法和close方法,那么输出流不会将内容输出到文件中,因为需要输出的内容还留在缓冲区中,如果加了flush方法,那么
缓冲区的内容会被强制输出到文件中,但是如果没加flush方法,写了close方法,结果同样也可以输出到文件中,这又是为什么呢,我们查看一下BufferedOutputStream 父类的
close方法后发现,close方法会调用fluse方法,如下所示:
public void close() throws IOException {
try (OutputStream ostream = out) {
flush();
}
}
所以在平时使用BufferedOutputStream输出流时,要注意加上flush方法和close方法。需要注意的是,只有BufferedOutputStream有缓冲区的概念,例如FileOutputStream
是没有缓冲区的概念,但它仍然有flush方法,只是它的方法体内是空的,所以FileOutputStream的flush方法完全不做任何操作,在使用时不需要加上flush方法。
字节输出流的父类Writer类,是一个抽象类,不可实例化
Writer类的使用基本同OutputStream,区别是一个是字节输出,一个是字符输出。
OutputStreamWriter是字节流桐乡字符流的桥梁,因为它的构造参数中需要传入一个字节流,同时可以设置字符集属性,防止在输出中文内容时乱码 如下所示:
FileOutputStream fos = new FileOutputStream(f2, true); //true表示在文件末尾追加
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
OutputStreamWriter在使用write方法时也要注意加上flush方法和close方法(同BufferedOutputStream )
BufferedWriter是缓冲型输出流,它的构造方法需要传入一个Writer,不能直接指定字符集属性,需要通过传入的Writer指定,如下所示:
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
BufferedWriter bw = new BufferedWriter(osw);
BufferedWriter使用方法基本同OutputStreamWriter,区别是缓冲区的大小不一样,BufferedWriter是继承了Writer类进行实现,而OutputStreamWriter是用StreamEncoder
进行实现。
附上测试代码和IO流介绍图:
public void test() throws IOException { File f = new File("D://test.txt"); File f2 = new File("D://test2.txt"); if (f.exists()) { //FileInputStream 字节输入流 FileInputStream fs = new FileInputStream(f); byte[] bytes = new byte[1024]; int i = fs.read(bytes); String str = new String(bytes, 0, i, "GBK"); System.out.println(str); //BufferedInputStream 字节输入流,存在缓冲区,读取速度加快 FileInputStream fs2 = new FileInputStream(f); BufferedInputStream bis = new BufferedInputStream(fs2); byte[] bytes2 = new byte[1024]; int i2 = bis.read(bytes2); String str2 = new String(bytes2, 0, i2, "GBK"); System.out.println(str2); //InputStreamReader 字符输入流 InputStreamReader isr = new InputStreamReader(fs, "GBK"); char[] chars = new char[1024]; int is = isr.read(chars); String strs = new String(chars, 0 ,is); System.out.println(strs); FileReader fr = new FileReader(f); char[] charr = new char[1024]; int ir = fr.read(charr); String strc = new String(charr, 0, ir); strc = new String(strc); System.out.println(strc); //BufferedReader缓冲输入字符流 BufferedReader br = new BufferedReader(isr); String string = ""; String line = ""; while ((line = br.readLine()) != null) { string += line; } System.out.println(string); FileOutputStream fos = new FileOutputStream(f2, true); fos.write(bytes); //fos.flush(); fos.close(); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write(bytes); bos.flush(); bos.close(); //OutputStreamWriter 字符输出流 OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK"); osw.write(chars); osw.flush(); osw.close(); BufferedWriter bw = new BufferedWriter(osw); bw.write(chars); bw.close(); } }
阅读全文
1 0
- Java IO简介
- Java IO简介
- java IO简介
- JAVA IO/NIO简介
- 简介JAVA IO
- Java IO简介
- Java IO库简介
- java IO 简介
- Java IO简介
- Java IO流简介
- Java IO流-IO 流简介
- NIO简介-Java New IO
- JAVA中IO简介1
- JAVA中的IO简介2
- Java IO多路复用技术简介
- 【Java】【IO】FileInputStream read 简介
- JAVA-IO(1)操作简介
- JAVA-IO(2)操作简介
- Io流和操作总结
- js中的get和set方法(demo说明)
- 使用Unity制作一个简单的聊天室
- (2)数据挖掘算法之k-means
- Android Binder机制
- Java IO简介
- python学习之基础知识(一)
- 网络编程
- 如何使用SignalTap观察被综合掉的wire与reg值
- linux下LAMP环境配置之apache-2.4.27编译安装
- (3)数据挖掘算法之SVM
- 斐波那契数列的递归和非递归实现 —— python
- Python爬虫实战一 | 抓取取校花网的所有妹子
- 引用类型(类)