位元組流讀寫資料
阿新 • • 發佈:2022-03-31
位元組
InputStream是位元組輸入流的抽象類,是所有位元組輸入流的父類
InputStream類是用來處理位元組的,不適合處理文字,Java為字元文字的輸入提供了單獨的類---Reader類,但Reader類並不是InputStream類的替換者,只是在處理字串時簡化了程式設計
OutputStream是位元組輸出流的抽象類,該抽象類是表示輸出位元組流的所有類的父類,該類中所有方法均返回void
子類名特點:子類名稱都是以其父類名作為子類名的字尾
寫資料
package IO; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {//異常處理 //建立位元組輸出流物件 建立檔案輸出流以指定的名稱寫入檔案 FileOutputStream fos = new FileOutputStream("fos.txt");//預設路徑是java\\src 在這直接寫fos.txt就行 //void write(int b):將指定的位元組寫入此檔案輸出流 fos.write(97); fos.write(57); fos.write(55);//輸入到fos.txt中會轉換為字元,對應ASCII碼錶進行轉換 //使用IO流,最後都要釋放資源 //void close(),關閉此檔案輸出流並釋放與此檔案相關聯的任何系統資源 fos.close(); } } //建立的fos.txt檔案中的資料為a97
三個方法寫資料
package IO; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; public class Demo02 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("fos.txt"); //void write(int b):將指定的位元組寫入此檔案輸出流 fos.write(100); //void write(byte[] b):將b.length位元組從指定的位元組陣列寫入此檔案輸出流 //byte[] b={97,98,99}; //byte[] getBytes():返回字串對應的位元組陣列 byte[] b = "abc".getBytes();//與上面效果相同 fos.write(b); //void write(byte[] b,int off,int len):將len位元組從指定的位元組陣列開始,從偏移量off開始寫入此檔案輸出流 fos.write(b,1,2); fos.close(); } }
位元組流寫資料實現換行
fos.write("\n".getBytes());//換行
注意:不同系統換行符不一樣。
window:\n
linux:\n
mac:\r
實現追加寫入
就是每執行一次,就在原來的基礎上寫入一次
//public FileOutputStream(String name,Boolean append);在後面加一個Boolean
//Boolean引數為true,從檔案的末尾開始追加寫入檔案,否則則在開頭寫
FileOutputStream fos = new FileOutputStream("fos.txt",true);
異常處理
- 用try、catch、finally
FileOutputStream fos = null;//初始化
try{
fos = new FileOutputStream("fos.txt");
fos.write("h".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();//若將它寫在上面的try/catch中,會造成資源沒有釋放的問題
//finally解決了這個問題,finally中的語句一定可以實現
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 也可以直接新增異常到方法簽名
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("h".getBytes());
fos.close();
}
注:
fos.flush();//將資料緩衝區中的資料強制輸出,並清空緩衝區
讀資料
步驟:
- 建立位元組輸入流物件
- 呼叫物件的讀資料方法
- 釋放資源
int read() 讀一個位元組的資料
FileInputStream fis = new FileInputStream("fos.txt");
//呼叫位元組輸入流物件的讀資料方法:int read() 讀一個位元組的資料
/*
//第一次讀資料
int x= fis.read();
System.out.println(x);//104
System.out.println((char)x);//h
//第二次讀資料
x = fis.read();
System.out.println(x);//101
System.out.println((char) x);//e
//可以接著往下讀取資料,不過一次只能讀一個
*/
/*
//以上可用迴圈代替
int x = fis.read();
while(x!=-1){//可知當檔案結束時讀到的是-1
System.out.print((char) x);//hello
x = fis.read();
}
*/
//優化上面的程式
int x;
while((x= fis.read())!=-1){
System.out.print((char)x);//輸出的與原檔案中的格式一樣
}
fis.close();
讀一個位元組陣列的資料
import java.io.FileInputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("fos.txt");
//建立一個數組
byte[] b=new byte[5];
//第一次讀資料
int len=fis.read(b); //讀取的陣列長度
System.out.println(len);
System.out.println(new String(b));//陣列內容
//第二次讀資料
len=fis.read(b); //讀取的陣列長度
System.out.println(len);
System.out.println(new String(b));//陣列內容
/*
輸出
5
hello
5
jav
原因:原檔案為hello
java
每個單詞後邊都有\r\n,也分別佔一個字元,第二次讀資料先讀hello後面的\r\n,再讀接下來的jav
*/
//第三次讀資料
len=fis.read(b); //讀取的陣列長度
System.out.println(len);
//System.out.println(new String(b));//陣列內容
System.out.println(new String(b,0,len));//指讀到哪輸出到哪,一般都寫這樣的
/*
輸出3
a
av
讀了三個字元,後面的av是之前的bys陣列原有的,這次讀取只是替換可陣列中的前三個元素
*/
fis.close();
}
簡化程式碼
import java.io.FileInputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("fos.txt");
//沒有資料時,len值為-1,上面的程式碼簡化
byte[] b=new byte[1024];//1024或1024的整數倍
int len;
while((len=fis.read(b))!=-1){
System.out.println(new String(b,0,len));
}
fis.close();
}