2015-08-18 41 views
0

我试图从我的jar中提取一个文件并将其复制到temp目录中。 要读取jar文件中的文件,我正在使用DataInputStream将文件写入临时目录,我正在使用DataOutputStream为什么我的DataInputStream只读取114个字节?

我试图提取的文件的文件大小为310千字节,在我调用我的方法(这也是我的方法打印到控制台的字节数)后,我的复制文件仅包含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,所以这是我处理的二进制数据。

问题是为什么会发生这种情况,我做错了什么?

+0

只是个头:有许多经过充分测试的库(如Google Guava),其功能与您所做的完全相同。例如。 'Resources.copy(Resources.getResource(SomeRef.class,“/dir/SomeResource.txt”),someOutputStream);'。这最大限度地减少了代码和测试“开销”。祝你的项目好运。 – Brian

回答

1

这并不能解释为什么你的方法很快就会停止,但是你需要照顾它,否则你将会遇到一个更奇怪的问题,结果数据会被完全混淆。

从DataInputStream.read()的API文档:

读取从包含的输入流,并将它们存储到缓冲区数组b一定数量的字节。实际读取的字节数作为整数返回。

您需要使用该返回值并调用write()方法,该方法使用offset和length。

+0

试过了,刚才没什么区别。 – JackWhiteIII

+0

@JackWhiteIII:是的,我意识到它并没有解释为什么你的方法提前停止,但你仍然需要修复它。你是否用输入文件比较了输出文件的内容? –

+0

我还没有测试过,但我发现了另一个错误:当我创建InputStream时,我没有连接pathInJar和文件。现在测试。 – JackWhiteIII

相关问题