提问人:mishar 提问时间:8/1/2019 最后编辑:Darrenmishar 更新时间:8/1/2019 访问量:593
为什么 write() 和 read() 似乎写入和读取超过一个字节?
Why do write() and read() appear to write and read more than a byte?
问:
其中 ,a 可以容纳的最大值为 127,即 8 位。此外,使用的 read() 方法 (它继承自 ) 声明它只读取一个 ,而使用 (它继承自 ) 的 write() 方法声明它只写一个 。但是,当我传递一个大于 127 但小于 256 的数字来 write() 然后读取 () 它时,我会得到一个十进制值确实在 127 到 255 之间的字符。这似乎表明 write() 实际上可以写入 9 位而不是 8 位,而 read() 实际上可以读取 9 位而不是 8 位。所以,我的问题是这怎么可能?read() 如何读取多个 a 和 write() 如何写入多个 ?我还错过了什么吗?Java
byte
FileInputStream
InputStream
byte
FileOutputStream
OutputStream
byte
byte
byte
再举一个例子,假设我将整数 1000 传递给 write()。然后 write() 输出一个字符,然后读取 read() 的十进制值为 232。这似乎是因为 1000 - 512 - 256 = 232,这似乎再次表明 write() 和 read() 写入和读取 9 位(最多 255 位)而不是一个字节(8 位,最多 127)。在我看来,write() 正在写入 1000 的后 9 位,然后读取 read(),在这种情况下得到 232。
我已经发布了我用来测试这一切的程序。另外,我是相当陌生的,所以任何帮助或想法都非常感谢!Java
import java.io.*;
public class TestingCharsAndBytes
{
public static void main(String[] args)
{
FileOutputStream output = null;
FileInputStream input = null;
try
{
output = new FileOutputStream(".../testFileIO1.txt");
input = new FileInputStream(".../testFileIO1.txt");
// Stuff to try:
doFileResult(512,output,input);
doFileResult(128,output,input);
doFileResult(256,output,input);
doFileResult(257,output,input);
doFileResult(160,output,input);
doFileResult(289,output,input);
doFileResult(1000,output,input);
doFileResult(2000,output,input);
}
catch(IOException e)
{
System.out.println("Error occurred.");
e.getStackTrace();
}
finally
{
try
{
output.close();
input.close();
}
catch(Exception e)
{
System.out.println("Error closing file.");
}
}
}
public static void doFileResult(int toWrite, FileOutputStream outStream, FileInputStream inputStream) throws IOException
{
System.out.println("******************");
outStream.write(toWrite);
int x = inputStream.read();
char y = (char) x;
System.out.println("Integer passed to write: " + toWrite);
System.out.println("Input integer read: " + x);
System.out.println("Input character read (after casting to char): " + y);
System.out.println();
}
}
答:
根据文档,使用 -1 作为特殊值来指示 EOF。如果使用字节的实际范围 (-128..127),则 -1 将是有效字节。read()
如基本方法 InputStream.read()
的文档中所述:
值 byte 以 0 到 255 范围内的 int 形式返回。如果由于已到达流的末尾而没有可用的字节,则返回值 -1。
编写从流读取代码的惯用方式如下:
while (true) {
int v = stream.read();
if (v == -1) {
break;
}
byte b = (byte) v;
// Do something.
}
强制转换为字节将“正确”将 int 0..255 映射到字节 -128..127,因为从 32 位缩小到 8 位的强制转换将只保留 8 个最低有效位。
评论
read()
byte
评论
read()
int
0
255