Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么write()和read()看起来写和读超过一个字节?_Java_File Io_Stream_Fileinputstream_Fileoutputstream - Fatal编程技术网

Java 为什么write()和read()看起来写和读超过一个字节?

Java 为什么write()和read()看起来写和读超过一个字节?,java,file-io,stream,fileinputstream,fileoutputstream,Java,File Io,Stream,Fileinputstream,Fileoutputstream,在Java中,字节可容纳的最大值为127位,即8位。另外,FileInputStream使用的read()方法(它从InputStream继承)表示它只读取一个字节,而FileOutputStream使用的write()方法(它从OutputStream继承)表示它只写入一个字节。但是,当我将大于127但小于256的数字传递给write()并将其读取()时,会得到一个十进制值介于127和255之间的字符。这似乎表明write()实际上可以写入9位而不是8位,read()实际上可以读取9位而不是8

Java
中,
字节
可容纳的最大值为127位,即8位。另外,
FileInputStream
使用的read()方法(它从
InputStream
继承)表示它只读取一个
字节
,而
FileOutputStream
使用的write()方法(它从
OutputStream
继承)表示它只写入一个
字节
。但是,当我将大于127但小于256的数字传递给write()并将其读取()时,会得到一个十进制值介于127和255之间的字符。这似乎表明write()实际上可以写入9位而不是8位,read()实际上可以读取9位而不是8位。所以,我的问题是,这怎么可能?read()怎么能读超过一个
字节
,write()怎么能写超过一个
字节
?我还缺什么吗

再举一个例子,假设我将整数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();       
    }
}
read()
使用-1作为表示EOF的特殊值。如果使用了字节(-128..127)的实际范围,-1将是有效字节

如基本方法文件所述:

值字节作为0到255范围内的整数返回。如果由于到达流的结尾而没有字节可用,则返回值-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()
使用-1作为特殊值来指示EOF。如果使用字节(-128..127)的实际范围,-1将是一个有效的字节。(我还想指出,是的,8位是256,但在Java中,一个字节的8位只能得到127,所以为了得到一个高达256(255)的值,我想这意味着Java中需要9位)@Andy Turner-是的,我已经看过文档了;但我的问题是,它们声明范围应该是-128到127,这意味着read()应该返回一个最大值为127的整数;但事实并非如此。我可以从read()返回一个整数,最高可达255,尽管docs for read声明它只能读取一个字节(8位,所以Java中的最大值为127),但我不确定您正在读取哪些文档。答案非常清楚:“值字节作为
int
返回,范围为
0
255
”@VGR-好,是;你给出的链接是安迪·特纳评论中的第二个链接。非常感谢。我猜我的问题是因为0到255与-128到127之间的关系,这是由于字节数据类型被签名。因此read()读取一个字节,但作为一个整数来看,它的范围是从0到255,但将其转换为一个字节将使其从-128到127?@mishar一个字节是8位。该值可以解释为无符号(0到255)或有符号。有符号的标准是,范围为-128到127,正值的位模式与无符号值相同。由于
read()
需要一个额外的值来表示EOF,因此他们决定将字节返回为无符号,并使用-1表示EOF,即使Java
字节
是有符号值。无论是无符号还是有符号,它仍然是一个8位二进制值。