Java緩存流-[百戰系列]-[2019-8-9]

概述

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操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章