有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java写入exe文件

是否可以用Java编写/创建exe文件? 我可以成功地读取它,但将完全相同的数据写入新文件似乎会带来一些麻烦,因为Windows告诉我,我的电脑不再支持它

这是我用来读取文件的代码,其中path是用实际的path给出的String(它在.jar本身中,这就是我使用ResourceAsStream()的原因):

try {
    InputStream inputStream = FileIO.class.getResourceAsStream(path);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    ArrayList<String> _final = new ArrayList<String>();
    String line;
    while ((line = reader.readLine()) != null) {
        _final.add(line);
    }
    inputStream.close();
    return _final.toArray(new String[_final.size()]);
}catch(Exception e) {
    return null;
}

这是我用来编写文件的代码:

public static void writeFileArray(String path, String[] data) {
    String filename = path;
    try{
        FileWriter fileWriter = new FileWriter(filename);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        for(String d : data) {
            bufferedWriter.write(d + "\n");
        }
        bufferedWriter.close();
    }
    catch(IOException ex){
        System.out.println("FileIO failed to write file, IO exception");
    }
}

所以它不会给我任何错误或其他东西,也不会给我原始文件的大小。exe和“已转移”。exe保持不变,但不再工作。我只是做错了吗?我忘了什么吗?你能用Java做到这一点吗

顺便说一句,我没有读/写文件的经验

谢谢你考虑我的要求


共 (3) 个答案

  1. # 1 楼答案

    当您使用Java7或更新版本时,您应该使用

    public static void copyResourceToFile(String resourcePath, String filePath) {
        try(InputStream inputStream = FileIO.class.getResourceAsStream(resourcePath)) {
            Files.copy(inputStream, Paths.get(filePath));
        }
        catch(IOException ex){
            System.out.println("Copying failed. "+ex.getMessage());
        }
    }
    

    这种构造确保了即使在异常情况下也能正确关闭资源,而JRE方法确保了数据的正确和高效复制

    它接受其他选项,例如,如果目标文件已经存在,则指定应覆盖该文件,您可以使用

    public static void copyResourceToFile(String resourcePath, String filePath) {
        try(InputStream inputStream = FileIO.class.getResourceAsStream(resourcePath)) {
            Files.copy(inputStream, Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
        }
        catch(IOException ex){
            System.out.println("Copying failed. "+ex.getMessage());
        }
    }
    
  2. # 2 楼答案

    您正在对字符串使用InputStreams,。exe文件是字节! 尝试使用ByteArrayInputStream和ByteArrayOutputStream

    编辑:填写markspace的答案:

    new BufferedInputStream(new ByteArrayInputStream( ... ) )
    
  3. # 3 楼答案

    我猜您应该使用原始输入流时使用了Reader。用BufferedInputStream代替BufferedReader

    BufferedInputStream in = new BufferedInputStream( inputStream );
    

    问题是Reader将二进制文件解释为本地字符集,而不是所需的数据

    编辑:如果你需要一个更大的提示,从这个开始。我刚刚注意到你也在使用BufferedWriter,那也不行

    try {
        InputStream inputStream = FileIO.class.getResourceAsStream(path);
        BufferedInputStream in = new BufferedInputStream( inputStream );
    
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] bytes = new byte[ 1024 ];
        for( int length; ( length = ins.read( bytes ) ) != -1; )
           bos.write( bytes, 0, length );
        }
    inputStream.close();
    return bos;