Java写exe文件

时间:2017-12-12 17:29:04

标签: java

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

这是我用来阅读pathString的文件的代码,其中包含实际的path({{1}中的.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 个答案:

答案 0 :(得分:1)

当你应该使用原始输入流时,我猜你正在使用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;

答案 1 :(得分:0)

使用Java 7或更高版本时,应使用

将资源复制到文件中
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 :(得分:-1)

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

编辑:使用markspace的答案完成:

new BufferedInputStream(new ByteArrayInputStream( ... ) )