2015-02-11 17 views
0

我有一個包裝在可執行文件中的Java jar文件。雙擊時效果很好。重複文件的功能與原始版本不同

我嘗試複製文件逐字節並重寫它到一個新的可執行文件。

當我嘗試運行這個新的副本,我得到一個錯誤消息框:File not compatable

我用來複制文件的字節代碼如下:

import java.nio.file.*; 
import java.io.*; 

public class Exec { 

    public static void main(String args[])throws Exception { 

     byte[] data = Files.readAllBytes(Paths.get("C:\\Users\\Dziugas\\Desktop\\Darts.exe")); 

     File x = new File("C:\\Users\\Dziugas\\Desktop\\file.exe"); 

     if(!x.exists()) 
      x.createNewFile(); 

     BufferedWriter writer = new BufferedWriter(new FileWriter(x, true)); 

     for(byte b: data) 
      writer.write(b); 

     writer.close(); 

    } 


} 

的大小該副本與原始副本相同。這讓我想知道Java的I/O API ..我認爲讀取所有字節意味着什麼?

我試着刪除副本並再次運行代碼,但錯誤仍然存​​在。關於我在做什麼的任何想法都是錯誤的?

回答

1

您正在以字節流的形式讀取文件,將其隱式轉換爲char s,然後編寫char s。使用OutputStream s寫入字節(並且InputStream s讀取字節)。使用Writer s和Reader s來書寫和讀取char s。

一般來說,如果你有一個字節數組,然後將它轉換爲字符並返回可能會完全破壞它。例如,您的示例可能(取決於平臺)導致文件編碼爲UTF-8。

+0

母鹿爲char適用於文件類的所有字節流或只是方法的轉換? – Dziugas 2015-02-11 07:49:33

+0

@Dziugas它既不適用於字節流也不適用於'文件'。它是*你的代碼*,它用'byte'調用'Writer.write(char)'(隱式地將字節轉換爲char)。 – immibis 2015-02-11 08:14:02

0

你可以試試這個方法:

Path pathFrom = Paths.get("C:\\Users\\Dziugas\\Desktop\\Darts.exe"); 
Path pathTo = Paths.get("C:\\Users\\Dziugas\\Desktop\\file.exe"); 
Files.copy(pathFrom, pathTo, StandardCopyOption.COPY_ATTRIBUTES); 
相關問題