复制文件的功能与原始文件不同

A Duplicate file functions differently than original

我有一个 Java 包装在可执行文件中的 jar 文件。双击时效果很好。

我尝试逐字节复制文件并将其重写为新的可执行文件。

当我尝试 运行 这个新副本时,我收到一个错误消息框:

我用来复制文件字节的代码如下:

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.. 我以为读取所有字节就是这个意思?

我尝试删除副本并再次 运行ning 代码,但错误仍然存​​在。关于我做错了什么的任何想法?

您正在以字节流的形式读取文件,将它们隐式转换为 chars,然后写入 chars。使用 OutputStreams 写入字节(使用 InputStreams 读取字节)。使用 Writers 和 Readers 写入和读取 chars.

一般来说,如果您有一个字节数组,然后将其转换为字符并返回可能会完全破坏它。例如,您的示例 可能 (取决于平台)导致文件编码为 UTF-8。

你可以这样试试:

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