> InputStream字節輸入流
OutputStream字節輸出流
用于以字節的形式讀取和寫入數據
# ASCII碼 概念
所有的數據存放在計算機中都是以數字的形式存放的。 所以字母就需要轉換為數字才能夠存放。
比如A就對應的數字65,a對應的數字97. 不同的字母和符號對應不同的數字,就是一張碼表。
ASCII是這樣的一種碼表。 只包含簡單的英文字母,符號,數字等等。 不包含中文,德文,俄語等復雜的。

# 以字節流的形式讀取文件內容
InputStream是字節輸入流,同時也是抽象類,只提供方法聲明,不提供方法的具體實現。
FileInputStream 是InputStream子類,以FileInputStream 為例進行文件讀取
```
package com.dodoke.util;
import java.io.File;
import java.io.FileInputStream;
public class TestSteam3 {
public static void main(String[] args) {
try {
// 準備文件lol.txt其中的內容是AB,對應的ASCII分別是65 66
File f = new File("d:/log.txt");
// 創建基于文件的輸入流
FileInputStream fis = new FileInputStream(f);
// 創建字節數組,其長度就是文件的長度
byte[] all = new byte[(int) f.length()];
// 以字節流的形式讀取文件的所有內容
fis.read(all);
for (byte b : all) {
System.out.println(b);
}
// 每次使用完流,都應該進行關閉
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# 以字節流的形式向文件寫入數據
OutputStream是字節輸出流,同時也是抽象類,只提供方法聲明,不提供方法的具體實現。
FileOutputStream 是OutputStream子類,以FileOutputStream 為例向文件寫出數據
注: 如果文件d:/lol2.txt不存在,寫出操作會自動創建該文件。
但是如果是文件 d:/xyz/lol2.txt,而目錄xyz又不存在,會拋出異常
```
package com.dodoke.util;
import java.io.File;
import java.io.FileOutputStream;
public class TestSteam4 {
public static void main(String[] args) {
try {
// 準備文件lol2.txt其中內容是空的
File f = new File("d:/log2.txt");
// 準備長度是2的字節數組,用88,89初始化,其對應的字符分別是X,Y
byte data[] = { 88, 89 };
// 創建基于文件的輸出流
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
// 每次使用完流,都應該進行關閉
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# 練習-寫入數據到文件
以字節流的形式向文件寫入數據 中的例子,當lol2.txt不存在的時候,是會自動創建lol2.txt文件的。
但是,如果是寫入數據到d:/xyz/lol2.txt,而目錄xyz又不存在的話,就會拋出異常。
那么怎么自動創建xyz目錄?
如果是多層目錄 d:/xyz/abc/def/lol2.txt 呢?
```
package com.dodoke.util;
import java.io.File;
import java.io.FileOutputStream;
public class TestSteam4 {
public static void main(String[] args) {
try {
File f = new File("d:/xyz/abc/def/log2.txt");
// 因為默認情況下,文件系統中不存在 d:\xyz\abc\def,所以輸出會失敗
// 首先獲取文件所在的目錄
File dir = f.getParentFile();
if (!dir.exists()) {
// dir.mkdir(); //使用mkdir會拋出異常,因為該目錄的父目錄也不存在
dir.mkdirs();//使用mkdirs則會把不存在的目錄都創建好
}
// 準備長度是2的字節數組,用88,89初始化,其對應的字符分別是X,Y
byte data[] = { 88, 89 };
// 創建基于文件的輸出流
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
// 每次使用完流,都應該進行關閉
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```