我正在尝试使用InputStreamReader读取二进制文件(pdf,doc,zip)。我使用FileInputStream实现了这一点,并将文件内容保存到字节数组中。但是我已经被要求使用InputStreamReader来做到这一点。因此,当我试图打开并阅读pdf文件时,例如使用
File file = new File (inputFileName);
Reader in = new
InputStreamReader(new FileInputStream(file));
char fileContent[] = new char[(int)file.length()];
in.read(fileContent); in.close();
然后使用
将此内容保存到另一个pdf文件File outfile = new File(outputFile);
Writer out = new OutputStreamWriter(new FileOutputStream(outfile));
out.write(fileContent);
out.close();
一切都很顺利(没有例外或错误),但是当我试图打开新文件时,要么说它已损坏或编码。
有什么建议吗?
ps1我特别需要使用InputStreamReader
ps2尝试读取/写入.txt文件时工作正常
答案 0 :(得分:1)
不要使用读写器API。改为使用二进制流:
File inFile = new File("...");
File outFile = new File("...");
FileChannel in = new FileInputStream(inFile).getChannel();
FileChannel out = new FileOutputStream(outFile).getChannel();
in.transferTo(0, inFile.length(), out);
答案 1 :(得分:1)
String, char, Reader, Writer
适用于java中的 text 。这个文本是Unicode,因此可以组合所有脚本。
byte[], InputStream, OutputStream
用于二进制数据。如果它们代表文本,则必须与某些编码相关联。
文本和二进制数据之间的桥梁总是涉及转换。
在你的情况下:
Reader in = new InputStreamReader(new FileInputStream(file), encoding);
Reader in = new InputStreamReader(new FileInputStream(file)); // Platform's encoding
第二个版本是不可移植的,因为其他计算机可以有任何编码。
在您的情况下,不要将InputStreamReader用于二进制数据。转换只能破坏事情。
也许他们的意思是:不要在字节数组中读取所有内容。在这种情况下,使用BufferedInputStream重复读取小字节数组(缓冲区)。