为什么我的DataInputStream只读取114个字节?

时间:2015-08-18 09:01:04

标签: java datainputstream

我正在尝试从jar中提取文件并将其复制到temp目录中。 要在jar中读取文件,我使用DataInputStream,将文件写入临时目录,我使用的是DataOutputStream

我想要提取的文件的文件大小为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,所以它是我正在处理的二进制数据。

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

1 个答案:

答案 0 :(得分:1)

这并不能解释为什么你的方法停止这么快,但你需要处理它,否则你会遇到一个更奇怪的问题,结果数据完全出现乱码。

来自DataInputStream.read()的APi文档:

  

从包含的输入流中读取一些字节数并将它们存储到缓冲区数组b中。实际读取的字节数以整数形式返回。

您需要使用该返回值并调用take()方法以及offset和offset。