[英]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());
但它所讀的一切都只是垃圾。
然后我嘗試使用DataInputStream
的readLine()
方法,但這並沒有給我正確的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”中的情況。 這導致數據丟失,導致我的程序“掛起”等待它到達。
我相信你不應該在這里與BufferedReader
和DataInputStream
不匹配。 DataInputStream
也有readLine()
,所以使用它。 而另一個評論。 我不確定這是一個問題,但避免多次調用socket.getInputStream()
。 做一次,然后根據需要使用其他流和讀取器包裝它。
我是否正確理解您是在同一個套接字上同時發送“對話”中的文本和二進制數據? 為同一輸入流創建兩個讀取器應該沒有問題。 問題是知道何時(以及多少)閱讀哪個讀者。 當您從它們讀取時,它們將消耗(並推進)基礎流,因為您具有混合類型的數據。 您可以將流讀取為字節,然后在代碼中顯式轉換字節(新字符串(字節,“UTF-8”)等)。 或者您可以將通信分成兩個不同的套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.