IO流概览

来源:互联网 发布:保利集团 知乎 编辑:程序博客网 时间:2024/05/20 14:26

使用流后,一定要记得关闭,不然会一直保持内存与某个文件的通话。举个栗子,如果你向某个文件里传了数据后没close(),则你想删除这个文件,那么系统会提示你该文件正被某个程序使用而无法删除。
1. IO流模型

本来是有一张图片描述的,因为该博客相对来说十分不完美,用户体验也一般般,只能写两句文字代替了:

输入流:由硬盘或是其他存储的数据向电脑内存发送产生的数据流。输出流:由电脑内存向硬盘等其他地方发送数据产生的流。

所以IO流的里的输入输出是针对内存来说的。

InputStream和Reader的移动记录指针的方法:

void mark(int readAheadLimit): //在记录指针当前位置记下一个标记(mark)。void reset(): //将此输入流的记录指针重新定位到上一次记录标记(mark)的位置。long skip(long n): //记录指针向前移动n个字节/字符boolean markSupported(): //判断此输入流是否支持mark()操作,即是否技持记录标记。

2.节点流: 可以向一个特定的设备(硬盘、网络)读/写数据的流。都以物理IO节点为构造器参数。

常见节点流:
文 件: FileInputStream FileOutputStrean FileReader FileWriter
数 组: ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
字符串:StringReader StringWriter
管 道:PipedInputStream PipedOutputStream PipedReader PipedWriter


3.处理流:对已经存在的流(节点流)进行连接或封装后再实现读写。 使用处理流的好处是,使用同一处理流,可访问不同节点流。以存在的流为构造器参数。关闭处理流时,被包装的节点流自动关闭。

常见处理流:
缓冲流:BufferedInputStream、BufferedOutputStream,BufferedReader BufferedWriter
转换流:InputStreamReader OutputStreamWriter
数据流:DataInputStream DataOutputStream
推回输入流:PushbackInputStream,PushbackReader
其他:PrintStream


4.字节流: 操作的数据单元是8位字节,以InputStreamt、OutputStream作为基类。


5 字符流:操作的数据单元是16位的字符,以Reader、Writer为基类。


6.输入流的方法:

 int read(): //读取单个字节或字符,返回读取的字节(字符)数据,该数据可直接转为int型。read()方法读取GBK方式保存文件时,由于中文是两个字节组成的, 而read()每次只读了一个字节,所以会出现乱码问题。 int read(byte[] b): //读取b.length个字节,存在字节数组b中。返回的是读取的字节个数,读到末尾返回-1。 int read(char[] c): //与上面用法一样,区别只是上面的方法读的是字节,而它读的字符。

7 输出流的方法:

 void write(int c)://将字节/字符c输出到输出流中。 void write(byte[]/char[] buff)://将字节/字符缓冲数组中的数据输出到输出流中。  由于Writer类以字符为操作单位,所以它还有自己的方法: void write(String str)://将字符串直接输出到输出流中。 void write(String str,int off ,int length)://将字符串str从off开始输出length个字符到输出流中。

8.与JDBC编程一样,程序打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显示关闭。

Java7改写了所有IO资源,都实现了AutoCloseable接口,因此都可自动关闭资源的try语句来关闭IO流。如:

try(FileReader reader = new FileReader("test.java"););//即在try()里的IO流都会自动关闭。

9.转换流:将字节流转为字符流。InputStreamReader、OutputStreamReader,如:

InputStreamReader reader = new InputStreamReader(System.in);//标准输入(System.in)即键盘输入是InputStream的实例,所以是字节流。

只有将字节流转为字符流的转换流,因为操作字符流更方便。


10.推回输入流:PushbackReader、PushbackInputStream

void unread(int c)://将字节/字符c推回到缓冲区里,从而允许缓冲区重复读c。void unread(byte[] /char[] buff): //将buff数组推回到缓冲区里,从而允许缓冲区重复读取该数组。void unread(byte[] /char[] ,int off,int len)://将字节/字符数组的数据从off开始推回len个到缓冲区里,从而可从缓冲区重复读。
推回输入流的三个read方法,与对应的InputStream 和 Reader的一样。

例:

PushbackReader back = new PushbackReader(new FileReader("test.java"),99);//创建缓冲区长度为99的 PushbackReader对象char[] buff = new char[32];//创建存储读取数据的容器String content = new String(buff,0,back.read(buff));//读一次数据存在buff里,并转为 Stringback.unread(content.toCharArray());//将刚刚读的内容转为char数组后推回back缓冲区输入流中 String content2 = new String(buff,0,back.read(buff));//再次从back的缓冲区里读取

11.重定向标准输入输出:

System.out和System.in在默认情况下分别代表输出到显示器上(控制台)和键盘输入。
System类提供了以下三个重定向的静态方法 :

static void setErr(PrintStream ps):// 重定错误输出流。static void setOut(PrintStream ps): //System.out.println("内容");将把内容改输出到ps流里了。static void setIn(InputStream in):// System.in将从in里获取内容了,而不是键盘输入。

12.java.io包下还有以下可能会用到的字节点:

AudioInputStream、CiperInputSteam、DeflaterInputStream、ZipInputStream等具有访问音频文件、加密、压缩、解压功能的字节流。

1 0
原创粉丝点击