2010-09-17 15 views
2

我正在創建一個移動應用程序,以便在手機上運行並嘗試以最有效的方式從中讀取數據。該應用程序將數據發送到我的服務器應用程序(以字節的形式,不一定是字符)。閱讀直到帶有套接字(Java)的標記的最佳實踐?

我不知道數據的長度;結束時將標記一個3字節標記(即0x11,0x22,0x33),然後將發送一組新的數據。很可能會在每個「數據集」中發送大量數據。那麼,我想知道讀取這些數據的最有效方式是什麼。我應該使用InputStreamReader嗎? BufferedReader?顯然,我需要檢查每個字符以查看它是否是標記的一部分,如果是,請將標記之前的所有數據發送到另一個處理方法。

從我可以告訴,BufferedReader.readLine()是我想如果我的結束標誌是什麼\n(顯然,這是不是這樣)。我是否需要編寫自己的方法來逐字節讀取BufferedReader並查找我的標記? (我也不知道這是否是最有效的方法?)

回答

6

假設你的數據是字節數據而不是字符數據,你應該把你的套接字輸入流包裝在BufferedInputStream中,並用它來讀取數據一次一個字節,將字節保存在某種字節緩衝區中。 (一種選擇是使用ByteArrayOutputStream緩衝,你已經從BufferedInputStream讀取的數據字節。)

BufferedReaderreadLine()不是要走的路:假設數據不是字符

  • 數據,如果您嘗試根據某些字符集對其進行解碼,則可能會破壞它。
  • readLine方法只能理解由'\n'和/或'\r'字符分隔的行。沒有辦法讓它理解其他「行」分隔符。

最後,請注意BufferedInputStream對性能的原因非常重要。如果您不使用它,並且從InputStream套接字讀取一個字節,那麼由於Java應用程序執行的系統調用數量很可能會造成嚴重的性能下降。

+0

感謝您的幫助!我認爲這是我需要的。 – Sam 2010-09-17 11:50:44

+0

如果套接字**包含UTF8字符並且它們被**分隔,您會推薦'BufferedReader'嗎? – 2013-11-21 10:21:23

+1

@Zoltán - 可能是的,但它取決於分隔符之間的內容/容量,以及您需要如何處理它。但無論如何,這是一個不同的問題。 – 2013-11-21 14:27:42

0

閱讀器用於閱讀文本,因此您可能需要InputStream。當緩衝它們時,流通常效率更高,所以使用BufferedInputStream。我不知道任何內置的函數來檢測流數據中的標記,所以你必須自己做。