Java基础 FileInputStream 字节输入流的细节、FileInputStream的read()方法原理

1. 创建字节输入流对象:FileInputStream fis = new FileInputStream("E:\\Java基础资料\\a.txt");

细节:如果文件不存在,就直接报错

 

2. 读取数据(read 方法负责读取数据,会一个一个地读,如果读不到了,就会返回 -1)

细节①:一次读取一个字节,返回的是字节数据的十进制表示,它不会对字节的内容进行解释或翻译

细节②:读到文件末尾了,read() 方法返回 -1

原理:读取数据的时候,最开始指针默认指向第一个数据,当调用一次 read() 方法之后,就会先读取指针指向的数据,再向后移动指针。再次调用 read() 方法的时候,同样会先读取指向的数据,再移动指针......如果读到文件末尾了,再次调用 read() 方法,读不到任何东西了,方法就返回 -1

 

3. 释放资源:fis.close();

 

 

read() 方法原理:

FileInputStreamread() 方法一次读取一个字节,返回的是字节数据的十进制表示,它不会对字节的内容进行解释或翻译。当读取中文字符时,字节的值通常大于127,这是因为中文字符使用多字节编码,如UTF-8、UTF-16等,其中包含的字节不在ASCII码表的范围内(0-127)。

尽管字节值大于127,read() 方法仍然能够读取这些字节,因为它不会对字节进行解释。它返回的是字节的原始值,而不会将其解释为字符。这允许您以原始字节的形式读取文件中的任何数据,包括文本和二进制数据。

如果您希望将字节解释为字符,您可以使用字符编码来将字节转换为字符。例如,您可以使用 InputStreamReaderFileInputStream 的输出包装成字符流,并指定适当的字符编码来读取中文字符。

read() 方法返回的数字不一定是ASCII码表上对应的数字。read() 方法读取的是原始字节数据,无论这些字节是否符合ASCII编码。这意味着它返回的数字是字节的十进制表示,而不考虑它们是否符合ASCII编码规则。

在ASCII编码中,字符通常被表示为0到127的整数值,但对于许多其他字符编码(如UTF-8、UTF-16等),字符的表示范围可以超出ASCII码表的范围(即大于127)。因此,read() 方法可以返回大于127的数字,代表非ASCII字符,例如中文字符或其他国际字符,这些字符的表示方式不在ASCII码表的范围内。

如果您需要将字节解释为特定字符编码的字符,您需要使用适当的字符编码来将字节转换为字符,如在前面的示例中所演示的。read() 方法本身只返回字节的原始值,不会进行字符编码的解释。

 

posted @ 2023-10-23 14:55  1stzz1  阅读(269)  评论(0)    收藏  举报