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

时间:2015-02-11 07:34:14

标签: java io copy byte

我有一个包装在可执行文件中的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感到好奇。我认为阅读所有字节都意味着什么?

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

2 个答案:

答案 0 :(得分:1)

您正在以字节流的形式读取文件,隐式地将它们转换为char,然后编写char s。使用OutputStream s写入字节(和InputStream s来读取字节)。使用WriterReader来撰写和阅读char s。

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

答案 1 :(得分: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);