【问题标题】:How to wrap Uri content with a nio.ByteBuffer on Android?如何在 Android 上用 nio.ByteBuffer 包装 Uri 内容?
【发布时间】:2014-06-04 19:55:11
【问题描述】:

我正在尝试从 Android 上的 Uri 读取内容,我需要通过 nio.ByteBuffer 将最终 Object 类型传递给底层 SDK。

我可以通过 ContentResolver 获得 InputStream,但没有找到用 nio.ByteBuffer 包装它的方法。

有没有办法在 Android 上将 Uri 内容转换为 nio.ByteBuffer?

【问题讨论】:

    标签: android nio bytebuffer android-contentresolver mappedbytebuffer


    【解决方案1】:

    我已经把Uri的内容下载到本地,通过其他方法打开获取ByteBuffer

    【讨论】:

      【解决方案2】:

      假设你正在处理一个 Activity,

      private ByteBuffer getByteBuffer(Uri uri){
          try{
              InputStream iStream = getContentResolver().openInputStream(uri);
              if(iStream!=null){
                  //value of MAX_SIZE is up to your requirement
                  final int MAX_SIZE = 5000000;
                  byte[] byteArr = new byte[MAX_SIZE];
                  int arrSize = 0;
                  while(true){
                      int value = iStream.read(byteArr);
                      if(value == -1){
                          break;
                      }else{
                          arrSize += value;
                      }
                  }
                  iStream.close();
                  return ByteBuffer.wrap(byteArr, 0, arrSize);
              }
          }catch(IOException e){
              //do something
          }
          return null;
      }
      

      注意事项:

      (i)InputStream.read(byte[] b) 将返回一个整数,表示每次读入字节数组b 的总字节数。

      (ii)如果InputStream.read(Byte[] b)返回-1,则表示输入流结束。

      (iii)arrSize存储读取的总字节数,即byte[] b的长度

      (iv)ByteBuffer.wrap(byte[] b, int offset, int length) 将包装字节数组以提供 ByteBuffer。你可以检查这个reference

      (v) ContentResolver.openInputStream(Uri uri)InputStream.read(byte[] b) 会抛出 IOException,所以你必须处理它。

      (vi) 注意:如果arrSize > MAX_SIZE 可能会发生IndexOutOfBoundException,您可能需要添加if-else 子句来处理此类问题。

      如果有任何错误或有更快的方法,请随时评论或更改代码。快乐编码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        相关资源
        最近更新 更多