File duplikat berfungsi berbeda dari aslinya

Saya memiliki file jar Java yang dibungkus dengan file yang dapat dieksekusi. Ini berfungsi dengan baik ketika diklik dua kali.

Saya mencoba menyalin file byte demi byte dan menulis ulang ke file executable baru.

Ketika saya mencoba menjalankan salinan baru ini, saya mendapatkan kotak pesan kesalahan: File tidak kompatibel

Kode yang saya gunakan untuk menyalin byte file adalah sebagai berikut:

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();

    }


}

Ukuran salinannya sama dengan aslinya. Ini membuat saya bertanya-tanya tentang API I/O Java.. Saya pikir membaca semua byte maksudnya persis seperti itu?

Saya mencoba menghapus salinannya dan menjalankan kodenya lagi, tetapi kesalahan terus berlanjut. Adakah ide tentang kesalahan yang saya lakukan?


person Dziugas    schedule 11.02.2015    source sumber


Jawaban (2)


Anda membaca file sebagai aliran byte, secara implisit mentransmisikannya ke chars, lalu menulis chars. Gunakan OutputStreams untuk menulis byte (dan InputStreams untuk membaca byte). Gunakan Writers dan Readers untuk menulis dan membaca chars.

Secara umum, jika Anda memiliki array byte, mengonversinya menjadi karakter dan sebaliknya dapat merusaknya sepenuhnya. Misalnya, contoh Anda mungkin (bergantung pada platformnya) mengakibatkan file dikodekan sebagai UTF-8.

person user253751    schedule 11.02.2015
comment
Apakah konversi ke char berlaku untuk semua aliran byte atau hanya metode di kelas Files? - person Dziugas; 11.02.2015
comment
@Dziugas Ini tidak berlaku untuk aliran byte atau Files. Ini adalah kode Anda, yang memanggil Writer.write(char) dengan byte (secara implisit mentransmisikan byte ke char). - person user253751; 11.02.2015

Anda dapat mencoba cara ini:

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);
person ARIS    schedule 11.02.2015