標籤:span 建構函式 ... 失敗 create nts accept 集合 mkdir
說在前面的話:IO流是用來操作File的,因此先說一下File
一、File類:
檔案和目錄路徑名的抽象表示。
File 類只能操作檔案的屬性,檔案的內容是不能操作的。
1.作用:用於對磁碟檔案操作。刪除、建立等。2.三種建構函式:
①直接傳入一個路徑,拿到一個檔案或者檔案夾
File file1 = new File("F:\\test");
②第一個參數傳入父路徑、第二個參數傳入子路徑或者檔案
File file2 = new File("F:\\test", "test.txt");
③第一個參數傳入file檔案、第二個參數傳入子路徑或者檔案
File file3 = new File(file1, "test.txt");
3.路徑的表示:
檔案夾的分割可以使用"/",通常用在Linux系統,windows也可以用
"\\"通常用在Windows系統,注意‘\‘需要進行轉義
4.需要注意的幾個常用方法
①:.delete() 刪除檔案 刪除成功true 刪除失敗false;若刪除檔案夾,此檔案夾不能有子內容
②:createNewFile() 建立一個新檔案建立失敗返回false 需要指定的新檔案名稱由調用他的檔案對象來決定,而不是傳參數,沒有才能建立成功需要捕獲異常
③:mkdir:只能建立一層目錄,如果倒數第二層目錄也不存在,建立失敗;mkdirs:可以建立多層目錄,無論有幾層不存在都可以依次建立
④:list()返回目前的目錄中的所有檔案和檔案夾的名字,傳回值類型為String[]
String[] list = file1.list();for (String string : list) { System.out.println(string);}
可以再參數中傳入FilenameFilter介面的實作類別對象,表示對列表中的所有檔案進行遍曆過濾
需要重寫accept方法,如果保留當前檔案return true,如果不要當前檔案return false
String[] list1 = file1.list(new FilenameFilter()) { @Override public boolean accept(File dir, String name) { // dir:表示包含當前檔案夾的父路徑 // name:表示當前檔案名稱 if (name.endsWith(".txt")) { return true; }else { return false; } }});for (String string1 : list1) { System.out.println(string1);}
⑤:返回目前的目錄中的所有檔案和檔案夾的路徑,傳回值類型為File[]
File[] files = file1.listFiles();for (File file : files) { System.out.println(file+"----"+file.getName());}
同樣可以對檔案進行過濾
①與list()一樣使用 FilenameFilter()進行過濾
②使用FileFilter介面的實作類別進行過濾
File[] files1 = file1.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { // TODO Auto-generated method stub if (pathname.getName().endsWith(".txt")) { return true; }else { return false; } }});for (File fileN : files1) { System.out.println(fileN+"----"+fileN.getName());}
二、IO流的分類:1.根據流的方向:輸入資料流和輸出資料流2.根據讀取文字的大小:位元組流和字元流(位元組流按照位元組讀取,讀取中文時容易亂碼;字元流按照字元讀取,通常用於讀取中文3.根據讀取的方式:節點流和緩衝流三、位元組流java.io.InputStream java,io,OutputStream1.FileInputStream類
①該流繼承於InputStream用於從檔案讀取資料,它的對象可以用關鍵字 new 來建立。
②構造方法
可以使用字串類型的檔案名稱來建立一個輸入資料流對象來讀取檔案:
FileInputStream f = new FileInputStream("C:/java/hello");
也可以使用一個檔案對象來建立一個輸入資料流對象來讀取檔案。我們首先得使用 File() 方法來建立一個檔案對象:
File f = new File("C:/java/hello");
FileInputStream out = new FileInputStream(f);
③常用方法
available():返回下一次對此輸入資料流調用的方法可以不受阻塞地從此輸入資料流讀取的位元組數。返回一個整數值。
read(int r):這個方法從 InputStream 對象讀取指定位元組的資料。返回為整數值。返回下一位元組資料,如果已經到結尾則返回-1。
read(byte[] b): 從此輸入資料流中將最多 b.length 個位元組的資料讀入一個 byte 數組中
close():關閉此檔案輸入資料流並釋放與此流有關的所有系統資源。拋出IOException異常
2.FileOutStream
①該類用來建立一個檔案並向檔案中寫資料。
如果該流在開啟檔案進行輸出前,目標檔案不存在,那麼該流會建立該檔案。
②構造方法
使用字串類型的檔案名稱來建立一個輸出資料流對象:
OutputStream f = new FileOutputStream("C:/java/hello");
也可以使用一個檔案對象來建立一個輸出資料流來寫檔案。我們首先得使用File()方法來建立一個檔案對象:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
③常用方法
write(int b): 將指定位元組寫入此檔案輸出資料流。
write(byte[] b): 將 b.length 個位元組從指定 byte 數組寫入此檔案輸出資料流中。
3、BufferedInputStream、BufferedOutputStream
繼承自FilterInputStream、FilterOutputStream
1.作用:在基本流的基礎上進行封裝,讀取或者寫入檔案時,將通過緩衝進行。
即,先將內容寫入到緩衝區,緩衝區滿以後再進行讀取或寫入操作
可以大大減小檔案的操作次數,提高寫入效率
2.緩衝流的使用:
在基礎流的基礎上進行封裝:
new BufferedInputStream(new FileInputStream("F:\\test\\test.txt"));
這種寫法我們稱為IO鏈,IO關閉時需要關閉最外層流,內層流將自動關閉
3.使用BufferedOutStream,在關閉時通常調用flush()方法;
表示關閉前將緩衝區重新整理,將緩衝區剩餘未滿的內容寫入檔案;
實際上close()方法內建重新整理,這樣做是一種習慣。
4.DataInputStream和DataOutputStream
1. 分別繼承自FilterInputStream和FilterOutStream
2.特殊:
①採用二進位對檔案進行讀寫操作
②與基本流相比,可以直接讀寫Java中的基礎資料型別 (Elementary Data Type)
3.另外如果操作的一個檔案是一個二進位檔案,需要使用DataInputStream替代FileInputStream
不代替也可以讀)同樣,Data系列的流也有read和write方法與基本流操作相同
4.用Data流寫入的檔案,只能用Data流讀,不能使用基本流讀
5.與基本流相比幾個特有方法
readUTF():首先讀取兩個位元組,以 String 的形式返回此字串
readInt():讀取四個輸入位元組並返回一個 int 值
readDouble():讀取八個輸入位元組並返回一個 double 值。
6.上面的方法,如果此流在讀取所有位元組之前到達末尾,則會拋出
java.io.EOFException異常;EOF:END OF FILE
https://www.cnblogs.com/yiwangzhibujian/p/7107084.html(詳細解釋了為啥會拋異常)
自己領會的解決方案 :
public class Demo04_DataINOUTStream2 { public static void main(String[] args) { DataInputStream dis = null; FileInputStream fis = null; try { fis = new FileInputStream("F:\\test\\Demo02_IO.class"); if (fis.available() != 0) { dis = new DataInputStream(fis); }else { System.out.println("檔案已沒有可讀內容!"); } try { while (true) { System.out.println(dis.readInt()); }} catch (EOFException e) { System.out.println("一定會拋出這條異常,表示目標檔案已讀完,沒有可以讀的內容了,我們不做任何處理就好了!"); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { dis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
第一篇:
https://www.cnblogs.com/ouhaitao/p/7683568.html
1 ObjectInputStream ois = null; 2 FileInputStream fis=new FileInputStream(filePath); 3 //當檔案中的有內容時 4 if(fis.available()!=0) 5 ois = new ObjectInputStream(fis); 6 else{ 7 System.out.println("檔案為空白!"); 8 return ; 9 }10 try{11 while(true) 12 System.out.println((Student)ois.readObject());13 }catch(EOFException e){14 }
原理就是:先用基本流判斷檔案是不是還有可讀內容,只有在判斷有可讀內容是才執行個體化一個
進階流對象,這事再去讀,當讀完又會報錯這時只需手動在read...()方法捕捉一下EOFExceptiion這個異常,不處理就好了。
第二篇:
46448877
5.ObjectInputStream/ObjectOutputStream
1.繼承java.io.InputStream和java.io.OutputStream
2.與基本流相同,可以直接使用read write 方法
3.可以使用Data流的方法
4.特殊方法:readObject()和writeObject()
對象的序列化和還原序列化
1.對象的序列化:將程式中的對象,持久化的儲存在檔案中的過程ObjectOutStream
2.對象的還原序列化:將檔案中儲存的對象,重新讀取到程式中的過程。ObjectInputStream
如果要對實體類對象進行序列化,實體類需要實現Serializable(可序列化)介面,
添加一個序列化版本號碼private static final long serialVersionUID = 4992258028211704199L;
若果不添加序列化版本號碼,當序列化一個對象後,如果實體類屬性有增刪,再進行還原序列化時會造成錯誤
java.io.InvalidClassException,因為系統認為這已經不是同一個類
注意雖然叫對象的序列化,但是使用這readObject()和writeObject()這兩個方法可以直接傳入一個對象集合
readObject()和writeObject()方法也存在EOFException這個異常,解決辦法同
DataInputStream和DataOutputStream中的readInt()等方法
http://note.youdao.com/noteshare?id=506c27323c6b8a0b6cf3d1f7f97639eb&sub=C87F25CC0E7342558556C89380D7E2AF
四、字元流1.Reader、Writer
1.在處理資料單元時,以一個字元作為單位,而位元組流是以一個位元組作為單位
2.字元的基類:Reader、Writer(抽象類別)
FileReader、FileWrite是直接繼承自抽象類別的兩個字元基本流
3、FileReader、FileWrite在讀寫檔案的時候,只能使用系統預設編碼格式;
無法指定編碼,如果檔案格式與系統預設格式不一致,那使用這兩個方法讀寫將造成中文亂碼
4.雖然算不上緩衝流,但是不 flush()會導致寫不進去,讀不出來
2.InputStreamReader、OutputStreamWriter
1.將位元組流轉為字元流,同時支援自訂讀寫的編碼格式
2.常見的編碼格式
ASCLL:美國標準訊息碼;
ISO8859-1:西歐洲碼;
ANSI編碼,可以分為很多種:
簡體中文:GB2312、GBK
繁體中文:big-5
日文中文...
Unicode編碼:國際標準碼,相容絕大多數國家的編碼格式
可以分為:UTF-6、UTF-8、UTF-16
下面兩行把一個utf-8格式的字串先分解成一個字元數組b,然後使用new String(b,"GBK")產生一個新的GBK格式的字串s1
String s = "中國fdhasfdj";
byte[] b = s.getBytes("UTF-8");
String s1 = new String(b,"GBK");
3.BufferedReader、BufferedWriter
BufferedWriter 和 BufferedReader 為帶有預設緩衝的字元輸出輸入資料流,因為有緩衝區所以效率比沒有緩衝區的很高。
1、BufferedWriter 類
構造方法:bufferedWriter bf = new bufferedWriter(Writer out );
主要方法:void write(char ch);//寫入單個字元。
void write(char []cbuf,int off,int len)//寫入字元資料的某一部分。
void write(String s,int off,int len)//寫入字串的某一部分。
void newLine()//寫入一個行分隔字元。
void flush();//重新整理該流中的緩衝。將緩衝資料寫到目的檔案中去。
void close();//關閉此流,再關閉前會先重新整理他。
2、BufferedReader類。
構造方法:BufferedReader br = new BufferReader(Reader in);
主要方法:int read();//讀取單個字元。
int read(char[] cbuf,int off,int len);//將字元讀入到數組的某一部分。返回讀取的字元數。達到尾部 ,返回-1。
String readLine(); //讀取一個文本行。
void close(); //關閉該流。並釋放與該流相關的所有資源。
Java IO流總結