IO、NIO
Java NIO和IO之間第一個最大的區(qū)別是驴剔,IO是面向流的省古,NIO是面向緩沖區(qū)的。 Java IO面向流意味著每次從流中讀一個或多個字節(jié)丧失,直至讀取所有字節(jié)豺妓,它們沒有被緩存在任何地方。此外布讹,它不能前后移動流中的數(shù)據(jù)琳拭。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將它緩存到一個緩沖區(qū)描验。 Java NIO的緩沖導向方法略有不同白嘁。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動挠乳。這就增加了處理過程中的靈活性权薯。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)睡扬。而且,需確保當更多的數(shù)據(jù)讀入緩沖區(qū)時黍析,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)卖怜。
IO流包括字節(jié)流和字符流:
字節(jié)流:對應抽象類為InputStream(輸入流)和 OutputStream(輸出流)。 FileInputStream阐枣、FileOutputStream
字符流:對應抽象類為Reader(輸入流)和Writer(輸出流)马靠。BufferedReader、InputStreamReader蔼两、 StringReader
IO
裝飾器模式
磁盤操作
- File
保存文件的基本信息甩鳄,文件路徑等,不保存文件內(nèi)容
字節(jié)操作
- InputStream
子類裝飾器提供額外的功能:FileInputStream,StringBufferInputStream,ByteArrayInputStream,FilterInputStream(PushbackInputStream,BufferedInputStream,DataInputStream,LineNumberInputStream)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("path")))
byte[] buf = new byte[20 * 1024];
int bytes = 0;
while((bytes = in.read(buf, 0, buf.length)) != -1){
}
-
OutputStream
bytes
字符操作
一般情況下操作的都是字符流
- Reader
inputStreamReader支持從文本文件的字節(jié)流轉(zhuǎn)換為字符流-解碼
byte[] bytes = str.getBytes(encoding);//編碼
String str = new String(bytes, encoding);//解碼
- Writer
outputSreamWriter支持字符流編碼轉(zhuǎn)換為文本文件字節(jié)流-編碼
對象操作
- Serializable
序列化额划,對象需要實現(xiàn)serializable接口妙啃,transiend修飾的變量不進行序列化
ObjectOutputStream.writObject()//序列化
ObjectInputStream.readObject()//反序列化
網(wǎng)絡操作
- Socket
NIO
高速的面向塊的IO
一次處理數(shù)據(jù)塊,比按流處理要快俊戳,但是面向塊的IO缺少一些面向流IO所具有的優(yōu)雅性和簡單性
- 通道
通道Channel是對原IO包中的流的模擬揖赴,可以通過他讀取和寫入數(shù)據(jù)。
通道與流的區(qū)別是抑胎,流操作都是單向的如InputStream/OutputStream燥滑,而通道是雙向的,一個Channel就可完成讀寫兩個操作
- FileChannel 從文件中讀寫數(shù)據(jù)
- DatagramChannel 通過UDP讀寫網(wǎng)絡數(shù)據(jù)
- SocketChannel 通過TCP讀寫網(wǎng)絡數(shù)據(jù)
- ServerSocketChannel 監(jiān)聽新進來的TCP鏈接阿逃,對每一個新的連接都會創(chuàng)建一個SocketChannel
- 緩沖區(qū)
通道在讀寫數(shù)據(jù)之前铭拧,都需要將目標對象放入到緩沖區(qū)中赃蛛,緩沖區(qū)實質(zhì)是一個數(shù)組,提供了對數(shù)據(jù)的結(jié)構(gòu)化訪問搀菩,還可以跟蹤系統(tǒng)的讀寫進程
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer