1. 程式人生 > >Java 輸出/輸入位元組流

Java 輸出/輸入位元組流

輸出位元組流:outputStream 抽象類,表示所有位元組輸出流的超類,子類的開頭就是功能

方法: 1.關閉位元組流及相關資源 close() 2.重新整理位元組輸出流 3.將位元組陣列(byte[])或者是位元組(int b)寫入輸出流 位元組流的寫入/輸出絕對是依賴於系統的。 子類:有各種輸出的子類 FileOutputStream :將資料寫入檔案

FileOutputStream(File file) 
//建立檔案輸出流以寫入由指定的 File物件表示的檔案。  
FileOutputStream(File file, boolean append) 
// 在檔案的末尾續寫
package IO;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

//位元組輸出流,將資料寫到檔案中
public class WriteFile_OutputStream {
    public static void main(String[] args)throws IOException {
        File dir = new File("F:\\File\\tempfile");
        if(!dir.exists()){//建立臨時目錄
            dir.mkdir();
        }
        File file = new File(dir,"file");
        //在建立位元組流輸出物件時,明確輸出目的地,如果檔案不存在就會建立,如果存在就會被覆蓋
         FileOutputStream outputStream = new FileOutputStream(file);//會丟擲異常
         byte[] b = "abdhdb".getBytes();
         outputStream.write(b);//會丟擲異常

        //在檔案中續寫
        FileOutputStream file2 = new FileOutputStream(file,true);
        byte[] b2 = "java".getBytes();
        file2.write(b2);

        //換行續寫 在出入的位元組陣列中加入換行符//為了提高程式的跨平臺性,獲取系統中的換行符
        final String n = System.getProperty("line.separator");
        byte[] b3 = (n+"itcast").getBytes();
        file2.write(b3);
        //關閉位元組流
        outputStream.close();
    }
}

在建立位元組流輸入物件,寫入還有關閉的時候會發生異常,異常處理(涉及資源比較麻煩)

 File file = new File(dir,"file");
        //在建立位元組流輸出物件時,明確輸出目的地,如果檔案不存在就會建立,如果存在就會被覆蓋
        FileOutputStream outputStream =null;
         try {
             outputStream = new FileOutputStream(file);//會丟擲異常
         byte[] b = "abdhdb".getBytes();
         outputStream.write(b);}//會丟擲異常
         catch (IOException e) {
            //能處理就寫處理,不能處理就宣告
         }
         finally {
             if(outputStream!=null){
                 try{
                     outputStream.close();
                 }
                 catch (IOException e){
                     throw new RuntimeException("");
                 }
             }
         }

異常出現的原因:三句都是IOException 資源關閉是一定要執行的寫在第一個try catch 的finally 中。 位元組輸出流的物件是在第一個大括號中定義的,所以要將物件的定義放到異常處理之外

在位元組流關閉的時候也會出現異常,導致無法關閉,但是這個關閉異常是系統可能導致的問題,但是也要寫異常處理,並且要將異常轉化為執行時異常,一旦關閉失敗就要將程式停下來

最後編譯時可以看見的異常已經處理完畢,但是擔當程式碼執行時,如果檔案的地址是不存在的,那麼還是會出現執行時異常,一個是建立時無法找到地址,這個已經處理,還有一個是關閉時的空指標異常,地址不存在,無法建立檔案那麼,位元組流物件就是一個空指標,何來關閉一說,所以最後加一個判斷。不為空才關閉

—————————————————————————————————————— 讀取資料: InputStream 輸入流的超類 read() :讀取單個位元組 read(byte[] b) :一次讀取一個位元組陣列的資料,這個陣列是一個緩衝陣列,一般大小定義為1024 的整數倍。 / /返回的整型值 是讀取的位元組個數,讀到末尾返回-1 讀取檔案的子類 FileInputStream 兩個都通過迴圈讀取 int read();

 int ch =0;
        while((ch=in.read())!=-1){
        //在檔案的末尾有結束符(有系統定義)返回值是讀到的資料(0-255 int ),讀到末尾返回-1
            System.out.print((char)ch);
        }

int read(byte[] b); 每次讀取到的資料就存到存到緩衝陣列中,返回值為讀取到的位元組個數,返回-1則結束讀取。

 byte[] buf = new byte[1024];//陣列的大小最好為1024 的整數倍
        int len=0;
        while((len=in.read(buf))!=-1){
            String str =new String(buf,0,len);//每次存到陣列中的都是讀取到的資料,那轉化到的
            System.out.println(str);
        }

計算機中資料的儲存是以位元組為單位(一個位元組,再64 位的計算機中佔八位) 一個位元組可以表示: 1.ASC|| 碼 2.有符號數:-128–127 3.無符號數: 0–255 資料的輸入輸出也是按照位元組為單位 (在市裡的檔案中儲存的都是單個字元,所以只要用char 轉換就可以看見檔案中的資料) ———————————————————————————— 在寫程式碼的過程中出現了一個問題:在程式執行時在手動建立的檔案無法被識別 其實不是識別不了而是自己沒有吧最後的檔名寫對,如:記事本檔案file 但是在地址查詢時,他的完整名字:file.txt .如果在命名記事本檔案時就命名為:file.txt。那麼在定址時他的完整名字:file.txt.txt