gpt4 book ai didi

java - 复制 Jar 文件而不损坏

转载 作者:行者123 更新时间:2023-12-04 08:49:48 24 4
gpt4 key购买 nike

我需要将 .jar 文件(这是我项目中的资源)从单独的可运行 jar 复制到 Windows 中的启动文件夹。这是我到目前为止的代码。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Installer {

public static void main(String[] args) throws IOException
{
InputStream source = Installer.class.getResourceAsStream("prank.jar");

byte[] buffer = new byte[source.available()];
source.read(buffer);

File targetFile = new File(System.getProperty("user.home") + File.separator + "AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\prank.jar");
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);

outStream.close();

}

}
我的问题是,复制 jar 文件后,它已损坏(尽管原始文件和副本的大小相同。)关于如何执行此操作并在过程结束时有一个可运行的 jar 的任何想法?

最佳答案

引用 InputStream#available does not work .
以下行

byte[] buffer = new byte[source.available()];
不正确,如 available 仅返回大小的估计值,当估计值与实际值不同时,jar 将被损坏。 (来自 Java – Write an InputStream to a File 的示例)似乎不正确,因为我找不到任何保证 available 正确性的引用资料为 FileInputStream .
来自 How to convert InputStream to File in Java 的解决方案更健壮,
    private static void copyInputStreamToFile(InputStream inputStream, File file)
throws IOException {

try (FileOutputStream outputStream = new FileOutputStream(file)) {

int read;
byte[] bytes = new byte[1024];

while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}

// commons-io
//IOUtils.copy(inputStream, outputStream);

}
}
你可以考虑使用
  • IOUtils#copy(InputStream, OutputStream)
  • Files#copy(InputStream, Path, CopyOption...) Holger 建议用于 jdk 1.7 或更高版本
  • 关于java - 复制 Jar 文件而不损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64148855/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com