【发布时间】:2015-08-18 09:01:04
【问题描述】:
我正在尝试从我的 jar 中提取一个文件并将其复制到 temp 目录中。
要读取 jar 中的文件,我使用的是 DataInputStream,要在 temp 目录中写入文件,我使用的是 DataOutputStream。
我尝试提取的文件的文件大小为 310 KB,在我调用我的方法后,我复制的文件仅包含 114 个字节(这也是我的方法打印到控制台的字节数)。
这是我的方法:
private static void extractFile(String pathInJar, String fileToCopy) {
File outputFile = new File(System.getProperty("java.io.tmpdir") + "/LDEngine/"+fileToCopy);
boolean couldDirsBeCreated = outputFile.getParentFile().mkdirs();
if(couldDirsBeCreated && !outputFile.exists()) {
int x;
int actualBytesRead = 0;
byte[] tmpByteArray = new byte[4096];
try(
DataOutputStream output = new DataOutputStream(new FileOutputStream(outputFile));
DataInputStream in = new DataInputStream(LibLoader.class.getResourceAsStream("/libs/natives/"+pathInJar))
){
while((x=in.read(tmpByteArray)) != -1) {
output.write(tmpByteArray);
actualBytesRead += x;
}
} catch(Exception e) {
System.err.println("Fatal error: Could not write file!");
System.exit(1);
}
System.out.println(actualBytesRead);
}
}
我要复制的文件是.dll,所以我正在处理的是二进制数据。
问题是为什么会发生这种情况,我做错了什么?
【问题讨论】:
-
提个醒:有许多经过良好测试的库(如 Google Guava),它们的功能与您所做的完全相同。例如。
Resources.copy(Resources.getResource(SomeRef.class, "/dir/SomeResource.txt"), someOutputStream);。这最大限度地减少了代码和测试“开销”。祝你的项目好运。
标签: java datainputstream