都是關于檔案復制的,一個是字符流,一個是位元組流
字符流

然后結果復制后的檔案亂碼位元組流的是一個實體,
public static void copyDirectory() throws IOException {
Scanner sc=new Scanner(System.in);
System.out.println("請輸入源目錄位置:");
String srcPath=sc.nextLine();//從控制臺獲取路徑
File srcFile=new File(srcPath);
System.out.println("請輸入目標位置:");
String destPath=sc.nextLine();//從控制臺獲取路徑
File destFile=new File(destPath);
//將源路徑中的內容復制到目標路徑下
FileUtils.copySrcPathTODestPath(srcFile,destFile);
}
public static void copySrcPathTODestPath(File srcFile,File destFile) throws IOException {
//創建目的地檔案夾
destFile.mkdirs();/*創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。*/
//獲取源路徑中的所有File物件
File[] files=srcFile.listFiles();
for (File file:files
) {
File dest=new File(destFile,file.getName());
//判斷當前file物件是否為目錄
if(file.isDirectory()){
//通過遞回,完成復制目錄
copySrcPathTODestPath(file,dest);
}else{
//復制檔案
FileInputStream in=new FileInputStream(file);
FileOutputStream out=new FileOutputStream(dest);
//讀
byte[] bys=new byte[1024];
int len=0;
while((len=in.read(bys))!=-1){
//寫
out.write(bys,0,len);
}
//關閉流
in.close();
out.close();
}
}
}
當我設定好源目錄和目標目錄的執行的時候
目標目錄如果是源目錄的子檔案夾就會無限復制,最后炸掉,我猜可能是遞回的問題,但我不知道怎么解決他。
正常: 源目錄 :F:\api 目標目錄: D:\Program Files
無限復制:源目錄:D:\Program Files\Java 目標目錄:D:\Program Files\Java\123
求大神幫幫我。感激不盡
uj5u.com熱心網友回復:
無限復制:源目錄:D:\Program Files\Java 目標目錄:D:\Program Files\Java\123應該是 你這邊 源目錄 復制了原來的完了 但是你下面又有一個目錄 123 又去復制這個 目錄 然后不斷復制 里面有的東西 出不來
可以判斷你的 copySrcPathTODestPath(File srcFile,File destFile) 里的srcfile是不是你新的創建的目錄是直接return去 避免無用的復制
uj5u.com熱心網友回復:
字符流是有編碼的,你的系統默認的編碼是什么?你可以用System.out.println(System.getProperty("file.encoding"));來看生成檔案會默認采用的編碼,再用 另存為 的方式查看你的src.txt的編碼,看看是否一致?
如果編碼不一致,你可以采用帶編碼的字符流,即(假設編碼為GBK)
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src.txt"), "GBK"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy.txt"), "GBK"));
至于位元組流的例子,如果目標檔案夾是源檔案夾的子檔案夾,你要把它從源檔案的物件中去掉,否則就相當于自己復制自己(而且自己因為從源檔案復制內容過來而不斷再重繪),這樣的自己復制自己每個盡頭,最終就會溢位。
改為
if(file.isDirectory() && ! file.getAbsolutePath().equals(dest.getAbsolutePath())){ //如果不是子檔案夾自己才遞回
//通過遞回,完成復制目錄
copySrcPathTODestPath(file,dest);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/78952.html
標籤:Java SE
上一篇:socket訊息推送對應用戶問題
