Java I/O流-总结(InputStream,OutputStream,Reader,Writer) (一)

2014-11-24 08:16:56 · 作者: · 浏览: 2
一、 流的分类

按数据流动方向

– 输入流:只能从中读取字节数据,而不能向其写出数据

– 输出流:只能向其写入字节数据,而不能从中读取数据

按照流所处理的数据类型

– 字节流:用于处理字节数据。

– 字符流:用于处理Unicode字符数据。

按照流所处理的源

– 节点流:从/向一个特定的IO设备读/写数据的流。(低级流)

– 处理流:对已存在的流进行连接和封装的流。(高级流)

二、 缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓

冲的功能,提高了读写的效率,同时增加了一些新的方法。

J2SDK提供了四种缓存流:

–BufferedReader

–BufferedWriter

–BufferedInputStream s

–BufferedOutputStream





缓冲输入流支持其父类的mark()和reset()方法:

–mark()用于“标记”当前位置,就像加入了一个书签,可以使用reset()方法返回这个标记重新读取数据。

BufferedReader提供了readLine()方法用于读取一行字符串(以\r或\n分隔)。

BufferedWriter提供了newLine()用于写入一个行分隔符。

对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出。

三、 类层次

3.1、InputStream类层次


\

3.2、OutputStream类层次

\

3.3、Reader类层次

\

3.4、Writer类层次

\

四、 常用的字符流与字节流的转化

\


说明:

1. 字节流用于读写诸如图像数据之类的原始字节流。

2. 字符流用于读写诸如文件数据之类的字符流。

3. 低级流能和外设交流。

4. 高级流能提高效率。

5. InputStreamReader 是字节流通向字符流的桥梁。

6. OutputStreamWriter是字符流通向字节流的桥梁。







五、 代码实例

5.1、常用读文件:

/**

*以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。

*@paramfileName:文件的名

*/

publicstaticvoid readFileByBytes(String fileName) {

File file= new File(fileName);

InputStream in = null;

try {

logger.debug("以字节为单位读取文件内容,一次读多个字节:");

/*一次读多个字节*/

byte[] tempbytes =newbyte[100];

int byteread = 0;

in = new FileInputStream(file);

/*读入多个字节到字节数组中,byteread为一次读入的字节数*/

while ((byteread = in.read(tempbytes)) != -1) {

logger.debug(tempbytes);

logger.debug(0);

logger.debug(byteread);

}

} catch (Exception e1) {

logger.error("读取文本文件异常",e1);

} finally {

if (in !=null) {

try {

in.close();

} catch (IOException e1) {

logger.error("读取文本文件异常",e1);

}

}

}

}



















/**

*以字符为单位读取文件,常用于读文本,数字等类型的文件

*@paramfileName:文件名

*/

public staticvoid readFileByChars(StringfileName) {

Reader reader = null;

try {

logger.debug("以字符为单位读取文件内容,一次读多个字节:");

/*一次读多个字符*/

char[] tempchars =newchar[100];

int charread = 0;

if(fileName!=null&&!"".equals(fileName)){

reader = new InputStreamReader(new FileInputStream(fileName));

/*读入多个字符到字符数组中,charread为一次读取字符数*/

while ((charread = reader.read(tempchars)) != -1) {

/*对于 windows下,rn这两个字符在一起时,表示一个换行。*/

/*但如果这两个字符分开显示时,会换两次行。*/

/*因此,屏蔽掉r,或者屏蔽n。否则,将会多出很多空行。*/

if ((charread == tempchars.length)

&& (tempchars[tempchars.length - 1] !='r')) {

logger.debug(tempchars);

} else {

for (int i = 0; i < charread; i++) {

if (tempchars[i] =='r') {

continue;

} else {