大資料工程師:大資料的java基礎 第十週

藍色街燈_BlueLight發表於2016-04-05
1. Java的IO操作分為三大類
– 基於位元組流的操作
• 底層操作,因為不關注資訊的分段,只能對位元組進行處理,往往不適用於高階操作
– 基於字元流的操作
• 高階操作,基於字元,可劃分資訊段
– 基於NIO的操作
• 非阻塞式操作,效能最好
2. 位元組流
– 所有基於位元組流的類都派生自InputStream或者OutputStream
– 及時關閉流
– 注意位元組流是低層次的處理,必要時使用字元流
import java.io.*;
public class CopyBytes {
    public static void main(String[] args) throws IOException {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

不關閉,會造成資源洩漏,檔案控制程式碼之類的
3. 字元流
– 所有字元流派生自Reader或者Writer
– 基於行的操作
4. 快取流
– 快取流可以避免不斷的對磁碟進行讀寫操作,提高效能
– 記得flush快取流(確保快取的內容寫入)
– 有四種快取流:
• BufferedInputStream/BufferedOutputStream
• BufferedReader/BufferedWriter
– 分別對應的是處理位元組和字元的流,使用中需要注意

5. 資料流
– 資料流可以根據資料的型別進行操作
• 包括從booleandouble的所有基本型別
• 不能處理物件型別
• 資料流實現DataInputDataOutput介面
– 例子:
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile))); 
for (int i = 0; i < prices.length; i ++) {
    out.writeDouble(prices[i]);
    out.writeInt(units[i]);
    out.writeUTF(descs[i]);
}

6. 檔案操作
– java.nio.file.Path是檔案操作的主要支援類
• 可建立路徑物件——Paths.get
• 獲取路徑資訊——檢視Path相關API文件
• 刪除路徑中的冗餘資訊,如...
• 合併路徑——Path.resolve
– 流基本都是實現了Closable介面的,注意在使用完畢之後呼叫close方法,否則會出現資源
洩露
– 有些檔案操作在某些作業系統中是原子操作,因此需要注意在多程式或多執行緒下的檔案操作

 檢視檔案屬性(Files)
– Exists、 notExists、 isReadable、 isWritable、 isExecutable
 刪除檔案或目錄(Files)
– Delete、 deleteIfExists
 拷貝檔案(Files)
– copy
 移動檔案或目錄
– move

try() 寫法,自動關閉()內資源
 為什麼使用NIO
– 面向塊的操作,而不是流的操作
 什麼是緩衝區
– Buffer 是一個物件, 它包含一些要寫入或者剛讀出的資料。 在 NIO 中加入 Buffer 物件,體
現了新庫與原 I/O 的一個重要區別。在面向流的 I/O 中,您將資料直接寫入或者將資料直接
讀到 Stream 物件中。
– 在 NIO 庫中,所有資料都是用緩衝區處理的。在讀取資料時,它是直接讀到緩衝區中的。在
寫入資料時,它是寫入到緩衝區中的。任何時候訪問 NIO 中的資料,您都是將它放到緩衝區
中。
– 緩衝區實質上是一個陣列。通常它是一個位元組陣列,但是也可以使用其他種類的陣列。但是一
個緩衝區不 僅僅 是一個陣列。緩衝區提供了對資料的結構化訪問,而且還可以跟蹤系統的讀/
寫程式。

try (SeekableByteChannel sbc = Files.newByteChannel(file)) { 
ByteBuffer buf = ByteBuffer.allocate(10);
String encoding = System.getProperty("file.encoding");
while (sbc.read(buf) > 0) {
buf.rewind(); 
System.out.print(Charset.forName(encoding).decode(buf));
buf.flip();
}
} catch (IOException x) {
System.out.println("caught exception: " + x);
}
 什麼是channel
– Channel是一個物件,可以通過它讀取和寫入資料。拿 NIO 與原來的 I/O 做個比較,通道就
像是流。
– 正如前面提到的,所有資料都通過 Buffer 物件來處理。您永遠不會將位元組直接寫入通道中,
相反,您是將資料寫入包含一個或者多個位元組的緩衝區。同樣,您不會直接從通道中讀取位元組
,而是將資料從通道讀入緩衝區,再從緩衝區獲取這個位元組。
 通道型別
– 通道與流的不同之處在於通道是雙向的。而流只是在一個方向上移動(一個流必須是
InputStream 或者 OutputStream 的子類), 而 通道 可以用於讀、寫或者同時用於讀寫。
– 因為它們是雙向的,所以通道可以比流更好地反映底層作業系統的真實情況。特別是在 UNIX
模型中,底層作業系統通道是雙向的。

VisualVM 監控器

相關文章