配色: 字号:
java流
2012-08-25 | 阅:  转:  |  分享 
  
Java流(上)

目标

理解流的概念

掌握Java基本I/O流的用法

区分字节流/字符流/节点流/处理流

掌握RandomAccessFile的用法

了解利用流对Zip格式文件的压缩/解压

I/O流概述

流是数据输入输出的通道

流中的数据是有序的

流的分类

按数据流动方向

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

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

按照流所处理的数据类型

字节流:用于处理字节数据。图画的传输

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

按照流所处理的源

节点流:从/向一个特定的IO设备读/写数据的流

处理流:对已存在的流进行连接和封装的流

InputStream/OutputStream

InputStream/OutputStream处理字节数据

InputStream/OutputStream是抽象类

所有字节处理流都由InputStream/OutputStream



InputStream基本方法

三个基本的read方法:

intread():读取一个字节,并将它返回。

intread(byte[]buffer):将数据读入一个字节数组,同时返回读取的字节数。

intread(byte[]buffer,intoffset,intlength):将数据读入一个字节数组,放到数组的offset指定的位置开始,并用length来指定读取的最大字节数。

其它方法:

voidclose():关闭流。

intavailable():返回可以从中读取的字节数。

longskip(longn):在输入流中跳过n个字节,将实际跳过的字节数返回。

booleanmarkSupported():判断流是否支持标记功能。

voidmark(intreadlimit):在支持标记的输入流的当前位置设置一个标记。

voidreset():返回到流的上一个标记。注意必须流支持标记功能。

常见InputStream类

低级InputStream类:

InputStream

ByteArrayInputStream

PipedInputStream

FileInputStream

高级InputStream类:

DataInputStream

BufferedInputStream

InputStream类层次

InputStream示例

……

try

{

fis=newFileInputStream(args[0]);

//从文件读取数据

while((n=fis.read(buff))!=-1)

{

//写入System.out中

System.out.write(buff,0,n);

}

}

catch(FileNotFoundExceptione)

{

System.out.println("没有找到文件");

System.exit(1);

} ……

OutputStream基本方法

三个基本的write方法:

voidwrite(intc)

voidwrite(byte[]buffer)

voidwrite(byte[]buffer,intoffset,intlength)

其它方法

voidclose()

voidflush()

OutputStream类

低级OutputStream

OutputStream

ByteArrayOutputStream

PipedOutputStream

高级OutputStream

DataOutputStream

BufferedOutputStream

OutputStream类层次

OutputStream示例

FileOutputStreamout;

//声明一个PrintStream流

PrintStreamp;



try{

out=newFileOutputStream("myfile.txt");

p=newPrintStream(out);

p.println("面朝大海,春暖花开");

p.close();

}catch(Exceptione){

System.err.println("Errorwritingtofile");

}

Stream拷贝文本文件示例

mportjava.io.;

publicclassCopyFile{

publicbooleancopyFile(Stringsrc,Stringdes){

FilesrcFile,desFile;

srcFile=newFile(src);

desFile=newFile(des);

FileInputStreamfis=null;

FileOutputStreamfos=null;

try{

desFile.createNewFile();

fis=newFileInputStream(srcFile);

fos=newFileOutputStream(desFile);

intbyteread;

byte[]buf=newbyte[41024];

while((byteread=fis.read(buf))!=-1){

fos.write(buf,0,byteread);

}

Reader/Writer

Reader/Writer处理的是字符类型的数据。它处理流的方式是以字符为单位进行的。

Reader/Writer和InputStream/OutputStream一样,也分为节点流(低级流)和处理流(高级流)。

Reader和InputStream一样,用于从流中读取数据。它和InputStream的区别在于,InputStream以字节为单位操作流,而Reader以字符为单位操作流。

Reader常用方法

读取方法:

intread():用于从流中读出一个字符,并将它返回。

intread(char[]buffer):将从流中读出的字符放到字符数组buffer中,返回读出的字符数。

intread(char[]buffer,intoffset,intlength):将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符。

其他方法:

voidclose():关闭Reader流。

booleanready():判断流是否已经准备好被读取。

skip(longn):跳过指定的n个字符。

booleanmarkSupported():和InputStream中的markSupported方法类似。

voidmark(intreadAheadLimit):和InputStream中的mark方法类似。

voidreset():和InputStream中的reset方法类似。

Reader相关类

低级Reader类:

CharArrayReader

StringReader

PipedReader

FileReader

高级Reader类

BufferedReader

InputStreamReader

LineNumberReader

Reader类层次

Reader例子

FileReaderfr=newFileReader("C:/nos/tmp/mydata.txt");

BufferedReaderbr=newBufferedReader(fr);

Stringrecord=newString();

while((record=br.readLine())!=null){

recCount++;

System.out.println("Line"+recCount

+":"+record);

}

Writer常用方法

写入方法:

voidwrite(intc):将参数c的低16位组成字符写入到流中。

voidwrite(char[]buffer):将字符数组buffer中的字符写入到流中。

voidwrite(char[]buffer,intoffset,intlength):将字符数组buffer中从offset开始的length个字符写入到流中。

voidwrite(Stringstring):将string字符串写入到流中。

voidwrite(Stringstring,intoffset,intlength):将字符string中从offset开始的length个字符写入到流中。

其他方法:

voidclose():和OutputStream的close方法类似。

voidflush():刷新此输出流并释放与此流有关是所有资源

Writer相关类

低级Writer类:

CharArrayWriter

StringWriter

PipedWriter

FileWriter

高级Writer类:

BufferedWriter

OutputStreamWriter

PrintWriter

Writer类层次

Writer例子

try{

FileWriterfw=newFileWriter("mydata.txt");

PrintWriterout=newPrintWriter(fw);

out.print("面朝大海,春暖花开!");

out.close();

fw.close();

}catch(IOExceptione){

e.printStackTrace();

}

缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。

J2SDK提供了四种缓存流:

BufferedReader

BufferedWriter

BufferedInputStream

BufferedOutputStream

缓冲流(con.)

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

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

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

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

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

流的几种典型流向

A-file((bytes)FileInputStream((bytes)DataInputStream((String)

A-File((bytes)FileInputStream((bytes)BufferedInputStream((bytes)DataInputStream((ints,floats,Strings,others)

(bytes)((bytes)FileReader((chars/Strings)LineNumberReader((chars/strings)

RandomAccessFile

RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据

RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件

构造器:

RandomAccessFile(java.io.Filef,Stringmode)

RandomAccessFile(Stringfile,Stringmode)

RandomAccessFile示例

RandomAccessFilerf1=newRandomAccessFile("c:\\toAppend.txt","rw");

rf1.seek(rf1.length());

rf1.writeBytes(toCn+"\n");

rf1.close();

利用流压缩文件

相关类在java.util包中

提供对以下三种格式的文件处理

Zip:广泛应用于Windows平台的一种压缩方式

Gzip:主要在Unix/Linux/BSD等类Unix平台上使用的一种文件压缩方式。

Jar:JavaArchives,主要用于java类文件的打包和压缩。

zip格式的压缩

与zip压缩相关的java类:

ZipEntry

ZipOutputStream

zip格式的文件进行解压

和zip文件解压相关的类:

ZipInputStream

ZipEntry

ZipFile



献花(0)
+1
(本文系课外读首藏)