JAVA输入输出流种类繁多,为了防止混淆,在此简单总结一下:
JAVA的基本流分类主要有以下两种:
按输入输出分为:输入流、输出流
按数据类型分为:字节流、字符流(多用于文本)
基本输入输出流如下:
字节输入流及输出流:InputStream OutputStream
引申出的字节缓冲流:BufferedInputStream,BufferedOutputStream
字符输入及输出流:Reader Writer
引申出的字符缓冲流:BufferedWriter,BufferedReader(FileWriter,FileReader)
下面分类对这几个基本流进行介绍
一、字节流
字节输入流及输出流使用InputStream和OutputStream作为基本抽象类,我们一般使用FileInputStream,FileOutputStream作为字节流的具体实现类
对字节输出流而言,可以使用的构造函数:
FileOutputStream fos = new FileOutputStream("a.txt", true);
其中,第一个栏位可以为File对象,也可以直接指定文件名称,第二个栏位为可选栏位,当存在且为true时,为追加写入,否则一律为清空写入
在进行写入的时候,使用函数:
fos.write("哈哈\n".getBytes());
字节流在写入文件的时候,必须将字符转换为二进制格式,所以不是byte类型的内容必须进行转换,如果想要换行写入,需要输入换行符"\n"
对字节输入流而言,构造函数与输出流相似,只是不存在追加写入的判断:
FileInputStream fis = new FileInputStream("a.txt");
byte[] b = new byte[10];
fis.read(b); //读取一定的byte长度到b中
System.out.print(new String(b,"GBK"));
fis的read函数支持读取一个或多个字符,这里为了将之前的中文显示出来,使用String的构造函数进行了默认GBK的转码
对于大文件(图片,视频等),可以将b的长度设置为1024,以进行最大限度的传输,增加缓冲能够有效提高字数据的传输效率,由此引出了字节缓冲流的概念。
字节缓冲输出流的创建方式如下:
BufferedOutputStream bos = new BufferedOutputStream(fos,size);
BufferedInputStream bis = new BufferedInputStream(fis, size);
字节缓冲的输出流有一个比较强大的功能在于可以在flush之前一直不进行文件写入,以实现性能的优化,相比之下,字节缓冲输入流倒并没有提供什么崭新的方式,毕竟读到的数据直接就拿来放到内存去了,值得一提的是,缓冲流需要将基本字节流作为输入,因为真正的写入功能实际上还是基本流在进行支持,这种封装可以理解为装饰者模式
二、 字符流
字符流实际上是字节流+编码表,流对象都是用Writer和Reader收尾,构造函数如下:
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
对于字符输出流,使用方式和字节流完全一样,不同的是write函数直接写入String或者char[],同时,也可以通过char[],并规定开始位置及长度,完成输入:
osw.write("哈哈"); //第一种写入方法
char[] c ="哈哈".toCharArray();//字符串转字符数组
osw.write(c,1,2); //第二种写入方法
读取的方式read与字节流一致,不同的是可以将byte[]转换为char[]
char[] cs = new char[1024];
isr.read(cs);
System.out.println("读取到的是"+String.valueOf(cs));
与字节流相似,可以得到字符缓冲流的实现类,BufferedWriter和BufferedReader的构造函数如下:
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
这里我们用到了文件字符流FileWriter和FileReader,因为这样可以使字符缓冲流创建更加方便,如果用字符流作为创建输入,长度实在令人头疼。。。
字符缓冲流除了看家本领flush之外(其实只有Writer有),各自还提供了读写文件的换行功能。也算是聊胜于无吧(读取的时候可以用String来存储了)
bw.newLine(); //写入时另起一行
String s = br.readLine(); //直接读取一行