復制文件為什麼不能用字元流
1. Java非文本文件為什麼不能用字元流讀取
用FileReader(java中讀字元流的類)讀一個非文本文件,然後用FileWriter(java中寫字元流的類)寫出去.在讀文件時,用默認的編碼一個字元一個字元的讀取,對於有的位元組,默認編碼根本就不認識,於是打了一個問號(可以用txt打開看到許多問號),導致在讀取的時候字元文件里就已經有了很多問號,信息就已經失去了很多.然後即使你在寫入文件時採用同樣的編碼,那也沒有用了,因為在讀的時候就已經出問題了呀.
2. 怎麼利用JAVA《使用字元流實現文本文件的拷貝》
import java.io.*public class Demo{public static void main(String[] args) throws Exception{ File srcFile=new File("./srcDemo.txt");//源文件 File orgFile=new File("./orgDemo.txt");//目標文件 FileInputStream input=new FileInputStream(srcFile);//文件輸入流 FileOutputStream output=new FileOutputStream(orgFile);//文件輸出流 byte[] buf=new byte[4049];//緩沖 for(int size=0;size!=-1;size=input.read(buf)){ output.write(buf,0,size);//將緩沖區位元組寫入到輸出流中 output.flush();//將輸出流內容直接寫到文件中 } output.close();//關閉流 input.close();}}
3. 為什麼用JAVA寫的一個復制文本文檔的程序復制出來文本文檔亂碼
造成亂碼有很多的原因:比如文件編碼等
但是這段程序亂碼是因為字元流和位元組流混用造成的亂碼
讀取是用的帶緩沖區的字元流 BufferedReader 這是按字元讀入
寫入磁碟是的是位元組流 FileOutputStream這是按位元組寫出
解決辦法,配套使用,字元流和位元組流
一:下面使用位元組流復制文本
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
publicclassDemo{
publicstaticvoidmain(String[]args)throwsException{
Filefile=newFile("c:\123.txt");
FileOutputStreamfos=newFileOutputStream(newFile("C:\123COPY.txt"));
FileInputStreambr=newFileInputStream(file);
intlen;
while((len=br.read())!=-1){
fos.write(len);
}
br.close();
fos.close();
}
}
二:下面使用字元流復制文本
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileReader;
importjava.io.FileWriter;
publicclassDemo2{
publicstaticvoidmain(String[]args)throwsException{
Filefile=newFile("c:\123.txt");
BufferedReaderbr=newBufferedReader(newFileReader(file));
BufferedWriterbw=newBufferedWriter(newFileWriter(newFile("c:\123.txt")));
//使用BufferedReader的時候,按照習慣,一般不會使用br.read()方法,
//大家最喜歡用BufferedReader,因為他每次可以讀取一行,非常方便
Stringtemp;
while((temp=br.readLine())!=null){
bw.write(temp);//每次寫入一行.
bw.newLine();//並且進行換行
}
br.close();
bw.close();
}
}
4. word文檔能使用字元流操作嗎
不能。因為Word文檔不是純文本文件,除了文字還包含很多格式信息。不能用字元流操作,可以用位元組流操作。
5. 編寫一個程序Copy,使用字元流實現對文本文件的復制,要求需要復制的源文件和復制後的目標文件的路徑及名
程序如下:
--------------------------------------------------------------
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.FileNotFoundException;
publicclass{
publicstaticvoidmain(Stringargs[]){
if(args.length<2){
System.out.println("請按以下格式輸入:java原路徑目標路徑");
return;
}
try{
FileReaderreader=newFileReader(args[0]);
FileWriterwriter=newFileWriter(args[1]);
intc=-1;
while((c=reader.read())!=-1)
writer.write(c);
reader.close();
writer.close();
}catch(FileNotFoundExceptionfnfe){
System.out.println("原文件不存在!");
return;
}catch(IOExceptionioe){
System.out.println("拷貝失敗!");
return;
}
System.out.println("拷貝成功!");
}
}
-----------------------------------------------------------------
運行程序時輸入如下命令:
java原文件路徑新文件路徑
-----------------------------------------------------------------
截圖如下:
6. java求助 剛學IO流,為什麼復制後的mp3播放失敗,哪裡寫錯了
原因是字元流Reader,Writer只能讀取文本文件,文本文件指使用記事本打開能看懂的文件,比如.java,.sql,.txt,.xls等等,MP3不屬於文本文件,所以需要你把字元流改為位元組流來進行讀寫操作,比如InputStream,OutputStream.你可以取了解字元流和位元組流的區別,字元讀寫文本,位元組都可以讀寫
鑒於你剛學,下面我有具體代碼實現圖,最後一張
7. java文件復制(bufferedreader讀取一個文件內容,用bufferedwriter 寫入到另一個文件)
可以通過BufferedReader 流的形式進行流讀取,之後通過readLine方法獲取到每行的內容,之後通過bufferedwriter (如:OutputStreamWriter)。
BufferedReader bre = null;
OutputStreamWriter pw = null;//定義一個流
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此時獲取到的bre就是整個文件的緩存流
pw = new OutputStreamWriter(new FileOutputStream(「D:/test.txt」),"GBK");//確認流的輸出文件和編碼格式,此過程創建了「test.txt」實例
while ((str = bre.readLine())!= null) // 判斷最後一行不存在,為空結束循環
{
pw.write(str );//將要寫入文件的內容,寫入到新文件
};
pw.close();//關閉流
bre .close();//關閉流
備註:文件流用完之後必須及時通過close方法關閉,否則會一直處於打開狀態,直至程序停止,增加系統負擔。
8. 用java控制流實現文件復制後,不能刪除文件
是因為你用流調用File文件後沒有關閉流導致的,這時外部不能刪除該文件。等退出程序後就可以刪除該文件。
9. 關於java流的問題,位元組流與字元流,為什麼要用轉換流,把位元組轉換成字元流,為什麼不直接用字元流
這是因為有一些時候系統給你提供的只有位元組流,比如說System.in標准輸入流。就是位元組流。你想從他那裡得到用戶在鍵盤上的輸入,只能是以轉換流將它轉換為Reader以方便自己的程序讀取輸入。再比如說Socket里的getInputStream()很明顯只給你提供位元組流,你要不行直接用,就得給他套個InputStreamReader()用來讀取。網路傳輸來的字元。希望能夠幫到你。