2

我正在创建一个在手机上运行的移动应用程序,并尝试以最有效的方式从中读取数据。该应用程序会将数据发送到我的服务器应用程序(以字节的形式,不一定是字符)。

我不知道数据的长度;结尾会用一个 3 字节的标记(即 0x11,0x22,0x33)进行标记,然后会发送一组新的数据。很可能在每个“数据集”中都会发送大量数据。那么,我想知道读取这些数据的最有效方法是什么。我应该使用InputStreamReader吗?BufferedReader? 显然,我需要检查每个字符以查看它是否是标记的一部分,如果是,则将标记之前的所有数据发送到另一个方法进行处理。

据我所知,如果我的结束标记是 a (显然,情况并非如此) ,BufferedReader.readLine()那将是我想要的。我是否需要编写自己的方法来逐字节读取并查找我的标记?(我也不知道这是否是最有效的方法?)\nBufferedReader

4

2 回答 2

6

假设您的数据是字节数据而不是字符数据,您应该将套接字输入流包装在 a 中BufferedInputStream,并使用它一次读取一个字节的数据,将字节保存在某种字节缓冲区中。(一种选择是使用 aByteArrayOutputStream来缓冲您从 . 中读取的数据字节BufferedInputStream。)

BufferedReader并且readLine()不是要走的路:

  • 假设数据不是字符数据,如果您尝试根据某些字符集对其进行解码,则可能会破坏它。
  • 该方法仅理解由和/或字符readLine分隔的行。没有办法让它理解其他“行”分隔符。'\n''\r'

最后,请注意,BufferedInputStream出于性能原因,这非常重要。如果您不使用一个,并且一次从套接字 InputStream 读取一个字节,那么由于您的 Java 应用程序执行的系统调用的数量,您可能会遭受重大的性能损失。

于 2010-09-17T03:46:52.740 回答
0

Reader 用于阅读文本,因此您可能需要 InputStream 代替。当你缓冲它们时,流通常更有效,所以使用 BufferedInputStream。而且我不知道有任何内置函数可以检测流数据中的标记,所以你必须自己做。

于 2010-09-17T03:52:34.480 回答