为什么新的 InputStreamReader 不会读取控制台中的剩余字符?
Why a new InputStreamReader won't read the remaining characters in the console?
所以我有一个用Java编写的非常简单的服务器:
public class SimpleServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server Socket created, waiting for client...");
Socket accept = serverSocket.accept();
InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream());
int read;
System.out.println("Client connected, waiting for input");
while ((read = inputStreamReader.read()) != -1) {
System.out.print((char) read);
}
}
}
这是我用来连接它的代码:
public class SimpleClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader inputStreamReader;
char[] chars = new char[5];
while (true) {
System.out.println("Say something: ");
inputStreamReader = new InputStreamReader(System.in);
inputStreamReader.read(chars);
int x = 0;
for (int i=0;i<5;i++) {
if(chars[i]!='\u0000') {
x++;
}
}
outputStream.write(chars,0,x);
outputStream.flush();
chars = new char[5];
}
}
}
现在,当我在客户端的终端中输入如下内容时:
123456789
我会在服务器端看到:
Server Socket created, waiting for client...
Client connected, waiting for input
12345
但是,当我如下更改客户端时:
public class SimpleClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
char[] chars = new char[5];
while (true) {
System.out.println("Say something: ");
inputStreamReader.read(chars);
int x = 0;
for (int i=0;i<5;i++) {
if(chars[i]!='\u0000') {
x++;
}
}
outputStream.write(chars,0,x);
outputStream.flush();
chars = new char[5];
}
}
}
然后对于相同的输入,我将看到:
Server Socket created, waiting for client...
Client connected, waiting for input
123456789
我的问题是,System.out 是一个静态变量,在这种情况下它已经打开并连接到终端。为什么新建InputStreamReader对象时,终端中的信息丢失了?相同的终端被传递给对象,不是吗?
Why is the information in the terminal lost when a new InputStreamReader object is created?
当您在 InputStreamReader
上调用 read()
时,允许(而且通常会)从流中读取比您实际请求更多的数据,并将其余数据存储在缓冲区中,以满足以后的 read
调用。我怀疑整行文本实际上已经被第一个 InputStreamReader
读取了,所以当你为同一个流构造一个 second InputStreamReader
时,什么也没有留给它阅读,你必须输入更多的文字才能让它做任何事情。
所以我有一个用Java编写的非常简单的服务器:
public class SimpleServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server Socket created, waiting for client...");
Socket accept = serverSocket.accept();
InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream());
int read;
System.out.println("Client connected, waiting for input");
while ((read = inputStreamReader.read()) != -1) {
System.out.print((char) read);
}
}
}
这是我用来连接它的代码:
public class SimpleClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader inputStreamReader;
char[] chars = new char[5];
while (true) {
System.out.println("Say something: ");
inputStreamReader = new InputStreamReader(System.in);
inputStreamReader.read(chars);
int x = 0;
for (int i=0;i<5;i++) {
if(chars[i]!='\u0000') {
x++;
}
}
outputStream.write(chars,0,x);
outputStream.flush();
chars = new char[5];
}
}
}
现在,当我在客户端的终端中输入如下内容时:
123456789
我会在服务器端看到:
Server Socket created, waiting for client...
Client connected, waiting for input
12345
但是,当我如下更改客户端时:
public class SimpleClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost",8888);
OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
char[] chars = new char[5];
while (true) {
System.out.println("Say something: ");
inputStreamReader.read(chars);
int x = 0;
for (int i=0;i<5;i++) {
if(chars[i]!='\u0000') {
x++;
}
}
outputStream.write(chars,0,x);
outputStream.flush();
chars = new char[5];
}
}
}
然后对于相同的输入,我将看到:
Server Socket created, waiting for client...
Client connected, waiting for input
123456789
我的问题是,System.out 是一个静态变量,在这种情况下它已经打开并连接到终端。为什么新建InputStreamReader对象时,终端中的信息丢失了?相同的终端被传递给对象,不是吗?
Why is the information in the terminal lost when a new InputStreamReader object is created?
当您在 InputStreamReader
上调用 read()
时,允许(而且通常会)从流中读取比您实际请求更多的数据,并将其余数据存储在缓冲区中,以满足以后的 read
调用。我怀疑整行文本实际上已经被第一个 InputStreamReader
读取了,所以当你为同一个流构造一个 second InputStreamReader
时,什么也没有留给它阅读,你必须输入更多的文字才能让它做任何事情。