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