1.輸入輸出#
由InputStream、OutputStream組成,其中FilterInputStream、FilterOutputStream分別為裝飾器類的基類。
JDK1.1之后通過適配器模式將InputStream和OutputStream轉換成了Reader和Writer。但功能不同前者面向字節(jié)流,后者面向字符流以方便提供unicode編碼字符讀取方式。適配器類為InputStreamReader和OutputStreamWriter。這兩者可以將InputStream、OutputStream子類轉換成Reader和Writer。
2.常用的使用方式#
3.標準輸入輸出#
System.in是一個InputStream可以被包裝。System.out是一個PrintStream,而PrintStream是一個OutputStream,其已經被包裝過。System.err同System.out。
PrintStream console = System.out;//可以簡化輸出
4.nio#
nio通過使用更接近操作系統執(zhí)行I/O的方式:通道和緩沖器。來提高IO速度,舊的IO也被重寫通過新IO的方式但是效率仍慢于NIO。
唯一直接與通道交互的緩沖器是ByteBuffer。
舊的IO中三個類被修改泳衣產生FileChannel(通道),分別是FileInputStream、FileOutputStream、RandomAccessFile。
FileChannel fc = new FileInputStream(filepath).getChannel();
ByteBuffer buff = ByteBuffer.allocate(Size);
fc.read(buff);
buff.flip();//傳入緩沖器后通過flip()方法通知可以被讀取。
FileChannel fc = new FileOuputputStream(filepath).getChannel();
fc.write(ByteBuffer.wrap("Something ".getBytes()));//通過wrap方法包裝byte數組
buffer.clear();//寫入完成后要清空流
轉換數據###
ByteBuffer buff = ByteBuffer.allocate(Size);
buff.asShortBuffer().put((Short)123456);
buff.asCharBuffer().put("abcff");
//通過asShortBuffer()、asCharBuffer()可以轉換成基本類型的視圖
LongBuffer lb = buff.asLongBuffer();
lb.get();//一次從緩沖區(qū)中取出多個字節(jié)
緩沖區(qū)細節(jié)###
ByteBuffer buff = ByteBuffer.allocate(Size);
buff.position();//緩沖器當前指針位置
buff.limit();//緩沖器容量
buff.flip();//將limit設置為position,position設置為0,為讀取緩沖區(qū)做準備
buff.mark();//將mark設置為position
buff.clear();//將position設為0,limit設置為容量
buff.hasRemaining();//是否還有元素介于position和limit之間
buff.remaining();//limit-position
buff.rewind();//將position設置為0
buff.reset();//將position設置為mark
內存映射文件###
如文件無法一次性讀入內存,MappedByteBuffer提供了一種方法,像操作全部文件內容被讀入內存一樣的方式去讀寫文件。
MappedByteBuffer out = new FileOutputStream(filepath).getChannel().map(FileChannel.MapMode.REAT_WRITE, 0 , length);
out.put("abdc".getBytes());