1.I/O 框架圖
2.比特Bit、字節Byte、字符Char
- Bit 最小的二進制單位 ,是計算機的操作部分 取值 0 或者 1
- Byte 是計算機操作數據的最小單位由 8 位 bit 組成 取值(-128-127)
- Char 是用戶的可讀寫的最小單位,在 Java 裏面由 16 位 bit 組成 取值(0-65535)
3.java中流的種類
- 字符流和字節流。
所有的字節流都繼承自 inputStream 和 OutputStream,
所有的字符流繼承自 Reader 和 Writer。
- 節點流和處理流
節點流:直接與數據源相連,用於輸入或者輸出
處理流:在節點流的基礎上對之進行加工,進行一些功能的擴展
4.字符流和字節流的區別
-
要把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,不管輸入輸出設備是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名爲 IO 流,對應的抽象類爲 OutputStream 和 InputStream ,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。
-
在應用中,經常要完全是字符的一段文本輸出去或讀進來,用字節流可以嗎?
計算機中的一切最終都是二進制的字節形式存在。對於 “中國” 這些字符,首先要得到其對應的字節,然後將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示爲字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,人家專門提供了字符流的包裝類。 -
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這爲我們向 IO 設別寫入或讀取字符串提供了一點點方便。
5.常用流的應用場景
-
對字節流進行大量的從硬盤讀取
使用BufferedInputStream
使用緩衝流能夠減少對硬盤的損傷 -
打印出不同類型的數據到數據源
Printwriter 可以打印各種數據類型
也就是常用的System.out.println() -
把我們控制檯的輸出改成輸出到一個文件裏面
SetOut(printWriter,printStream)重定向 -
基本類型數據和字符串按順序輸出和輸入
使用 DataInputStream DataOutputStream -
將字節流轉換爲字符流
InputStreamReader 類是從字節流到字符流的橋接器:它使用指定的字符集讀取字節並將它們解碼爲字符。 它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。
6.寫入文件
public static void write() {
File file = null;
FileWriter fw = null;
BufferedWriter bw = null;
String content = "溫柔的及時雨";
try {
// 打開文件
String path = "C:\\D\\test.txt";
file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
// 寫入文件
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
bw.write(content);
bw.flush();
fw.close();
bw.close();
} catch (Exception e) {
}
}
這裏需要注意的是,在使用緩衝流的時候,需要調用flush方法,把緩衝流中的內容刷新到文件中,如果不使用,就無法正常寫入文件
7.遞歸讀取文件夾
public static void read(String path) {
if (path == null) {
return;
}
File [] files = new File(path).listFiles();
if (files == null) {
return;
}
for (File file : files) {
if (file.isFile()) {
System.out.println("file name: " + file.getName());
} else if (file.isDirectory()) {
System.out.println("directory name: " + file.getName());
read(file.getPath());
} else {
System.out.println("error");
}
}
}