【问题标题】:Java InputStream . Is there is Correct And Efficient way?Java 输入流。有正确有效的方法吗?
【发布时间】:2013-07-13 20:44:33
【问题描述】:

我正在开发 Android 上的蓝牙应用程序。此 inputStream 来自连接套接字。我想读取一定长度的字节。

我尝试的第一种方法:

byte[] data = new byte[lengthtoread];
for (int i = 0; i < data.length; i++)
    data[i] =(byte) mmInStream.read() ;

我发现它太慢了。

第二种方式:

   byte[] data = new byte[lengthtoread];
   mmInStream.read(data, 0, lengthtoread);

在这我发现当读取的长度太大时它没有完全读取数据

有人帮帮我吗??

【问题讨论】:

  • 你是怎么意识到的(在第二种方法中)? lengthtoread 的值是多少?目标文件大小是多少?
  • lengthtoread 很大,有时或多或少接近 90000
  • 那么为什么要一次阅读所有内容?这不是一个好主意,尝试缓冲数据
  • 缓冲区的可靠大小是多少??
  • 它依赖于哥们,它依赖于目标环境,你需要像J2ME应用程序这样的小型设备,但它在服务器中可能很大,它也依赖于数据速率,如果数据速率很慢,保持缓冲区小,对于任何获取的数据做业务,有时它依赖于业务,例如每个任务至少需要 4096 字节,我不能说 多少是好的,它依赖于哥们:)

标签: java inputstream bytebuffer bufferedinputstream inputstreamreader


【解决方案1】:

仅使用标准 API,DataInputStream 类有一个名为 readFully 的方法,它从流中填充字节数组:

byte[] data = new byte[lengthtoread];
DataInputStream in = new DataInputStream(mmInStream);
in.readFully(data);

完成后不要忘记关闭流!

【讨论】:

    【解决方案2】:

    你到底想做什么?

    如果要从文件中读取所有字节,请执行以下操作:

    Files.readAllBytes(Paths.get("filename.txt"));

    http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes%28java.nio.file.Path%29

    【讨论】:

    • 它的输入流来自蓝牙连接而不是来自文件。我只想要一些字节
    【解决方案3】:

    是的:使用 Jakarta Commons IOUtils。此类包含用于读取和写入流的完全调试的实用方法。

    如果要读取整个流,请使用IOUtils.toByteArray()。但是,请注意,执行此操作时可能会耗尽内存。通常最好一次处理一段流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      相关资源
      最近更新 更多