JAVA學習第四十八課 — IO流(二):檔案的複製 & 緩衝區1,javaio
一、複製文字檔
將G盤的文字檔複製到D盤上
也就是 讀取G盤中文字檔的資料,寫入D盤中->連讀帶寫
而剪下呢,就是連讀帶寫後,刪除原盤的檔案
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("G盤.txt");fw = new FileWriter("D:\\ACM.txt");char[] ch = new char[1024];//緩衝讀取的資料int t ;while((t = fr.read(ch))!=-1){fw.write(ch,0,t);}} catch (Exception e) {System.out.println("讀寫失敗");}finally{if(fw!=null){try {fw.close();} catch (Exception e2) {throw new RuntimeException();}}if(fr!=null){try {fr.close();} catch (Exception e2) {throw new RuntimeException();}}}}}</strong></span>
一個檔案如果正在使用,是不能被刪除的,所以注意要將這兩個動作關聯起來
二、字元流的緩衝區
實際上,上面的char[]數組就是一個緩衝區,緩衝區的出現提高了對資料的讀取效率
BufferedWriter類、BufferedReader類
前提:緩衝區必須結合流才能使用
作用:在流的基礎上對流的功能進行了增強
BufferWriter類示範
將文本寫入字元輸出資料流,緩衝各個字元,從而提供單個字元、數組和字串的高效寫入。
可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。
特有方法:newLine()
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("ACM.txt");//建立一個字元寫入流的緩衝區對象,並和指定要被緩衝的流對象相關聯 BufferedWriter bw = new BufferedWriter(fw);//使用緩衝去的方法,將資料寫入到緩衝區中bw.write("ACM。。。。");bw.newLine();//實際上 System.getproperty("line.separator");bw.write("acm");//在用緩衝去的重新整理方法,將資料寫入目的地bw.newLine();bw.flush();for(int i = 0;i<5;i++){bw.write("1111");bw.newLine();bw.flush();}//關閉緩衝區,其實關閉的就是被緩衝的流對象fwbw.close();}}</span>
BufferedReader類示範
從字元輸入資料流中讀取文本,緩衝各個字元,從而實現字元、數組和行的高效讀取。
可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。
特有方法:readLine()
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("ACM.txt");BufferedReader br = new BufferedReader(fr);String str = null;while((str = br.readLine())!= null){System.out.println(str);}br.close();}}</strong></span>
注意:
readLine()方法:使用了讀取緩衝區的read方法,將讀取到的字元進行緩衝並判斷換行標記,將標記前的緩衝資料變成字串並返回
JAVA IO流複製檔案內容
呃,簡單地說是因為你對同一個檔案同一次讀取進行兩次,第一次while讀取完後,你本意是僅僅想看看裡面到底是什麼東西,所以你命令fis一個位元組一個位元組地往下讀,直到fis讀取到檔案的末尾(此時while裡面的!=-1條件為假),但事實上是,你認為你在看,其實你是在讀。你看完後不滿足又想看一次,你讓fis梅開二度,又用另一個while去命令同一個fis一個位元組一個位元組的往下讀,但早在第一個while結束後,fis已經卡在了檔案的末尾了,再命令fis去read返回的永遠都是-1,所以此時在第二個while語句中fis執行第一次read時就跳出來了,為啥?因為fis.read()返回為-1啊。所以C就壓根沒賦到,而且即便賦值,C也只能裝下一個char啊。
至於這麼解決,思路如下:你是通過fis一個位元組一個位元組地讀取給一個int類型變數date,那麼既然date可以列印出,可以賦給char c,自然可以被寫到檔案裡面去;那麼你看看fos能不能一個位元組一個位元組地寫檔案,這樣在while中,fis每讀一個位元組,fos就把它寫檔案(想想一下這個效率吧~~)。不過一定要記住,同一個fis不可能兩次踏進同一個檔案兩次以上,一個while就玩完!!
問個JAVA書上的問題,IO流檔案複製,解答
import java.io.*;
public class Aaa{
public static void main(String[] ashs)throws IOException
{
FileInputStream fis=new FileInputStream(ashs[0]);
FileOutputStream fos=new FileOutputStream(ashs[1]);
byte[]buf=new byte[512];
int n=0;
do{
n=fis.read(buf,0,512);
fos.write(buf,0,512);
}while(n!=-1)
fis.close();
fos.close();
}
}