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

Java 为什么我的DataInputStream只读取114字节?,java,datainputstream,Java,Datainputstream,我正试图从jar中提取一个文件,并将其复制到temp目录中。 为了读取jar中的文件,我使用了DataInputStream,为了在temp目录中写入文件,我使用了DataOutputStream 我试图提取的文件大小为310 KB,在调用我的方法后,复制的文件仅包含114字节(这也是我的方法打印到控制台的字节数) 以下是我的方法: private static void extractFile(String pathInJar, String fileToCopy) { Fil

我正试图从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
,因此我正在处理的是二进制数据


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

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

从DataInputStream.read()的APi文档:

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


您需要使用该返回值并调用write()方法,该方法接受和偏移量以及长度。

刚刚尝试过,没有区别。@JackWhiteIII:是的,我意识到这并不能解释为什么您的方法会提前停止,但您仍然必须修复它。您是否将输出文件的内容与输入文件进行了比较?我还没有对其进行测试,但我发现了另一个错误:在创建输入流时,我没有连接pathInJar和file。现在正在测试,就是这样。但是因为暗示了我DataInputStream.read(数组、偏移量、长度),我接受了你的答案。提醒一下:有很多经过良好测试的库(比如Google Guava),它们的功能与你的完全相同。例如,
Resources.copy(Resources.getResource(SomeRef.class,“/dir/SomeResource.txt”)、someOutputStream。这最大限度地减少了代码和测试的“开销”。祝你的项目好运。