是否可以用Java编写/创建exe文件? 我可以成功读取它,但是将已经读取的完全相同的数据写入新文件似乎会产生一些麻烦,因为Windows告诉我,我的电脑不再支持它了。
这是我用来阅读path
为String
的文件的代码,其中包含实际的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做到这一点吗?
顺便说一句,我没有阅读/写文件的经验..
感谢您考虑我的要求。
答案 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( ... ) )