大資料工程師:大資料的java基礎 第十週
1. Java的IO操作分為三大類
– 基於位元組流的操作
• 底層操作,因為不關注資訊的分段,只能對位元組進行處理,往往不適用於高階操作
– 基於字元流的操作
• 高階操作,基於字元,可劃分資訊段
– 基於NIO的操作
• 非阻塞式操作,效能最好
– 基於位元組流的操作
• 底層操作,因為不關注資訊的分段,只能對位元組進行處理,往往不適用於高階操作
– 基於字元流的操作
• 高階操作,基於字元,可劃分資訊段
– 基於NIO的操作
• 非阻塞式操作,效能最好
2. 位元組流
– 所有基於位元組流的類都派生自InputStream或者OutputStream
– 所有基於位元組流的類都派生自InputStream或者OutputStream
– 及時關閉流
– 注意位元組流是低層次的處理,必要時使用字元流
– 注意位元組流是低層次的處理,必要時使用字元流
import java.io.*;
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
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
– 基於行的操作
– 所有字元流派生自Reader或者Writer
– 基於行的操作
4. 快取流
– 快取流可以避免不斷的對磁碟進行讀寫操作,提高效能
– 記得flush快取流(確保快取的內容寫入)
– 有四種快取流:
• BufferedInputStream/BufferedOutputStream
• BufferedReader/BufferedWriter
– 分別對應的是處理位元組和字元的流,使用中需要注意
– 快取流可以避免不斷的對磁碟進行讀寫操作,提高效能
– 記得flush快取流(確保快取的內容寫入)
– 有四種快取流:
• BufferedInputStream/BufferedOutputStream
• BufferedReader/BufferedWriter
– 分別對應的是處理位元組和字元的流,使用中需要注意
5. 資料流
– 資料流可以根據資料的型別進行操作
• 包括從boolean到double的所有基本型別
• 不能處理物件型別
• 資料流實現DataInput和DataOutput介面
– 例子:
– 資料流可以根據資料的型別進行操作
• 包括從boolean到double的所有基本型別
• 不能處理物件型別
• 資料流實現DataInput和DataOutput介面
– 例子:
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]);
}
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方法,否則會出現資源
洩露
– 有些檔案操作在某些作業系統中是原子操作,因此需要注意在多程式或多執行緒下的檔案操作
– java.nio.file.Path是檔案操作的主要支援類
• 可建立路徑物件——Paths.get
• 獲取路徑資訊——檢視Path相關API文件
• 刪除路徑中的冗餘資訊,如.和..
• 合併路徑——Path.resolve
– 流基本都是實現了Closable介面的,注意在使用完畢之後呼叫close方法,否則會出現資源
洩露
– 有些檔案操作在某些作業系統中是原子操作,因此需要注意在多程式或多執行緒下的檔案操作
檢視檔案屬性(Files)
– Exists、 notExists、 isReadable、 isWritable、 isExecutable
刪除檔案或目錄(Files)
– Delete、 deleteIfExists
拷貝檔案(Files)
– copy
移動檔案或目錄
– move
– Exists、 notExists、 isReadable、 isWritable、 isExecutable
刪除檔案或目錄(Files)
– Delete、 deleteIfExists
拷貝檔案(Files)
– copy
移動檔案或目錄
– move
try() 寫法,自動關閉()內資源
為什麼使用NIO
– 面向塊的操作,而不是流的操作
什麼是緩衝區
– Buffer 是一個物件, 它包含一些要寫入或者剛讀出的資料。 在 NIO 中加入 Buffer 物件,體
現了新庫與原 I/O 的一個重要區別。在面向流的 I/O 中,您將資料直接寫入或者將資料直接
讀到 Stream 物件中。
– 在 NIO 庫中,所有資料都是用緩衝區處理的。在讀取資料時,它是直接讀到緩衝區中的。在
寫入資料時,它是寫入到緩衝區中的。任何時候訪問 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
模型中,底層作業系統通道是雙向的。
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 監控器
相關文章
- 大資料:大資料之基礎語法大資料
- 大資料之JAVA基礎(一):資料和變數大資料Java變數
- 大資料——HBase基礎大資料
- 大資料學習之路——java基礎(二)大資料Java
- 【大資料】Spark RDD基礎大資料Spark
- 2. 大資料基礎大資料
- 學習Java大資料都需要哪些基礎Java大資料
- 大資料學習方法,學大資料需要的基礎和路線大資料
- sql大資料 基礎(檢視)SQL大資料
- 基礎資料結構大賞資料結構
- 大資料基本公式——一:基礎大資料公式
- 零基礎學Java大資料難不難Java大資料
- 用好工業大資料的基礎是資料質量大資料
- 大資料,大資料,大資料大資料
- 大資料需要掌握的數學基礎大資料
- 大資料基礎-kakfa的安裝教程大資料
- 大資料基礎知識全集,大資料愛好者收藏必備大資料
- 大快DKH大資料基礎資料平臺的監控引數說明大資料
- 大資料解決方案-(基礎篇)大資料
- 大資料基礎架構總結大資料架構
- 大資料基礎(一)——關係+文章大資料
- 大資料基礎----Python入門大資料Python
- 大資料基礎之開發第一個Java程式大資料Java
- 大資料初學者怎樣學習?Java工程師怎麼轉行大資料?大資料Java工程師
- 大資料學習:零基礎大資料入門該看哪些書?大資料
- 大資料基礎知識總結和大資料方面的核心技術大資料
- 學習大資料需要什麼基礎?大資料要學哪些內容?大資料
- 大資料前景如何?大資料開發工程師是什麼?大資料工程師
- Java、Python以及大資料哪個適合0基礎?JavaPython大資料
- 大資料學習之Linux基礎大資料Linux
- 零基礎大資料學習框架大資料框架
- 大資料之MySQL基礎(含Linux)大資料MySqlLinux
- 大資料工程師技能樹大資料工程師
- 【java基礎資料整理】Java
- 大資料基礎教程:建立RDD的二種方式大資料
- 大資料如何學習,大資料工程師學習經驗分享大資料工程師
- 阿里巴巴資深大資料工程師:大資料處理實踐阿里大資料工程師
- 從BAT大資料工程師那裡總結的大資料學習方法BAT大資料工程師