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
|
|