簡體   English   中英

帶有UTF8的DataInputStream和readLine()

[英]DataInputStream and readLine() with UTF8

從ac套接字向java套接字發送UTF8字符串時遇到了一些麻煩。 以下方法工作正常:

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
main.title = in.readLine();

但是我需要一個對於BufferedReader不存在的int java.io.InputStream.read(byte[] b, int offset, int length)方法。 那么我試着采用DataInputStream

DataInputStream in2 = new DataInputStream(socket.getInputStream());

但它所讀的一切都只是垃圾。

然后我嘗試使用DataInputStreamreadLine()方法,但這並沒有給我正確的UTF8字符串。

你看到了我的困境。 我不能為一個InputStream使用兩個讀卡器嗎? 或者我可以轉換DataInputStream.readLine()結果並將其轉換為UTF8嗎?

謝謝,馬丁

我們從UTF-8編碼設計中知道,值0x0A的唯一用法是LINE FEED( '\\n' )。 因此,您可以閱讀,直到您點擊它:

  /** Reads UTF-8 character data; lines are terminated with '\n' */
  public static String readLine(InputStream in) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    while (true) {
      int b = in.read();
      if (b < 0) {
        throw new IOException("Data truncated");
      }
      if (b == 0x0A) {
        break;
      }
      buffer.write(b);
    }
    return new String(buffer.toByteArray(), "UTF-8");
  }

我假設您的協議使用\\n作為行終止符。 如果不是 - 那么指出你寫的約束通常很有用。

不要使用的BufferedReader DataInputStream所,並在同一InputStream的! 我這樣做了,並花了幾天時間試圖找出我的代碼破壞的原因。 BufferedReader可以讀取比從中提取的更多內容到其緩沖區中,導致我應該使用DataInputStream讀取的數據“在BufferedReader”中的情況。 這導致數據丟失,導致我的程序“掛起”等待它到達。

我相信你不應該在這里與BufferedReaderDataInputStream不匹配。 DataInputStream也有readLine() ,所以使用它。 而另一個評論。 我不確定這是一個問題,但避免多次調用socket.getInputStream() 做一次,然后根據需要使用其他流和讀取器包裝它。

我是否正確理解您是在同一個套接字上同時發送“對話”中的文本和二進制數據? 為同一輸入流創建兩個讀取器應該沒有問題。 問題是知道何時(以及多少)閱讀哪個讀者。 當您從它們讀取時,它們將消耗(並推進)基礎流,因為您具有混合類型的數據。 您可以將流讀取為字節,然后在代碼中顯式轉換字節(新字符串(字節,“UTF-8”)等)。 或者您可以將通信分成兩個不同的套接字。

暫無
暫無

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

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