gpt4 book ai didi

java - 当OutputStream的write写入字节(内部)时,为什么InputStream的read返回int?

转载 作者:行者123 更新时间:2023-12-02 00:54:12 24 4
gpt4 key购买 nike

MyWriter.java(在 MyReader.java 之前执行)

import java.io.*;
import java.net.*;
import java.util.* ;

public class MyWriter {

public static void main(String[] args) throws Exception {

ServerSocket ss = new ServerSocket(1234) ;
System.out.println("Server started...\n\n") ;
Socket s = ss.accept() ;

OutputStream out = s.getOutputStream() ;

Scanner scan = new Scanner(System.in) ;

while(true){
System.out.print("Enter integer (or something else to quit) : ");

try{
int i = scan.nextInt() ;
out.write(i) ;
}catch(RuntimeException rte){
System.out.println("\n\n") ;
rte.printStackTrace() ;
System.out.println("\n\n") ;
break ;
}
}
}
}

MyReader.java(仅在使用 MyWriter.java 完成时执行)

import java.io.*;
import java.net.*;
import java.util.* ;

public class MyReader {

public static void main(String[] args) throws Exception {

Socket s = new Socket("localhost", 1234) ;

InputStream is = s.getInputStream() ;

int i ;
while( (i = is.read()) != -1 ){
System.out.println( "character form : " + (char)i + ", int form : " + i);
}
}
}

问题:即使我在 MyWriter 中传递 -1,MyReader 也不会终止。

最佳答案

Read 返回一个 int,因此它也可以指示流的结尾,如 -1。如果签名是

byte read()

那么你永远不会知道流何时结束(我想除非它抛出异常)。

我怀疑 write 没有特殊原因采用 int - 对我来说这似乎是一个有点奇怪的选择。 Javadoc 特别指出高 24 位将被忽略。也许这只是历史的偶然。

(在 .NET 中,Stream.ReadByte 返回一个 int,但 Stream.WriteByte 接受一个 byte .在我看来,这更有意义。)

现在,在这样的背景下,当您将“-1”写入流时,您实际上正在写入值“255” - 这就是您读回的内容。 “-1”在二进制中表示为“全 1”,因此其低 8 位为“11111111”,当视为无符号值时为 255。

只有当您关闭“写入”应用程序中的输出流时,您的阅读器才会终止 - 因为此时 read() 将返回 -1。

关于java - 当OutputStream的write写入字节(内部)时,为什么InputStream的read返回int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com