網(wǎng)站a記錄的是做cname營銷方案怎么寫?
目錄
文件字節(jié)輸入流:每次讀取多個字節(jié)
實例演示
注意事項
文件字節(jié)輸入流:一次讀取完全部字節(jié)
方式一
方式二
注意事項
文件字節(jié)輸入流:每次讀取多個字節(jié)
用到之前介紹過的常用方法:
實例演示
需求:用每次讀取多個字節(jié)的方法讀出File文件的內(nèi)容
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class FileInputStreamTest2 {public static void main(String[] args) throws Exception {//1.創(chuàng)建一個字節(jié)輸入流對象代表字節(jié)輸入流管道與源文件接通。InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");//2.開始讀取文件中的字節(jié)數(shù)據(jù):每次讀取多個字節(jié)。//public int read(byte b[]) throws IoException//每次讀取多個字節(jié)到字節(jié)數(shù)組中去,返回讀取的字節(jié)數(shù)量,讀取完畢會返回-1byte[] buffer = new byte[3];int len = is.read(buffer);String rs = new String(buffer);System.out.println(rs);System.out.println("當前讀取的字節(jié)數(shù)量:" + len);//目標文件有5個字節(jié),需要再讀取一次//注意:讀取多少,倒出多少int len2 = is.read(buffer);String rs2 = new String(buffer,0,len2);System.out.println(rs2);System.out.println("當前讀取的字節(jié)數(shù)量:" + len2);int len3 = is.read(buffer);System.out.println(len3); //-1is.close(); //關(guān)閉流}
}
運行結(jié)果:
使用循環(huán)改造一下
package user.IOTestOne;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class FileInputStreamTest2 {public static void main(String[] args) throws Exception {//1.創(chuàng)建一個字節(jié)輸入流對象代表字節(jié)輸入流管道與源文件接通。InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");//使用循環(huán)byte[] buffer = new byte[3];int len; //記住每次讀取了多少個字節(jié)while((len = is.read(buffer)) != -1){//注意:讀取多少,倒出多少String rs = new String(buffer,0,len);System.out.println(rs);}//性能得到了明顯的提升//但是這種方案也不能避免讀取漢字輸出亂碼的問題is.close(); //關(guān)閉流}
}
運行結(jié)果:
注意事項
- 使用FilelnputStream每次讀取多個字節(jié),讀取性能得到了提升,但讀取漢字輸出還是會亂碼。
使用字節(jié)流讀取中文,如何保證輸出不亂碼,怎么解決?
- 定義一個與文件一樣大的字節(jié)數(shù)組,一次性讀取完文件的全部字節(jié)。
文件字節(jié)輸入流:一次讀取完全部字節(jié)
方式一
自己定義一個字節(jié)數(shù)組與被讀取的文件大小一樣大,然后使用該字節(jié)數(shù)組,一次讀完文件的全部字節(jié)。
方法名稱 | 說明 |
---|---|
public int read(byte[] buffer) | 每次用一個字節(jié)數(shù)組去讀取,返回字節(jié)數(shù)組讀取了多少個字節(jié),如果發(fā)現(xiàn)沒有數(shù)據(jù)可讀會返回-1. |
注意:文件存于硬盤中,硬盤的大小是極大的,文件的大小也可能會很大;但是我們定義的數(shù)組實際上存儲于內(nèi)存中,內(nèi)存是很小的,無法給數(shù)組定義很大的長度;因此,這個方法只適合讀取不那么大的文件。
選取案例還是那個File文件
package user.IOTestOne;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamTest3 {public static void main(String[] args) throws Exception{//1.創(chuàng)建一個字節(jié)輸入流管道與源文件接通InputStream is = new FileInputStream("HelloWorld/src/file.txt");//2.準備一個字節(jié)數(shù)組,大小與文件的大小正好一樣大。File f = new File("HelloWorld/src/file.txt");long size = f.length();byte[] buffer = new byte[(int) size];int len = is.read(buffer);System.out.println(new String(buffer));System.out.println("文件大小:" + size + "字節(jié)");System.out.println(len);is.close();}
}
運行結(jié)果:
方式二
- Java官方為lnputStream提供了如下方法,可以直接把文件的全部字節(jié)讀取到一個字節(jié)數(shù)組中返回。
方法名稱 | 說明 |
---|---|
public byte[] readAllBytes()throws IOException | 直接將當前字節(jié)輸入流對應的文件對象的字節(jié)數(shù)據(jù)裝到一個字節(jié)數(shù)組返回 |
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamTest3 {public static void main(String[] args) throws Exception{//1.創(chuàng)建一個字節(jié)輸入流管道與源文件接通InputStream is = new FileInputStream("HelloWorld/src/file.txt");byte[] buffer = is.readAllBytes(); //JDK8 之后新增的方法System.out.println(new String(buffer));is.close();}
}
運行結(jié)果:
注意事項
直接把文件數(shù)據(jù)全部讀取到一個字節(jié)數(shù)組可以避免亂碼,是否存在問題?
- 如果文件過大,創(chuàng)建的字節(jié)數(shù)組也會過大,可能引起內(nèi)存溢出。
其實,讀寫文本內(nèi)容本適合用字符流。
字節(jié)流適合做數(shù)據(jù)的轉(zhuǎn)移,如:文件復制等。
下篇就開始介紹字符流。
END
學習自:黑馬程序員——Java課程