【问题标题】:A Duplicate file functions differently than original重复文件的功能与原始文件不同
【发布时间】:2015-02-11 07:34:14
【问题描述】:

我有一个包含在可执行文件中的 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 感到好奇。我认为 read all bytes 就是这个意思?

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

【问题讨论】:

    标签: java io copy byte


    【解决方案1】:

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

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

    【讨论】:

    • 转换为 char 是适用于所有字节流还是仅适用于 Files 类中的方法?
    • @Dziugas 它既不适用于字节流也不适用于Files。这是您的代码,它使用byte 调用Writer.write(char)(隐式将字节转换为字符)。
    【解决方案2】:

    你可以试试这个方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多