JAVA基础(二)输入输出流总结

来源:互联网 发布:淘宝电子产品退货规定 编辑:程序博客网 时间:2024/06/05 07:25

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();  //直接读取一行