簡體   English   中英

System.in 和 System.out 之間的輸入/輸出流 - readUTF() 和 writeUTF() 的問題

[英]Input/OutputStream between System.in and System.out - problem with readUTF() and writeUTF()

我正在嘗試在 Java 中的 System.in 和 System.out 之間建立一個非常簡單的通信流,以了解流的工作原理。 我為 System.in 使用 DataInputStream,為 System.out 使用 DataOutputStream,它們通過 readChar()、writeChar() 等進行通信。

一切似乎都工作正常,直到達到 readUTF() 為止:

DataInputStream dis = new DataInputStream(System.in);
DataOutputStream dos = new DataOutputStream(System.out);
        
try {
  char c = dis.readChar();
  dos.writeChar(c);
            
  int i = dis.readInt();
  dos.writeInt(i);
            
  String s = dis.readUTF();
  dos.writeUTF(s);
} catch (IOException e) {
  e.printStackTrace();
}       
try {
  dis.close();
  dos.close();
} catch (IOException e) {
  e.printStackTrace();
}   

控制台顯示:

m /* note: keyboard input */
m
569
569
Hello

看起來我找不到指示字符串結尾的方法,沒有考慮返回,也沒有考慮 \n 等。我也嘗試添加 " 但相同。

我遇到了另一個問題,這段代碼沒有在控制台中顯示任何內容:

DataInputStream dis = new DataInputStream(System.in);
DataOutputStream dos = new DataOutputStream(System.out);
        
try {
  dos.writeUTF("Hello");
} catch (IOException e) {
  e.printStackTrace();
}       
try {
  dis.close();
  dos.close();
} catch (IOException e) {
 e.printStackTrace();
}

我試過添加 dos.flush() 但沒有任何變化。 我想我誤會了什么。

您不應該使用DataInputStreamDataOutputStream readUTFwriteUTF使用非常特殊的序列化格式,其中文本以長度指示符為前綴,並使用修改后的 UTF8。 控制台輸入不使用這樣的格式,所以用Hello的前4個字符來計算長度,你輸入的字符沒有那么多,output上用的4個字節的字符串長度很可能會產生亂碼(如果包含生成修改格式的代碼點,修改后的 UTF8 的使用也是如此)。 您可能應該改用BufferedReaderScanner並直接使用PrintStream System.out ,或使用通過System.console()獲得的Console

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM