Java.io小结:
1. 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似
输入流:
2. 以字节为单位(InputStream类型)Stream Hierachy:
InputStream
|
FileInputStream |
FilterInputStream
|
ByteArrayInputStream
|
ObjectInputStream |
PipedInputStream |
DataInputStream |
PushbackInputStream
|
BufferedInputStream |
SequenceInputStream
|
StringBufferInputStream |
LineNumberInputStream |
抽象类InputStream继承而来(输入流)
1) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
FileInputStream
(File file)
:通过文件对象创建
FileInputStream
FileInputStream
(FileDescriptor fdObj)
:
通过文件描述创建FileInputStream
FileInputStream
(String name)
:指定文件系统路径名创建
FileInputStream
2) PipedInputStream:实现了pipe的概念,一端写入一端读取
PipedInputStream
(PipedOutputStream src)
创建 PipedInputStream
,以使其连接到传送输出流 src
。
PipedInputStream
()
创建尚未连接的 PipedInputStream
。
3) ByteArrayInputStream:允许将内存缓冲区数据当做(转换为)输入流。
ByteArrayInputStream
(byte[]buf)
创建一个ByteArrayInputStream
,使用buf
作为其缓冲区数组,把内存字节数组转换成字节流。
ByteArrayInputStream
(byte[] buf, int offset, int length)
4) ObjectInputStream:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化,实现持久化存储。ObjectInputputStream实现了接口DataInput(基本类型数据)和ObjectInput( 对象、数组以及String对象输入)。
ObjectInputStream
(InputStream in)
创建从指InputStream读取的ObjectInputStream。
5) StringBufferInputStream:把一个String对象作为输入创建InputStream
StringBufferInputStream
(String s)
已过时。创建一个字符串输入流,以从指定字符串
读取数据
6) SequenceInputStream:把多个InputStream合并为一个InputStream
SequenceInputStream
(Enumeration<? extends InputStream> e)
通过记住该参数初始化新创建的 SequenceInputStream
,该参数必须是生成运行时类型为 InputStream
对象的 Enumeration
型参数。
SequenceInputStream
(InputStream s1, InputStream s2)
通过记住这两个参数初始化新创建的 SequenceInputStream
(将按顺序读取这两个参数,先读取 s1
然后读取 s2
),以提供从此 SequenceInputStream
读取的字节。
7) FilterInputStream:用来提供装饰器类接口可以控制输入流的类,过滤器类内部修改InputStream确定是否缓冲、是否保留设置行数、是否吧单一字符推回输入流等等。
7.1)DataInputStream:允许我们从流中读取基本类型的数据以及String的对象。读取格式化数据,可以从DataInputStream字节流中读取基本类型数据。
DataInputStream
(InputStreamin)
使用指定InputStream 创建一个 DataInputStream。
7.2)BufferedInputStream:提供缓冲区读取数据,可以提高效率。
BufferedInputStream
(InputStream in)
创建 BufferedInputStream
并保存其参数,即输入流 in
,以便将来使用。
BufferedInputStream
(InputStream in
,int size)
7.3)LineNumberInputStream:可以跟踪流中的行号,读取和设置行号。getLineNumber()、setLineNumber(int)
LineNumberInputStream
(InputStream in)
已过时。 构造从指定输入流读取其输入的新行号输入流
7.4)PushbackInputStream:可以读到最后一个字节回退。
PushbackInputStream
(InputStream in)
创建 PushbackInputStream
并保存其参数输入流 in
,以便将来使用
抽象类OutputStream继承而来(输出流)
OutputStream
|
FileOutputStream FileOutputStream
|
FilterOutputStream
|
ByteArrayOutputStream |
ObjectOutputStream |
PipedOutputStream |
DataOutputStream |
BufferedOutputStream
|
PrintStream |
1) FileOutputStream:将信息写入指定的文件。
FileOutputStream
(Filefile)
创建一个向指定File
对象所表示的文件写入数据的输出流。
FileOutputStream
(FileDescriptor fdObj)
创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream
(File file, boolean append)
创建一个向指定 File
对象表示的文件中写入数据的文件输出流。Append
为True写入文件末尾,false写入文件开始。
FileOutputStream
(String name)
创建一个向具有指定名称文件中写入数据的输出文件流。
FileOutputStream
(String name, boolean append)
创建一个向具有指定 name
的文件中写入数据的输出文件流,Append
为True写入文件末尾,false写入文件开始。
2) ByteArrayOutputStream:在内存创建缓冲区,并且把送往流的数据放置在此缓冲区。
ByteArrayOutputStream
()
创建一个新的字节数组输出流。
ByteArrayOutputStream
(int size)
创建一个新的字节数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
3) ObjectOutputStream: 将 Java 对象的基本数据类型和图形序列化完成后,写入到OutputStream.
ObjectOutputStream
()
为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
ObjectOutputStream
(OutputStreamout)
创建写入指定OutputStream的 ObjectOutputStream
4) PipedOutputStream:传送输出流可以连接到传送输入流,以创建通信管道。
PipedOutputStream
(PipedInputStream snk)
创建连接到指定传送输入流的传送输出流。
PipedOutputStream
()
创建尚未连接到传送输入流的传送输出流
5) FilterOutputStream:用来提供装饰器类接口可以控制输入流的类
5.1)DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
DataOutputStream
(OutputStream out)
创建一个新的数据输出流,将基本类型数据写入指定基础输出流。
5.2)BufferedOutputStream::提供缓冲区缓存输出流,可以提高效率。
BufferedOutputStream
(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
BufferedOutputStream
(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
5.3)PrintStream:用于产生格式化输出。其中DataOutputStream处理数据的存储(存入输出流中,方便DataInputStream进行读取),PrintStream处理显示。PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式
PrintStream
(File file)
创建具有指定文件且不带自动行刷新的新打印流。
PrintStream
(File file, String csn)
创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
PrintStream
(OutputStream out)
创建新的打印流。
PrintStream
(OutputStream out, boolean autoFlush)
创建新的打印流。
PrintStream
(OutputStreamout,booleanFlush,Stringencoding)
创建新的打印流。
PrintStream
(String fileName)
创建具有指定文件名称且不带自动行刷新的新打印流。
PrintStream
(String fileName, String csn)
创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
3. 以字符为单位
4. 扩展自Reader
Reader
|
FilterReader |
InputStreamReader |
BufferedReader |
StringReader |
PipedReader |
FileReader
|
CharArrayReader
|
PushbackReader |
1)FilterReader:对应于FilterStream
1.1) PushbackReader:对应于PushbackStream。允许回退一个字符。
2)InputStreamReader:字节流向字符流转换的桥梁
InputStreamReader
(InputStreamin)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader
(InputStream in, java.nio.charset.Charset cs)
创建使用给定字符集的 InputStreamReader。
InputStreamReader
(InputStreamin, java.nio.charset.CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader
(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
2.1)FileReader:与FileInputstream对应。用来读取字符文件的便捷类
3)BufferedReader:对应BufferedInputStream
3.1)LineNumberReader:与LineNumberInputStream对应。
4)PipedReader:对应PipedInputStream
5)CharArrayReader:对应ByteArrayInputStream
6)StringReader:其源为一个字符串的字符流,可以从内存读取字符流。
StringReader
(String s)
创建一个新字符串 reader。从字符串s读取。
扩展自Writer
Writer
|
FilterWriter |
OutputStreamWriter |
BufferedWriter |
StringWriter |
PipedWriter |
FileWriter |
CharArrayWriter
|
1)FilterWriter:只是一个占位符,BufferedWriter并不是继承自FilterWriter
2)OutputStreamWriter:OutputStreamWriter 是字符流通向字节流的桥梁。
OutputStreamWriter
(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter
(OutputStream out, java.nio.charset.Charset cs)
创建使用给定字符集的 OutputStreamWriter。
OutputStreamWriter
(OutputStream out,java.nio.charset.CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter
(OutputStream out, String charsetName)
创建使用指定字符
集的 OutputStreamWriter。
2.1)FileWriter:对应FileInputStream。
3)BufferedWriter:对应BufferedOutputStream
4)StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。向内存缓冲区写入字符串。
StringWriter
()
创建具有默认初始字符串缓冲区大小的新字符串 writer。
StringWriter
(int initialSize)
创建具有指定初始字符串缓冲区大小的新字符串 writer。
5)PipedWriter:对应PiledOutputStream
6)CharArrayWriter:对应ByteArrayOutputStream·
4. RandomAccessFile:类似组合了DataInputStream和DataOutputStream
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置
5.压缩解压缩包
Java.util.Zip
|
CheckInputStream |
CheckOutputStream
|
InflateInputStream |
DeflateOutputStream |
GZIPInputStream
|
GZIPOutputStream
|
ZIPInputStream
|
ZIPOutputStream
|
这些数据流是从InputStream和OutputStream继承而来,是字节流方式压缩。如果需要字符流可以通过(InputStreamReader和OutputStreamWriter转换)
1)CheckInputStream:需要维护所读取数据校验和的输入流。
CheckedInputStream
(InputStream in, Checksum cksum)
使用指定校验和创建输入流。
2)CheckOutputStream:需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性
CheckedOutputStream
(OutputStream out, Checksum cksum)
使用指定校验和创建输出流
3)InflateInputStream:此类为解压缩 "deflate" 压缩格式的数据实现流过滤器
InflaterInputStream
(InputStream in)
使用默认解压缩器和缓冲区大小创建一个新输入流。
InflaterInputStream
(InputStream in, Inflater inf)
创建一个带有指定解压缩器和默认缓冲区大小的新输入流。
InflaterInputStream
(InputStream in, Inflater inf, int size)
使用指定解压缩器和缓冲区大小创建一个新输入流
4)DeflateOutputStream此类为使用 "deflate" 压缩格式压缩数据实现输出流过滤器
DeflaterOutputStream
(OutputStream out)
使用默认压缩器和缓冲区大小创建一个新输出流。
DeflaterOutputStream
(OutputStream out, Deflater def)
使用指定压缩器和默认缓冲区大小创建一个新输出流
DeflaterOutputStream
(OutputStream out, Deflater def, int size)
使用指定压缩器和缓冲区大小创建一个新输出流。
5)GZIPInputStream:此类为读取 GZIP 文件格式的压缩数据实现流过滤器
GZIPInputStream
(InputStream in)
使用默认缓冲区大小创建新的输入流
GZIPInputStream
(InputStream in,int size)
使用指定缓冲区大小创建新的输入流。
6)GZIPOutputStream此类为使用 GZIP 文件格式写入压缩数据实现流过滤器。
GZIPOutputStream
(OutputStream out)
使用默认缓冲区大小创建新的输出流。
GZIPOutputStream
(OutputStreamout,int size)
使用指定缓冲区大小创建新输出流。
7)ZIPOutputStream此类为以 ZIP 文件格式写入文件实现输出流过滤器
ZipOutputStream
(OutputStream out)
创建新的 ZIP 输出流。
8)ZIPInputStream此类为读取 ZIP 文件格式的文件实现输入流过滤器
ZipInputStream
(InputStream in)
创建新的 ZIP 输入流。
注:1)Checksum校验和对象Adler32、CRC32
2)ZipFile:此类用于从 ZIP 文件读取条目。
ZipFile
(String name)
打开 ZIP 文件进行阅读。
ZipFile
(File file,int mode)
打开新ZipFile
以指定模式从指定 File
对象读取。
3)ZipEntry此类用于表示 ZIP 文件条目
ZipEntry
(ZipEntry e)
使用从指定 ZIP 条目获取的字段创建新的 ZIP 条目。
ZipEntry
(String name)
使用指定名称创建新的 ZIP 条目。
java 代码
import java.io.*; // System.in读入的是字节
BufferedInputStream bf = new BufferedInputStream( new FileInputStream(“F://nepalon// Data.txt”) try{ byte[] data =new byte[bf.available()]; bf . read(data); return data; }finally{bf.close();} //GZIP进行简单的压缩 BufferedReader in = new BufferedReader( new FileReader(“(args[0])”)); BufferedOutputStream out = new BufferedOutputStream( new GZIPOutputStream( new FileOutputStream("test.gz")));//压缩 System.out.println("Writing file"); int c; while((c = in.read()) != -1) out.write(c); in.close(); out.close(); System.out.println(" Reading file"); BufferedReader in2 = new BufferedReader( new InputStreamReader(new GZIPInputStream( new FileInputStream("test.gz"))));//解压缩读取 String s; while((s = in2.readLine()) != null) System.out.println(s); //ZIP文件保存 FileOutputStream f = new FileOutputStream("test.zip"); CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setComment("A test of Java Zipping"); // No corresponding getComment(), though. for(String arg : args) { print("Writing file " + arg); BufferedReader in = new BufferedReader(new FileReader(arg)); zos.putNextEntry(new ZipEntry(arg)); int c; while((c = in.read()) != -1) out.write(c); in.close(); out.flush(); } out.close(); // Checksum valid only after the file has been closed! print("Checksum: " + csum.getChecksum().getValue()); // Now extract the files: print(" Reading file"); FileInputStream fi = new FileInputStream("test.zip"); CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32()); ZipInputStream in2 = new ZipInputStream(csumi); BufferedInputStream bis = new BufferedInputStream(in2); ZipEntry ze; while((ze = in2.getNextEntry()) != null) { print(" Reading file " + ze); int x; while((x = bis.read()) != -1) System.out.write(x); } if(args.length == 1) print("Checksum: " + csumi.getChecksum().getValue()); bis.close(); // Alternative way to open and read Zip files: ZipFile zf = new ZipFile("test.zip"); Enumeration e = zf.entries(); while(e.hasMoreElements()) { ZipEntry ze2 = (ZipEntry)e.nextElement(); print("File: " + ze2); } |
|
|