我有一个包装在可执行文件中的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感到好奇。我认为阅读所有字节都意味着什么?
我尝试删除副本并再次运行代码,但错误仍然存在。关于我做错了什么的任何想法?
答案 0 :(得分:1)
您正在以字节流的形式读取文件,隐式地将它们转换为char
,然后编写char
s。使用OutputStream
s写入字节(和InputStream
s来读取字节)。使用Writer
和Reader
来撰写和阅读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);