ไฟล์ที่ซ้ำกันทำหน้าที่แตกต่างไปจากต้นฉบับ

ฉันมีไฟล์ 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();

    }


}

ขนาดของสำเนาจะเท่ากับต้นฉบับ นี่ทำให้ฉันสงสัยเกี่ยวกับ I/O API ของ Java .. ฉันคิดว่าการอ่านไบต์ทั้งหมดหมายความว่าอย่างนั้นเหรอ?

ฉันพยายามลบสำเนาและเรียกใช้โค้ดอีกครั้ง แต่ข้อผิดพลาดยังคงอยู่ มีความคิดเห็นเกี่ยวกับสิ่งที่ฉันทำผิดหรือไม่?


person Dziugas    schedule 11.02.2015    source แหล่งที่มา


คำตอบ (2)


คุณกำลังอ่านไฟล์เป็นสตรีมจำนวนไบต์ โดยส่งไปที่ chars จากนั้นจึงเขียน chars ใช้ OutputStreams เพื่อเขียนไบต์ (และ InputStreams เพื่ออ่านไบต์) ใช้ Writers และ Readers เพื่อเขียนและอ่าน chars

โดยทั่วไป หากคุณมีอาร์เรย์ไบต์ การแปลงเป็นอักขระและย้อนกลับอาจทำให้อาร์เรย์เสียหายได้ ตัวอย่างเช่น ตัวอย่างของคุณ อาจ (ขึ้นอยู่กับแพลตฟอร์ม) ส่งผลให้ไฟล์ได้รับการเข้ารหัสเป็น UTF-8

person user253751    schedule 11.02.2015
comment
การแปลงเป็นถ่านใช้กับสตรีมไบต์ทั้งหมดหรือเฉพาะวิธีการในคลาสไฟล์หรือไม่ - person Dziugas; 11.02.2015
comment
@Dziugas มันใช้กับทั้งสตรีมไบต์หรือ Files มันคือ โค้ดของคุณ ซึ่งเรียก Writer.write(char) ด้วย byte (โดยนัยคือการแปลงไบต์เป็นอักขระ) - person user253751; 11.02.2015

คุณสามารถลองวิธีนี้:

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