Java FileInputStream.read() 打印时显示不需要的字符

Posted

技术标签:

【中文标题】Java FileInputStream.read() 打印时显示不需要的字符【英文标题】:Java FileInputStream.read() when printed shows undesired characters 【发布时间】:2021-12-04 09:57:57 【问题描述】:

我正在关注的教程显示了以下代码

            System.out.println("File contents: ");
            int character;
            while((character=fileinputstream.read())!=-1)  
                System.out.print((char)character);
            
            fileinputstream.close();

我尝试了以下方式

            System.out.println("File contents: ");
            while((fileinputstream.read())!=-1)    
                System.out.print((char)fileinputstream.read());
            
            fileinputstream.close();

现在,我知道这里有些字节会被跳过。但未跳过的字节预计将按原样打印。但是随机字符的输出有很大的不同。

我想了解这里的问题。感谢您提供的任何帮助!

【问题讨论】:

'bytes' 和 'characters' 是不同的东西。例如,一个字符可能不止一个字节。 (并且将一个字节放入名为“字符”的变量中不会使其成为字符)。因此,通过跳过每隔一个字节,您可能会跳过字符的一部分,而您不跳过的部分在被视为同一字符的字节时可能没有意义。究竟发生了什么取决于文件中的内容/ @user16632363 我们可以说ASCII码是部分读取的,因此形成了不同的ASCII码,而这些ASCII码又对应于其他字符? 我们不应该提及ASCII,因为这是Java,它不使用那个过时的标准。 Java 字符是 Unicode 字符。字节序列通常是 Unicode 字符的 UTF-8 表示。 UTF-8 有多字节字符; ASCII,一个 7 位代码,没有。 但是是的,字符代码被部分读取,因此它们的组成字节被错误地重新组合成其他字符。 @user16632363 感谢您的帮助!我对 UTF-8 表示不太了解。 【参考方案1】:

当您调用fileinputstream.read 时,它会读取光标所指向的字节并将光标移动到下一个字节。因为read 方法在while 循环条件被执行并且一个字节读出消失时被调用。本教程使用一个变量来保存该字节的值以防止它消失。

所以请按照教程进行操作

【讨论】:

他知道那部分:我知道这里有些字节会被跳过。

以上是关于Java FileInputStream.read() 打印时显示不需要的字符的主要内容,如果未能解决你的问题,请参考以下文章

FileInputStream.read() 啥时候阻塞?

FileInputStream read函数何时返回-1

Java利用IO流复制照片完整示例和详细分析

在java中如何把字节数组存储到数据库?

IO流

Java Switch