对程序语言的设计者来说,创建一个好的输入/输出系统是一项艰难的任务。
1。File类实际是filepath,它即能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。
用list(FilenameFilter)方法,获得此File对象包含的全部列表。FilenameFilter接口,重载accept方法
提供文件名过滤功能。
2。File类不仅仅只代表存在的文件或者目录,还可用用File对象创建新的目录或者尚不存在的这个目录路径,
查看文件的属性,检查某个File对象代表的文件还是目录,删除文件。
3。I/O类库中使用"流",它代表任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象。I/O
分为输入流和输出流,输入流基类InputStream或者Reader,输出流基类OutputStream或者Writer。其中
InputStream,OutputStream是java 1.0的产物,面向字节的。Reader,Writer 是java1.1 I/O修改,它们
提供Unicode与面向字符的I/O功能。
4。InputStream用来表示从不同数据源产生输入的类。这些数据源包括:
1)字节数组 ByteArrayInputStream,允许将内存的缓冲区当InputStream.
2)String对象。StringBufferInputStream.
3)文件。 FileInputStream。
4)管道。PipedIputStream
5)其他流组成的序列。
6)其他数据源,如Internet连接等。
FilterInputStream是InputStream的修饰器。
5。OutputStream子类有:ByteArrayOutputStream,FileOutputStream,PipedOutputStream
,FilterOutputStream(OutputStream的修饰器)
6。java的I/O流以一种"套接"的方式组合使用。数据源用InpuStream,和OutPutStream表示,数据源的
读写是有FilterInputStream和FilterOutputStream完成。
7。FilterInputStream有:DataInputStream,BufferedInputStream,LineNumberInputStream,
PushbackInputStream.
FilterOutputStream有:DataOutputStream,PrintStream,BufferedOutputStream.
8。Reader,Writer是java1.1改革平,对应InputStream,OutputStream,FilterInputStream,
FilterOutPutStream..Reader,Writer有相应的类。参考JDK手册。其中没有改变的类是:
DataOutputStream,File,RandomAccessFile,SequenceInputStream.
RandomAccessFile不是InputStream或者OutputStream继承体系的一部分,它是独立的。
9。java标准I/O,System.out , System.in , System.err. System类提供了一些简单的静态方法,
以允许对标准输入,输出,错误进行重定向:
setIn(InputStream) , setOut(PrintStream) , setErr(PrintStream);
10。JDK1.4的java.nio.*引入了新的java I/O类,其目的在于提高速度,旧的I/O也使用nio重新设计过。
基本方式:通道和缓冲器。 唯一与通道交互的缓冲器是ByteBuffer。
旧I/O类库中有三个类被修改了,用以产生FileChannel,他们是:FileInputStream,FileOutputstream
RandomAccessFile。Reader和Writer这种字符模式类不能用来产生通道,但是java.noi.channels.
Channels类提供了实用方法,用一通道中产生Reader和Writer.
11。一段实例代码:
.....
FileChannel fc = new FileOutputStream("filename.extend").getChannel();
fc.wirte(ByteBuffer.wrap("some text ".getBytes() ) );
fc.close();
fc = new RandomAccessFile("data.txt","rw').getChannel();
fc.position( fc.size() );
fc.wirte(ByteBuffer.wrap("some text ".getBytes() ) );
fc.close();
fc = new FileInputStream("data.txt").getChannel();
Bytebuffer buff = ByteBuffer.allocate(BSIZE);
fc.read(buff);
buff.flip();
while(buff.hasRemaining()){
System.out.print( (char)buff.get() );
}
12。transferTo() , transferFrom()允许将一个通道和另一个通道直接相接。
13。ByetBuffer.asCharBuffer 使其作为CharBuffer(提供良好的toString方法)。但是:缓冲器容纳
的是普通的字节,为了他他们转换为字符,要么在输入的时候对其编码,要么在从缓冲器输出
时对他们进行解码。使用java.nio.charset.Charsetl类实现。
14。从ByteBuffer获得基本类型如:
bb.asCharBuffer().put("some text");
bb.getChar();
bb.asShortBuffer().put(9458);
bb.getShort();
...............
各种基本类型的包装,可以看成是ByteBuffer的"视图缓冲器";
ByteBuffer bb = ByteBuffer.allocate(SIZE);
IntBuffer ib = bb.asIntBuffer() ; IntBuffer 是"视图缓冲器",等等。
15。不同机器可能会使用不同的字节排序方法存储数据。分为"big endian"和"little endian".网上常常使用
big endian 。java的设定方法 bb.order(ByteOrder.BIG_ENDIAN) ,
或者ByteOrder.LITTLE_ENDIAN
16。Buffer由数据和可以高效访问及操作这些数据的四个索引组成:mark , position, limit ,capacity.
17。存储器映射文件允许创建和修改太大不能放在内存的文件。
MappedByteBuffer out = new RandomAccessFile("t.txt'."wr").getChannel().
map(FileChannel.MapMode.READ_WRITE,0,length);
18。JDK1.4引入了文件加锁机制。对映射文件部分加锁。
FileOutputStream fos = new FileOutputStream("file.txt");
FileLock fl = fos.getChannel().tryLock();
if ( f1 !=null )
{
......
f1.release();
}
fos.close();
19。java I/O提供压缩功能。他们不是从Reader或者Writer派生,而是属于InputStream,OutputStream
继承体系的一部分。这些类是:CheckedOutputStream,DeflaterOutputStream
ZipOutputStream ,GZipOutputStream和对应的InputStream..
20。java的对象序列化将那些实现了Serializable接口的对象转化成字节序列,并能在以后恢复原来的类。
需要更严格的持久性机制可以考虑使用JDO或者想Hibernate之类的工具http://hibernate.sourceforge.net
transient关键字,使某个特定子对象不想让JAVA的序列化机制自动保存和恢复。
21。JDK1.4引入了正则表达式。增强字符串处理能力,可以替代StringTokenizer。
基本类是:模式,Pattern ;匹配器,Matcher。
更多<<Mastering Reular Expressions>>