本節我們學習「常見流中的最后兩項:轉換流和隨意訪問文件流」~
轉換流
InputStreamReader/OutputStreamWriter用來實現將字節流轉化成字符流。比如,如下場景:
System.in是字節流對象,?new BufferedReader(須接受Reader對象)。我們就能將System.in轉換成Reader對象,即可完成此場景。
【示例1】使用InputStreamReader接受用戶的輸入
BufferedReader bReader=?null;
try?{
??? System.out.println("名字:");
??? bReader =?new?BufferedReader(new?InputStreamReader(System.in));
??? System.out.println("用戶輸入:"+ bReader.readLine());
}?catch?(IOException ? e) {
?????? e.printStackTrace();
}
隨意訪問文件流
RandomAccessFile可以實現兩個作用:1.?實現對一個文件做讀和寫的操作。
2.?可以訪問文件的任意位置。不像其他流只能按照先后順序讀取。
在開發某些客戶端軟件時,經常用到這個功能強大可以”任意操作文件內容”的類。比如,軟件的試用次數和使用日期,可以通過本類訪問文件中保存次數和日期的地方進行比對和修改。?JAVA很少開發客戶端軟件,所以在JAVA開發中這個類用的相對較少。
我們需掌握三個核心方法:
1. RandomAccessFile(String name,? String? mode) name用來確定文件;?mode取r(讀)或rw(可讀寫),通過mode可以確定流對文件的訪問權限。
2. seek(long? a)??用來定位流對象讀寫文件的位置,a確定讀寫位置距離文件開頭的字節個數。
3. getFilePointer()??獲得流的當前讀寫位置。
package?com.bjsxt.io;
import?java.io.RandomAccessFile;
/**
?*?測試隨意流
?*?@author?尚學
?*
?*/
public?class?Demo09 {
????public?static?void?main(String[]?args)?throws?Exception {
??????? RandomAccessFile??raf?=?null;
????????//將若干數據寫入到a.txt文件
????????int[]?data?= {10,20,30,40,50,60,70,80,90,100};
????????raf?=?new?RandomAccessFile("d:/a.txt",?"rw");
????????for(int?i=0;i<data.length;i++){
?????????????raf.writeInt(data[i]);
??????? }
????????//直接從a.txt中讀取數據,位置為從36字節開始。
????????raf.seek(4);
??????? System.out.println(raf.readInt());??//讀取4個字節(int為4個字節)
????????//直接從a.txt中讀取數據,隔一個讀一個數據
????????for(int?i=0;i<10;i+=2){
?????????????raf.seek(i*4);
???????????? System.out.print(raf.readInt()+"\t");
??????? }
??????? System.out.println();? ??//換行
????????//在8字節處插入一個新數據45,替換以前的數據30
??? ????raf.seek(8);
????????raf.writeInt(45);
????????for(int?i=0;i<10;i++){
?????????????raf.seek(i*4);
???????????? System.out.print(raf.readInt()+"\t");
??????? }
????????raf.close();
??? }
}
示例1 ?運行效果圖
至此,所有的常見流我們已經學習完畢,下節我們學習關于「Java對象的序列化和反序列化」。
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。
?筆記包含從淺入深的六大部分:
?A-Java入門階段
?B-數據庫從入門到精通
?C-手刃移動前端和Web前端
?D-J2EE從了解到實戰
?E-Java高級框架精解
?F-Linux和Hadoop?