【Java】JAVA使用字節流讀寫文件操作及try-with-resourse自動資源管理操作

Java定義了兩種類型的流,字節流和字符流。
字節流爲處理字節的輸入和輸出提供了方便,如讀寫二進制數據。字節流在處理文件時也特別有用。
字符流的設計是爲了處理字符的輸入和輸出,它們使用Unicode,可以國際化。


本篇是用字節流處理文件。


1.使用字節流讀取文件的內容(在finally塊中手動關閉文件)

首先在創建工程的目錄下,手動生成名爲"1.txt"的文本文檔,向"1.txt"中添加一段內容:Aiya Earendil Elenion Aucalima!

import java.io.*;

public class ShowFile {
 public static void main(String[] args) {
  int i;
  String filename = "1.txt";        //要打開文件的名稱
  FileInputStream fin=null;         //fin初始化爲空      
  
  try{
   fin=new FileInputStream(filename);      //創建FileInputStream的對象
   do{
    i=fin.read();           //read()被調用時,它從文件讀取一個字節,並將其作爲整數值返回。當到達文件結尾時,read()會返回-1.
    if(i!=-1) System.out.print((char)i);       //讀取操作,輸出i對應的字符
   }while(i!=-1);
   
  }catch(FileNotFoundException e){     //拋出文件爲找到異常
   System.out.println("File Not Found!");
   return;
  }catch(IOException e){               //拋出讀文件錯誤異常
   System.out.println("An IO Error Occurred!");
  }finally{             //在finally塊中手動關閉文件
   try{
    if(fin!=null) fin.close();   //注意fin被初始化爲null。在finally塊中,fin不爲空時才關閉文件。這樣做的原因是隻有文件被成功打開,fin纔不會爲null.因爲,在打開文件的過程中出現異常,就不會調用close().
   }catch(IOException e){
    System.out.println("Error Closing File!");
   }
  }
 }
}

在運行程序後會顯示:Aiya Earendil Elenion Aucalima!


2.使用字節流將一個文件的內容寫入到另一個文件(在finally塊中手動關閉文件)
同樣在創建工程的目錄下,手動生成名爲"afile.txt"和"copiedfile.txt"的文本文檔,僅向"afile.txt"中添加一段內容:Aiya Earendil Elenion Aucalima!

import java.io.*;

public class CopyFile {
public static void main(String[] args) {
  int i;
  String afile="Afile.txt";
  String copiedfile="copiedfile.txt";  
  
  FileInputStream fin=null;
  FileOutputStream fout=null;
  
  try{
   fin=new FileInputStream(afile);
   fout=new FileOutputStream(copiedfile);   
   do{
    i=fin.read();               //從一個文件讀取字節
    if(i!=-1) fout.write(i);    //然後寫入另一個文件
   }while(i!=-1);      
   
  }catch(IOException e){
   System.out.println("I/O Error: "+e);
  }finally{
   try{
    if(fin!=null) fin.close();
   }catch(IOException e){
    System.out.println("Error Closing Input File!");
   }
   try{
    if(fout!=null) fout.close();
   }catch(IOException e){
    System.out.println("Error Closing Output File!");
   }
  }
  
 }
}

運行程序後再次打開工程目錄下的"copiedfile.txt"文件就會發現其中出現了一句話:Aiya Earendil Elenion Aucalima!


在JDK7以後,Java新增了一種功能,通過自動關閉資源的過程管理資源(例如文件流)提供了另一種更簡化的方式,這種功能的基礎是一種新形勢的try語句,稱爲try-with-resourses。它的優勢在於避免了當不需要文件(或其它資源)時忘記關閉文件的情況。畢竟忘記關閉文件可能導致內存泄露情況,並引發其它問題。

3.使用try-with-resourses修改上面的ShowFile.java

import java.io.*;

public class ShowFile2 {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  int i;
  String filename = "1Cg.txt";        //要打開文件的名稱 
  try(FileInputStream fin=new FileInputStream(filename)){        //try-with-resources塊
   do{
    i=fin.read();           //read()被調用時,它從文件讀取一個字節,並將其作爲整數值返回。當到達文件結尾時,read()會返回-1.
    if(i!=-1) System.out.print((char)i);       //讀取操作,輸出i對應的字符
   }while(i!=-1);  
   
  }catch(IOException e){
   System.out.println("I/O Error:"+e);
  }
 }
  
}

4.使用try-with-resourses修改上面的CopyFile.java

import java.io.*;

public class CopyFile2 {
public static void main(String[] args) {
  String afile="afile.txt";
  String copiedfile="copiedfile.txt";
  
  try(FileInputStream fin=new FileInputStream(afile);
    FileOutputStream fout=new FileOutputStream(copiedfile))
  {
   do{
    i=fin.read();
    if(i!=-1) fout.write(i);
   }while(i!=-1);
   
  }catch(IOException e){
   System.out.println("I/O Error: "+e);
  }
 }
 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章