2015-02-11 2 views
0

У меня есть Java jar-файл, завернутый в исполняемый файл. Он работает отлично, если дважды щелкнуть.Duplicate file функционирует иначе, чем оригинал

Я попытался скопировать файл по байтам и переписать его в новый исполняемый файл.

Когда я пытаюсь запустить эту новую копию, я получаю окно с сообщением об ошибке: 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(); 

    } 


} 

Размер копия такая же, как и оригинал. Это заставляет меня задуматься о API ввода/вывода Java. Я думал, что все эти байты означают именно это?

Я попытался удалить копию и запустить код еще раз, но ошибка сохранилась. Любые идеи о том, что я делаю неправильно?

ответ

1

Вы читаете файл как поток байтов, неявно отбрасывая их до char s, а затем записывая char s. Используйте OutputStream s для записи байтов (и InputStream s для чтения байтов). Используйте Writer s и Reader s для написания и чтения char s.

В общем случае, если у вас есть массив байтов, то преобразование его в символы и обратно может полностью исказить его. Например, ваш пример может (в зависимости от платформы) приводит к тому, что файл получает кодировку как UTF-8.

+0

Doe преобразования в уголь применяется ко всем потокам байт или просто метод в классе Files? – Dziugas

+0

@Dziugas Не применяется ни к байтовым потокам, ни к файлам. Это * ваш код *, который вызывает 'Writer.write (char)' с 'byte' (неявным образом выставляя байта на символ). – immibis

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); 
Смежные вопросы