【问题标题】:JAVA: Open and read file using InputStreamReaderJAVA:使用 InputStreamReader 打开和读取文件
【发布时间】:2014-12-04 12:36:30
【问题描述】:

我正在尝试使用 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 文件时工作正常

【问题讨论】:

    标签: java file binary inputstreamreader


    【解决方案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 重复读取小字节数组(缓冲区)。

    【讨论】:

    • 我尝试了第一种方法,但我无法找出二进制文件的编码方式。 (例如pdf)。我已经尝试了所有常见的编码,但没有。我尝试使用 Input StreamReader 这样做的原因是因为有人要求我这样做,但我不知道是否可以使用 InputStreamReader 正确读取二进制文件的内容。
    • 无法将 zip 中的二进制数据合理地转换为文本。您可以使用StandardCharsets.ISO_8859_1、ISO-8859-1 或拉丁语 1,一种单字节编码。并使用 OutputStreamWriter 转换回来。
    【解决方案2】:

    不要使用读取器/写入器 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);
    

    【讨论】:

    • 是的,我知道,最简单的方法是使用字节来执行此操作,但我被要求使用 InputStreamReader 执行此操作,我不知道是否可以正确读取二进制文件这样
    • reader/writer API 旨在读取文本数据。通常你应该在里面指定文本的编码。此 api 不适用于二进制数据
    • 所以 InputStreamReader 不可能吧?实际上我必须做一种加密,给每个字符添加一个随机数,然后如果我从加密文件中分出这个相同的数字,它必须再次与原始文件相同。我使用字节做到了这一点,但我无法用字符做到这一点,当我什至无法正确读取它们时
    • 技术上这是可能的,如果你在你的程序中强制编码。例如您将始终以“US-ASCII”编码的文本形式读取/写入文件。但这是糟糕的设计。对于数学(加密)操作,最好将所有文件解释为二进制文件。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2011-01-26
    • 2012-06-27
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多