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