复制文件的功能与原始文件不同
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 代码,但错误仍然存在。关于我做错了什么的任何想法?
您正在以字节流的形式读取文件,将它们隐式转换为 char
s,然后写入 char
s。使用 OutputStream
s 写入字节(使用 InputStream
s 读取字节)。使用 Writer
s 和 Reader
s 写入和读取 char
s.
一般来说,如果您有一个字节数组,然后将其转换为字符并返回可能会完全破坏它。例如,您的示例 可能 (取决于平台)导致文件编码为 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);
我有一个 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 代码,但错误仍然存在。关于我做错了什么的任何想法?
您正在以字节流的形式读取文件,将它们隐式转换为 char
s,然后写入 char
s。使用 OutputStream
s 写入字节(使用 InputStream
s 读取字节)。使用 Writer
s 和 Reader
s 写入和读取 char
s.
一般来说,如果您有一个字节数组,然后将其转换为字符并返回可能会完全破坏它。例如,您的示例 可能 (取决于平台)导致文件编码为 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);