当我尝试使用Java中的“read”函数从普通PDF文件中读取字节到字节数组时,字节数组将正确加载,并且大小与原始PDF文件相同。
这种行为的解释是什么?
编辑1:- 我不需要Tika或POI等第三方集成。
Path file_path = Paths.get("D:\\Zip Test Client", "vadClient1.pdf");
byte[] ByteArray= Files.readAllBytes(file_path);
FileOutputStream fos = new FileOutputStream(new File("E:\\newFinalPDF.pdf"));
但是,当我从一个压缩文件夹中读取同一PDF文件的字节时,读取函数仅读取了8843个字节(原始大小为194471),其余的都是0。
zipFile = new ZipFile(new File("D:\\Zip test Server\\ZipTestFolderOnServer.zip"));
long count = zipFile.size();
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()){
System.out.println("New File starting");
ZipEntry zipEntry = entries.nextElement();
System.out.println(zipEntry.getName());
InputStream fis = zipFile.getInputStream(zipEntry);
byte[] fileToBytes = new byte[(int)zipEntry.getSize()];
FileOutputStream fos = new FileOutputStream(new File("E:\\ContentZipped_" + zipEntry.getName()));
fis.read(fileToBytes);
fos.write(fileToBytes);
fis.close();
Thread.sleep(1000);
--count;
}
这种行为的解释是什么?
编辑1:- 我不需要Tika或POI等第三方集成。
InputStream.read
并忽略了返回值 - 你似乎假设可以在单次调用read
中读取所有数据。这是一个错误的假设。 - Jon Skeetfis.read
返回-1
,这意味着流的末尾。像你在第一个片段中所做的那样使用Files.readAllBytes
,这样你就可以得到完整的文件。 - Jean-François SavardInputStream.read
不能保证在返回之前读取所有请求的数据。如果您的实际代码在我列出的假设方面相同,那么这就是问题所在。如果您真的有一个循环,并且您正在调用read
多次直到它返回-1表示流的结束,那么您应该更新您的问题以显示这一点。 - Jon Skeet