IO流的分類
|
輸入流 |
輸出流 |
說明 |
字節流 |
InputStream |
OutputStream |
字節流是處理字節的(二進制) |
字符流 |
Reader |
Writer |
字符流是處理字符的 |
注:這幾個類都是抽象類。
IO解決問題: 解決設備與設備之間 的數據傳輸問題。 比如: 硬盤--->內存 內存----->硬盤
1 字節流:
輸入字節流:InputStream 所有輸入字節流的基類。 抽象類。
FileInputStream 讀取文件的輸入字節流。
BufferedInputStream 緩衝輸入字節流。 該類內部其實就是維護了一個8kb字節數組而已。 該類出現的目的是爲了提高讀取文件數據的效率。
輸出字節流:OutputStream 所有輸出字節流的基類。 抽象類。
FileOutputStream 向文件輸出數據 的輸出字節流。
BufferedOutputStream 緩衝輸出字節流。 該類出現的目的是爲了提高向文件寫數據的效率。 該類內部其實也是維護了一個8kb的字節數組而已。
什麼情況使用字節流: 讀取到數據不需要經過編碼或者解碼的情況情況下這時候使用字節流。比如:圖片數據
字符流 = 字節流 + 編碼(解碼)
2 字符流:
輸入字符流 Reader 所有輸入字符流的基類。 抽象類。
FileReader 讀取文件字符的輸入字符流。
BufferedReader 緩衝輸入字符流。 該類出現的目的是爲了提高讀取文件字符的效率並且拓展了功能(readLine()),它內部 其實就是維護了一個8192個長度的字符數組。
輸出字符流 Writer 所有輸出字符流的基類。 抽象類。
FileWriter 向文件輸出字符數據的輸出字符流。
BufferedWriter 緩衝輸出字符流。該類出現的目的是爲了提高寫文件字符的效率並且拓展了功能(newLine())。
什麼情況下使用字符流:如果讀寫的都是字符數據,這時候我們就使用字符流。
轉換流: 字節流--->字符流
輸入字節流的轉換流 InputSrteamReader
輸出字節流的轉換流 OutputStreamWriter
轉換流的作用:
1. 可以把對應的字節流轉換成字符流使用。
2. 可以指定碼錶進行讀寫文件的數據。
FileReader, FileWriter這兩個類默認是使用的是gbk編碼 表。不能由你來指定碼錶讀寫文件數據
public class Demo1 {
public static void main(String[] args) throws Exception {
// testInput();
// writeFile();
readFile();
}
public static void readFile() throws IOException{
//建立文件與程序的輸入數據通道
FileInputStream fileInputStream = new FileInputStream("F:\\a.txt");
//創建輸入字節流的轉換流並且指定碼錶進行讀取
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
int content = 0;
while((content = inputStreamReader.read())!=-1){
System.out.println((char)content);
}
//關閉資源
inputStreamReader.close();
/*FileReader fileReader = new FileReader("F:\\a.txt"); //默認使用的是gbk碼錶
int content = 0;
while((content = fileReader.read())!=-1){
System.out.print((char)content);
}
//關閉資源
fileReader.close();*/
}
//指定使用utf-8碼錶把數據寫出到文件上。
public static void writeFile() throws IOException{
//建立了文件與程序的數據 通道
FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt");
//創建一個輸出字節流的轉換流並且指定碼錶進行寫數據
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8");
outputStreamWriter.write("大家好"); //中文在utf-8碼錶中佔三個字節。
//關閉資源
outputStreamWriter.close();
}
public static void testOutput() throws Exception{
Socket socket = new Socket(InetAddress.getLocalHost(),9090);
//獲取到socket的輸出流對象。
OutputStream outputStream = socket.getOutputStream();
//把輸出字節流轉換成輸出字符流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
outputStreamWriter.write("不餓!");
}
public static void testInput() throws Exception{
InputStream in = System.in;
// int content = in.read(); // 每次只會讀取到一個字節的數據
//需要把字節流轉換成字符流使用。
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
}
}
讀取文件
拷貝文件