更新時間:2020-08-26 15:47:29 來源:動力節(jié)點 瀏覽2519次
在Android開發(fā)中,文件操作還是比較頻繁的,本文主要記錄下文件的加載,寫入等相關(guān)操作的使用。
流的分類
在Java程序中操作文件,都是以流的形式來操作
首先按照流向可以分為輸入流與輸出流兩種,這里的輸入輸出是站在內(nèi)存的角度而言的,流向內(nèi)存的為輸入流,流出內(nèi)存的為輸出流
按照傳輸?shù)膯挝豢梢苑譃樽止?jié)流與字符流,字節(jié)流傳輸?shù)氖嵌M(jìn)制字節(jié),可操作任何類型的文件,字符流傳輸?shù)氖亲址?,只能用來讀取文本文件
字節(jié)流有兩個抽象的父類,InputStram和outputStream,本文主要記錄文件的操作,其他的具體實現(xiàn)類暫不討論,主要看一下經(jīng)常使用的幾個字節(jié)流實現(xiàn)類的使用。
針對文件操作的字節(jié)流主要包括FileInputStream與FileOutputStream
向磁盤寫入文件
?File?destFile?=?new?File(filePath);
????????????FileOutputStream?fileOutputStream?=?new?FileOutputStream(destFile);
????????????fileOutputStream.write(content.getBytes());
????????????fileOutputStream.close();
寫入文件比較簡單,傳入一個File對象構(gòu)造FileOutputStream的對象,然后調(diào)用write方法即可,最后一定要調(diào)用close,釋放資源
從磁盤讀取文件
FileInputStream?fileInputStream?=?new?FileInputStream(file);
????????????byte[]?bytes?=?new?byte[1024];
????????????int?i;
????????????while((i=fileInputStream.read(bytes))!=-1){
????????????????stringBuilder.append(new?String(bytes,0,i));
????????????}
????????????Log.i(TAG,?stringBuilder.toString());
????????????fileInputStream.close();
相對于從磁盤讀入內(nèi)存,讀取文件多了幾行代碼,但也很好理解。需要聲明一個byte類型的數(shù)組,用于每次讀取時將數(shù)據(jù)存入該數(shù)組,聲明一個整型i用于保存一次讀取到的字節(jié)數(shù)。最后再根據(jù)將字節(jié)數(shù)組轉(zhuǎn)換成需要的類型,最后也需要調(diào)用close釋放資源
緩沖流
緩沖流相對于上述的字節(jié)流字符流并不是一個層面的東西,它并不具備直接操作文件的能力,而是要基于上述的字節(jié)流和字符流為基礎(chǔ)。之所以要設(shè)計緩沖流這個東西,是為了提高讀寫效率,因為緩沖是利用了將數(shù)據(jù)先緩存起來,然后再一起寫入或讀出,避免頻繁的磁盤IO操作,提高讀寫速度。
針對字節(jié)流的緩沖流類有BufferedoutputStream和BufferedInputStream,實際這兩個類的設(shè)計利用了裝飾者模式,利用它可以把FileInputStream與FileOutputStream給包起來,然后操作文件
向磁盤寫入文件
????FileOutputStream?fileOutputStream?=?new?FileOutputStream(destFile);
????????????BufferedOutputStream?bufferedOutputStream?=?new?BufferedOutputStream(fileOutputStream);
????????????bufferedOutputStream.write(content.getBytes());
????????????bufferedOutputStream.flush();
????????????bufferedOutputStream.close();
使用的邏輯和FileInputStream差不多,只是包了一層,最后還調(diào)用了flush,用于刷新,相當(dāng)于向磁盤寫入一次
從磁盤讀取文件
?FileInputStream?fileInputStream?=?new?FileInputStream(file);
????????????BufferedInputStream?bufferedInputStream?=?new?BufferedInputStream(fileInputStream);
????????????byte[]?bytes?=?new?byte[1024];
????????????int?i;
????????????while((i=bufferedInputStream.read(bytes))!=-1){
?????????????????stringBuilder.append(new?String(bytes,0,i));
????????????}
????????????fileInputStream.close();
????????????bufferedInputStream.close();
使用方式與FileOutputStream也差不多,只是用BufferedInputStream把他包了起來
字符流主要包括FileWriter和FileReader,字符緩沖流BufferedWriter,BufferedReader,用法與上述的字節(jié)流基本一致,只不過調(diào)用read之后獲取到的是字符類型,需要用char類型的數(shù)組去接收
FileReader?fileReader?=?new?FileReader(file);
????????????BufferedReader?bufferedReader?=?new?BufferedReader(fileReader);
????????????char[]?chars?=?new?char[1024];
????????????int?charInt;
????????????while?((charInt?=?bufferedReader.read(chars))!=-1){
????????????????Log.i(TAG,"char:"+new?String(chars,0,charInt));
????????????????stringBuilder.append(new?String(chars,0,charInt));
????????????}
????????????Log.i(TAG,"stringResult?:?"+stringBuilder.toString());
????????????fileReader.close();
????????????bufferedReader.close();
另外在BufferedReader中還提供了readLine方法,按行讀取文本文件
?FileReader?fileReader?=?new?FileReader(file);
????????????BufferedReader?bufferedReader?=?new?BufferedReader(fileReader);
????????????String?s;
????????????while?((s=bufferedReader.readLine())!=null){
????????????????stringBuilder.append(s);
????????????}
????????????Log.i(TAG,"stringResult?:?"+stringBuilder.toString());
????????????fileReader.close();
????????????bufferedReader.close();
以上就是動力節(jié)點java培訓(xùn)機(jī)構(gòu)的小編針對“Java文件輸入輸出流,初學(xué)者的基礎(chǔ)學(xué)習(xí)”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。