1. 程式人生 > 其它 >位元組流讀寫資料

位元組流讀寫資料

位元組

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);

異常處理

  1. 用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();
        }
    }
}
  1. 也可以直接新增異常到方法簽名
public static void main(String[] args) throws IOException {
    FileOutputStream fos = new FileOutputStream("fos.txt");
    fos.write("h".getBytes());
    fos.close();
}

注:

fos.flush();//將資料緩衝區中的資料強制輸出,並清空緩衝區

讀資料

步驟:

  1. 建立位元組輸入流物件
  2. 呼叫物件的讀資料方法
  3. 釋放資源

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();
}