Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java OutputStream将整个文件缓冲到流中_Java_Android_Http_Inputstream_Outputstream - Fatal编程技术网

Android Java OutputStream将整个文件缓冲到流中

Android Java OutputStream将整个文件缓冲到流中,java,android,http,inputstream,outputstream,Java,Android,Http,Inputstream,Outputstream,我有一个应用程序需要将视频文件从gallery(或camera应用程序)加载到应用程序中,然后将该视频文件发送到HTTP PUT请求中,并发送到预先签名的S3上载url 我的问题是,当我在androidstudio上查看分析器时,代码的HTTPURLConnection部分似乎占用了大量内存。在那个特定时刻内存使用量的增加相当于视频文件的大小,因此我假设整个视频文件字节都加载到内存中。这是我的代码片段和我到目前为止尝试的内容。 所有这些试验的结果都是相同的 HttpURLConnecti

我有一个应用程序需要将视频文件从gallery(或camera应用程序)加载到应用程序中,然后将该视频文件发送到HTTP PUT请求中,并发送到预先签名的S3上载url

我的问题是,当我在androidstudio上查看分析器时,代码的HTTPURLConnection部分似乎占用了大量内存。在那个特定时刻内存使用量的增加相当于视频文件的大小,因此我假设整个视频文件字节都加载到内存中。这是我的代码片段和我到目前为止尝试的内容。 所有这些试验的结果都是相同的

    HttpURLConnection connection = (HttpURLConnection) urls[0].openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("PUT");
    connection.setRequestProperty("Content-Type", "video/mp4");
    
    BufferedInputStream in =
            new BufferedInputStream(getActivity().getContentResolver()
                                             .openInputStream(uri));
    DataOutputStream out =
            new DataOutputStream(connection.getOutputStream());
    int bufferSize = 8 * 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = in.read(buffer)) != -1) {
       out.write(buffer, 0, len);
       out.flush();
       // After I flush the output stream, shouldn't the out.size() be 0?
       // When I print logs here, the out stream's size keeps growing to the video file's size.
    }

    in.close();
    out.close();
我也试过这样做
IOUtils.copyStream(输入、输出)
我还尝试使用了
BufferedOutputStream
而不是
DataOutputStream

  • 从代码来看,为什么我的代码会将整个文件加载到内存中,尽管我每次从输入流读取8KB的数据
  • 当我刷新DataOutputStream时,为什么我的OutputStream仍然不是0字节
  • 对于超过200MB的大文件,实现这一目标的最佳方法是什么

  • 提前谢谢

    //当我在这里打印日志时
    我看不到你在这样做。也许缓冲输入流正在这样做?尝试不使用。@blackapps是的,我只是在那里打印日志,但我没有复制粘贴日志代码。我尝试改用常规的InputStream,但没有luckIt是
    HttpURLConnection
    这样做的,因此它可以设置
    Content-length
    头。您可以通过使用分块传输模式来避免这种情况。注意:不要在环内冲洗。“刷新输出流后,out.size()是否应该为0?”:否。。。。因为返回“到目前为止写入此数据输出流的字节数”。不是缓冲区中当前的字节数:事实上,
    DataOutputStream
    没有缓冲区。