對程式語言的設計者來說,建立一個好的輸入/輸出系統是一項艱難的任務。
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引入了Regex。增強字串處理能力,可以替代StringTokenizer。
基本類是:模式,Pattern ;匹配器,Matcher。
更多<<Mastering Reular Expressions>>