概述
1.轉換流
1.1 InputStreamReader類的使用
1.2 OutputStreamWriter類的使用
2.緩衝流
2.1 BufferedInputStream類的使用
2.2 BufferedOutputStream類的使用
2.3 BufferedReader類的使用
2.4 BufferedWriter類的使用
3.內存流
4.標準輸入輸出流
5.對象流
6.RandomAccessFile類
7.Properties類
轉換流
作用: 1.實現字節流到字符流的轉換 2.解決中文亂碼問題 3.只有轉換流才能指定讀取和寫入的字符集
1.1 InputStreamReader類
字節字符轉換輸入流,將字節流轉換爲字符輸入流*
//注意:當一個流的存在的意義是爲了實例化另外一個流,則這個流不需要手動進行關閉 //使用指定字符集進行實例化轉換流 //字符集一般使用字符串直接傳參,不區分大小寫,但是,如果字符集書寫有誤的話,則會拋出 java.io.UnsupportedEncodingException InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("file/input1.txt")),"UTF‐8");
1.2 OutputStreamWriter類
字符轉換輸出流,將內存中的字符轉成字節保存到硬盤中
File file = new File("file/output1.txt");
//2.實例化轉換輸出流 //如果不想覆蓋源文件中的內容時,則在傳參的時候,設置一個參數爲true
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file,true), "utf‐8");
//3.寫入
writer.write("家客戶放假啊剛回家");
//4.刷新
writer.flush();
//5.關閉
writer.close();
緩衝流
作用: 主要是爲了增強基礎流的功能而存在的,提高了流的工作效率 [讀寫效率]
2.1 BufferedInputStream類
//實例化一個File對象 File file = new
File("file/test22.txt");
//實例化一個緩衝字節輸入流的對象
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
//讀取
byte[] arr = new byte[1024];
int len = 0;
while((len = input.read(arr)) != ‐1) {
String string = new String(arr, 0, len);
System.out.println(string);
}
input.close();
2.2 BufferedOutputStream類
//實例化FIle對象
File file = new File("test33.txt");
//實例化換種字節輸出流
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
//寫
output.write("你好的halle".getBytes());
//刷新
output.flush();
//關閉
output.close();
2.3 BufferedReader類
//實例化FIle對象
File file = new File("test33.txt");
//實例化緩衝字符流的對象
BufferedReader reader = new BufferedReader(new FileReader(file));
//方式一:read循環讀取
//讀取
char[] arr = new char[8];
int len = 0;
while((len = reader.read(arr)) != ‐1) {
String string = new String(arr, 0, len);
}
//方式二:readLine循環讀取
String result = "";
while((result = reader.readLine()) != null) {
System.out.println("第一行:" + result); }
reader.close();
2.4 BufferedWriter類
// 實例化FIle對象
File file = new File("test33.txt");
//實例化緩衝字符輸出流
BufferedWriter writer = new BufferedWriter(new FileWriter(file,true));
// 寫
writer.write("今天天氣還可以");
// 作用:主要就是爲了換行
writer.newLine();
// 刷新
writer.flush();
//關閉
writer.close();
內存流
輸入和輸出都是從文件中來的,當然,也可以將輸出輸入的位置設置在內存上,這就需要ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream:將內容寫入到內存中,是Inputstream的子類
ByteArrayOutputStream:將內存中數據輸出,是OutputStream的子類
注意:內存操作流的操作對象,一定是以內存爲主準,不要以硬盤爲準。
標準輸入輸出流
Java的標誌輸入/輸出分別通過System.in和System.out實現,默認情況下分別代表是鍵盤和顯示器
可以將默認打印到控制檯的輸出,重定向到文件中
//注意:默認打印到控制檯,但是,如果採用setOut方法進行重定向之後,將輸出到指定的文件中
PrintStream print = new PrintStream(new FileOutputStream(new File("test33.txt")));
//將標準輸出重定向到print的輸出流
System.setOut(print);
//下面的輸出不會顯示到控制檯,而是會保存到test33.txt文件中
System.out.println("hello world");
可以將由控制檯的輸入,該爲從指定文件中獲取內容
FileInputStream inputStream = new FileInputStream(new File("test33.txt"));
//setIn
System.setIn(inputStream);
//默認情況下是從控制檯進行獲取內容
//但是如果使用setIn方法設置了重定向之後,將從指定文件中獲取內容
Scanner sc = new Scanner(System.in);
String string = sc.next();
System.out.println(string);
對象流
流中流動的數據是對象
將一個對象寫入到本地文件中,被稱爲對象的序列化
將一個本地文件中的對象讀取出來,被稱爲對象的反序列化
使用對象流
ObjectInputStream: 對象輸出流
ObjectOutputStream:對象輸入流
注意
一個對象流只能操作一個對象,如果試圖採用一個對象流操作多個對象的話,會出現EOFException【文件意 外達到了文件末尾】
如果向將多個對象序列化到本地,可以藉助於集合,【思路:將多個對象添加到集合中,將集合的對象寫入到 本地文件中,再次讀出來,獲取到的仍然是集合對象,遍歷集合】
在要序列化類中添加字段,保證序列化和反序列化是同一個類
private static final long serialVersionUID = 100L;
要實現 implements Serializable 接口
注意:在使用對象流的時候,用於初始化對象流的參數只能是字節流(將對象轉換爲二進制的形式,然後再把二進制寫入 文件)
對象中那些字段可以不序列化:
1.transient 修飾的字段
2.靜態的字段
RandomAccessFile類
RandomAccessFile是用來訪問那些保存數據記錄的文件的,你就可以用seek( )方法來訪問記錄,並進行讀寫了。這些記 錄的大小不必相同;但是其大小和位置必須是可知的。但是該類僅限於操作文件。
//把文件指針位置設置到文件起始處
file.seek(0);
//將文件指針跳過3個字節,本例中即跳過了一個boolean值和short值。
file.skipBytes(3);
Properties類
是Map接口的一個實現類,並且是Hastable的子類
Properties集合中元素也是以鍵值對的形式存在的
Properties特點:
1 存儲屬性名和屬性值
2 屬性名和屬性值都是字符串
3 和流有關係
4 沒有泛型
//1.實例化一個Properties的對象
Properties pro = new Properties();
pro.load(new BufferedInputStream(new FileInputStream(new File("file/userlist.properties"))));
System.out.println(pro);
//2.向集合中添加一對鍵值對
//調用 Hashtable 的方法 put。
pro.setProperty("address", "china");
面試題
1.BufferedReader屬於哪種流,它主要是用來做什麼的,它裏面有那些經典的方法
屬於處理流中的緩衝流.
可以將讀取的內容存在內存裏面,提高了流的工作效率 [讀寫效率]
有readLine()方法 read()方法
2.怎麼樣把輸出字節流轉換成輸出字符流,說出它的步驟
使用 轉換處理流OutputStreamWriter
可以將字符流轉爲字節流
New OutputStreamWriter(new FileOutputStream(File file));
3.流一般需要不需要關閉,如果關閉的話在用什麼方法,一般要在那個代碼塊裏面關閉比較好,處理流是怎麼關閉的,如果 有多個流互相調用傳入是怎麼關閉的?
流一旦打開就必須關閉,使用close方法
放入finally語句塊中,因爲finally 語句一定會執行
調用的處理流就關閉處理流
多個流互相調用只關閉最外層的流
4.什麼叫對象序列化,什麼是反序列化,實現對象序列化需要做哪些工作
對象序列化,將對象以二進制的形式保存在硬盤上
反序列化;將二進制的文件轉化爲對象讀取
實現serializable接口
不想讓字段放在硬盤上就加transient
5.在實現序列化接口是時候一般要生成一個serialVersionUID字段,它叫做什麼,一般有什麼用
是版本號
要保持版本號的一致 來進行序列化.
爲了防止序列化出錯
6.什麼是內存流?有什麼作用
輸出輸入的位置設置在內存上
內存操作流的操作對象,一定是以內存爲主準
讀寫操作更快,避免了與硬盤的IO操作