JAVA I/O流阶段性小结
前提概要:
刚刚接触I/O流的时候是在学校听专业课老师讲课,老师讲的特别简单,当时以为老师讲得简单所以该知识点就不重要,再加上自己当时不怎么喜欢敲代码,所有就放在了一边,到了暑假自己系统学习了才发现I/0特别重要(虽然目前还没怎么应用),所以特地写一个小总结,如有不足之处还请各位大神指出,我定及时改正。
大纲图
1.字节流(InputStream)
类 |
功能 |
构造器参数及如何使用 |
ByteArrayInputStream |
允许将内存的缓冲区当作InputStream使用 |
缓冲区,字节将从中取出,作为数据源:将其与FilterInputStreamD对象相连以提供有用接口 |
StringBufferInputStream |
将String转换成InputStream |
字符串,底层实现实际使用StringBuffer. 作为数据源:将其与FilterInputStreamD对象相连以提供有用接口 |
FileInputStream |
用于从文件中读取信息 |
字符串,表示文件名,文件或FileDescriptor对象 作为数据源:将其与FilterInputStreamD对象相连以提供有用接口 |
PipeInputStream |
产生用于写入相关PipedOutputStreamde数据,实现管道化概念 |
PipedOutputStream 作为多线程中的数据源:将其与FilterInputStreamD对象相连以提供有用接口 |
SequenceInputStream |
将两个或多个InputStream对象转换成单一InputStream |
两个InputStream对象或者一个容纳InputStream对象容器的Enumeration |
FilterInputStream |
抽象类,作为“装饰器”的接口 |
|
2.字节流(OutputStream)
类 |
功能 |
构造器参数及如何使用 |
ByteArrayOutputStream |
在内存中创建缓冲区,所有送往“流”的数据都要放置在此缓冲区 |
缓冲区初始化尺寸, 用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FileOutputStream |
用于将信息写至文件 |
字符串,表示文件名,文件或FileDescriptor对象 用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
PipedOutputStream |
任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现管道化概念 |
PipedInputStream 指定用于多线程的数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FilterOutputStream |
抽象类,作为“装饰器”的接口 |
|
3.字符流(Reader)
4.字符流(Writer)
虽然说以上4个表列出了很多有关于I/O的知识点,但是有许多我目前还用不到,以后用到了会慢慢补上,接下来就一起来学习一下我们最常用的I/O流。直接上代码-.-
1.字节流读取文件内容
package ZIJIE; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputstream { public static void main(String[] args) throws IOException { FileInputStream fis=new FileInputStream("F:\\a.txt"); int len=0; //read方法执行一次就会读取一次 while((len=fis.read())!=-1)//-1代表文件末尾 { System.out.println("读取的字节==========="+len); //len 是读取到的字节 System.out.println((char)len); } fis.close(); } }
2.字节流写文件
package ZIJIE; import java.io.FileNotFoundException; import java.io.IOException; public class FileOutputStream { public static void main(String[] args) throws IOException { java.io.FileOutputStream fop=new java.io.FileOutputStream("F:\\io.txt");//创建文件,如果已经存在,则原文件会被覆盖 //fop.write(100);//文本存的是d,因为d的ASCLL码值为100 //fop.write(49); //fop.write(48); //fop.write(48);//一次写入一个字节 一共三次 写入100 //记事本中一个汉字占2个字节 字母和数字占一个字节 //写入字节数组 byte[]bytes={65,66,67,68}; //fop.write(bytes); //写入部分字节数数组 //fop.write(bytes, 2, 2);//数据,起始偏移量,字节数 fop.write("Hello!!!你好啊".getBytes()); fop.close(); } }
3.字符流读取文件
package ZIFU; import java.io.FileReader; import java.io.IOException; public class FileReaderDemon { public static void main(String[] args)throws IOException { //FileReader 读取文本文件 FileReader fr=new FileReader("C:/Users/ASUS/Desktop/java.txt"); int len=0; len=fr.read();//读取单个字符 //System.out.println((char)len); //读取字符数组 char []a=new char[500]; int lan=0; while((lan=fr.read(a))!=-1) { System.out.println("读取的字符数=============="+lan); System.out.print(new String(a,0,lan)); } } }
4.字符流写文件
package ZIFU; import java.io.FileWriter; import java.io.IOException; //实现字符的写入 public class FileWriterDemon1 { public static void main(String[] args)throws IOException { FileWriter fw=new FileWriter("F:\\a.txt"); //写入单个字节 /*fw.write(100); fw.flush();//必须刷新 否则无法写入 fw.close();*/ //写入字节数组 char[] c={'s','2','p'}; fw.write(c); fw.flush(); //写入字符数组一部分,从1开始,写两个到文本中 fw.write(c, 1, 2); fw.flush(); //写入字符串 String s="ABCDE"; fw.write(s); fw.flush(); fw.write(s, 4, 1); fw.flush(); } }
对比以上代码可以看出,不管是字节流还是字符流,都是以最简单的方法read(),writer().为基础,可以写单个字节(字符),可以读单个字符(字节)。同样也可以读(写)字符(字节)数组。(使用流后要记得关闭)
5.用字符流实现简单的文本复制
package ZIFU; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class FileCopy { public static void main(String[] args) throws IOException { //用字符流实现文本的复制 FileReader fr=new FileReader("F:\\a.txt"); FileWriter fw=new FileWriter("F:\\1.txt"); int len=0; while((len=fr.read())!=-1) { fw.write(len); fw.flush(); } fr.close(); fw.close(); } }
6.字节流实现复制功能
package ZIJIE; import java.io.FileInputStream; import java.io.IOException; public class Copy_1 { public static void main(String[] args) { //用字节数组复制大文件 FileInputStream fis=null; java.io.FileOutputStream fos=null; try { fis=new FileInputStream("文件"); fos=new java.io.FileOutputStream("文件名"); byte []data=new byte[1024]; int len=0; while((len=fis.read(data))!=-1) { fos.write(data); } } catch(IOException ex) { } } }
字符流其实不仅仅可以实现文本文件的复制,还可以实现压缩文件,图片等文件的复制,具体实现方式就不一一列出,步骤和文本文件的复制差不多
7.缓冲流:简单来说,缓冲流能进一步提高数据的传输速度,其中提供的readline()方法,如果该方法的返回值为null时,就说明到达了文件末尾
package Buffered; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; //使用缓冲流能进一步提高数据传输效率 public class BufferedInputStreamDemon { public static void main(String[] args)throws IOException { FileInputStream fis=new FileInputStream("F:\\gbk.txt"); BufferedInputStream bis=new BufferedInputStream(fis);//缓冲流 byte bytes[]=new byte[1024]; int len=0; len=bis.read(bytes); System.out.println(new String(bytes, 0, len)); bis.close(); } }
package Buffered; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.IOException; //特有功能:String readline()读取文本行 如果为空则会返回null public class BufferedReaderDemon { public static void main(String[] args)throws IOException { BufferedReader br=new BufferedReader(new FileReader("F:\\buffer.txt")); String s=null; int num=0; while((s=br.readLine())!=null) { num++; System.out.println("第"+num+"行:"+s); } br.close(); } }
还有很多东西没学,目前正在一步一步探索中,以后各种博客会坚持更新,和广大编程爱好者共同进步。