关于文件流的使用
文件流共有四類(lèi),(FileOutputStream)文件字節(jié)輸出流,(FileInputStream)文件字節(jié)輸入流,(FileWriter)文件字符輸出流,(FileReader)文件字符輸入流。
輸入流是用來(lái)從文件中讀取數(shù)據(jù)到內(nèi)存中,輸出流的作用是寫(xiě)入數(shù)據(jù)到文件中。
先看(FileOutputStream)文件字節(jié)輸出流:
try { // FileOutputStream out=new FileOutputStream(path); 如果只傳入一個(gè)參數(shù)path,則第二個(gè)參數(shù)默認(rèn)為false,即原文件內(nèi)容會(huì)新的寫(xiě)入的內(nèi)容被覆蓋out=new FileOutputStream(path,true); //如果后面參數(shù)為true,則在原內(nèi)容基礎(chǔ)上append新內(nèi)容String s="hello world"; // out.write(s.getBytes()); 將字符串轉(zhuǎn)換為字節(jié)數(shù)組,然后寫(xiě)到文件中out.write(s.getBytes(),0,5); //表示只讀取數(shù)組中的0到5位} catch (IOException e) {e.printStackTrace();}finally {try {if(out!=null){out.close(); //不要忘記關(guān)閉流 }} catch (IOException e) {e.printStackTrace();}}
注意這里的 path 的上級(jí)文件夾一定要全部都存在,否則會(huì)報(bào)錯(cuò),提示找不到文件路徑。
?
(FileInputStream)文件字節(jié)輸入流
FileInputStream in=null;try { // File f=new File(path); // in=new FileInputStream(f); //可傳入File對(duì)象in=new FileInputStream(path); //也可直接傳入pathint i;while((i=in.read())!=-1) { //in.read()每次返回?cái)?shù)據(jù)中的一個(gè)字節(jié),當(dāng)讀到結(jié)束,會(huì)返回-1System.out.print((char)i); //將字節(jié)轉(zhuǎn)換為字符,然后讀出 }} catch (IOException e) {e.printStackTrace();}finally {try {if(in!=null){in.close(); //關(guān)閉流 }} catch (IOException e) {e.printStackTrace();}}
該方法將數(shù)據(jù)一個(gè)字節(jié)一個(gè)字節(jié)地讀取出來(lái)
還有一個(gè)方法是建立一個(gè)byte數(shù)組,將該數(shù)組作為緩沖區(qū)將數(shù)據(jù)一段一段的讀出
FileInputStream in=null;try { // File f=new File(path); // in=new FileInputStream(f); //可傳入File對(duì)象in=new FileInputStream(path); //也可直接傳入pathbyte[] buffer=new byte[1024]; //創(chuàng)建一個(gè)1024K的byte數(shù)組 // int len = in.read(buffer); // 注意,當(dāng)read()方法中傳入數(shù)組時(shí),返回的值就變成了 讀取的數(shù)據(jù)的長(zhǎng)度,而不是返回?cái)?shù)據(jù)中的一個(gè)字節(jié) // System.out.println(new String(buffer,0,len)); //根據(jù)讀取的數(shù)據(jù)的長(zhǎng)度打印出數(shù)據(jù)內(nèi)容,這樣就把多余的緩存區(qū)的空格省略掉了System.out.println(new String(buffer).trim()); //也可以直接使用trim()方法去掉空格,和上面一行代碼效果相同} catch (IOException e) {e.printStackTrace();}finally {try {if(in!=null){in.close(); //關(guān)閉流 }} catch (IOException e) {e.printStackTrace();}}
?
?
(FileOutputStream)文件字節(jié)輸出流和(FileInputStream)文件字節(jié)輸入流結(jié)合使用的案例:
把一個(gè)文件的內(nèi)容讀出,然后存到存入另一個(gè)文件中
String path2="C://Users/wcl/Desktop/demo2.txt";FileInputStream in=null;FileOutputStream out=null;try {in=new FileInputStream(path);out=new FileOutputStream(path2);byte[] buffer=new byte[1024];int len; // while((len=in.read(buffer))!=-1){ //一直向數(shù)組中讀取數(shù)據(jù) // String s=new String(buffer).trim(); //先從byte數(shù)組中取出轉(zhuǎn)化為String型 // out.write(s.getBytes(), 0, len); //再將字符串轉(zhuǎn)換成byte型數(shù)據(jù),寫(xiě)入文件中 // }len=in.read(buffer); //也可以先獲取讀取文件的長(zhǎng)度for (int i = 0; i < len; i++) { //然后for循環(huán)從byte數(shù)組中取出數(shù)據(jù)寫(xiě)入demo2.txt文件中,和上面的效果相同out.write(buffer[i]);}
out.flush(); //把緩沖區(qū)內(nèi)容強(qiáng)制寫(xiě)出,清空緩沖區(qū),防止有剩余數(shù)據(jù)未寫(xiě)出} catch (IOException e) {e.printStackTrace();}finally {try {if(out!=null){out.close();}if(in!=null){in.close();}} catch (IOException e) { e.printStackTrace();}}
?
使用字符輸入流和字節(jié)輸入流的操作和字節(jié)流基本相同,只不過(guò)字節(jié)流是以 byte 為基本單元,而字符流是以 char 為基本單元。
不過(guò)我們要注意一下兩者使用的場(chǎng)景,一般當(dāng)我們?cè)谔幚?音頻文件、圖片 等類(lèi)型的文件時(shí),一般用字節(jié)流。而如果是處理中文內(nèi)容的,最好使用字符流。
?
以下內(nèi)容為從網(wǎng)上收集:
字符流處理的單元為2個(gè)字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個(gè)字節(jié),?操作字節(jié)和字節(jié)數(shù)組。所以字符流是由Java虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個(gè)字節(jié)的Unicode字符為單位的字符而成的,所以它對(duì)多國(guó)語(yǔ)言支持性比較好!如果是?音頻文件、圖片、歌曲,就用字節(jié)流好點(diǎn),如果是關(guān)系到中文(文本)的,用字符流好點(diǎn).?
?????所有文件的儲(chǔ)存是都是字節(jié)(byte)的儲(chǔ)存,在磁盤(pán)上保留的并不是文件的字符而是先把字符編碼成字節(jié),再儲(chǔ)存這些字節(jié)到磁盤(pán)。在讀取文件(特別是文本文件)時(shí),也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取以形成字節(jié)序列.?
??????字節(jié)流可用于任何類(lèi)型的對(duì)象,包括二進(jìn)制對(duì)象,而字符流只能處理字符或者字符串;?2.?字節(jié)流提供了處理任何類(lèi)型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。
轉(zhuǎn)載于:https://www.cnblogs.com/weimore/p/7253212.html
總結(jié)
- 上一篇: 《题山石榴花》第七句是什么
- 下一篇: 『Scrapy』爬虫框架入门