【问题标题】:dealing with Streams and ContentProducer - Java处理 Streams 和 ContentProducer - Java
【发布时间】:2011-07-14 15:50:28
【问题描述】:

我对使用流进行编码还很陌生,但现在我必须这样做才能更有效地进行 Http 编码。

这是我为获取 HttpClient 的 ContentProducer 而编写的(不工作)代码:

public static ContentProducer getContentProducer(final Context context, final UUID gId)
    {
        return new ContentProducer()
        {
            public void writeTo(OutputStream outputStream) throws IOException
            {
                outputStream = new Base64.OutputStream(new FileOutputStream(StorageManager.getFileFromName(context, gId.toString())));

                outputStream.flush();
            }
        };
    }

我在这里使用 Base64 流编码器:http://iharder.sourceforge.net/current/java/base64/ 我的目标是使用此函数将我从二进制文件中读取的数据作为 base64 编码流提供给 HttpClient。

这就是我消费内容制作者的方式:

private MyHttpResponse processPOST(String url, ContentProducer requestData)
    {
        MyHttpResponse response = new MyHttpResponse();

        try
        {
            HttpPost request = new HttpPost(serviceURL + url);
            HttpEntity entity = new EntityTemplate(requestData);
            request.setEntity(entity);

            ResponseHandler<String> handler = new BasicResponseHandler();
            response.Body = mHttpClient.execute(request, handler);
        }
        catch (HttpResponseException e)
        {

        }
        catch (Throwable e)
        {

        }

        return response;
    }

我有另一个与 GSON 流媒体一起使用的 ContentProducer(它正在工作):

public ContentProducer getContentProducer(final Context context)
    {
        return new ContentProducer()
        {
            public void writeTo(OutputStream outputStream) throws IOException
            {
                Gson myGson = MyGsonWrapper.getMyGson();
                JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, "UTF-8"));

                writer.beginObject();

                // stuff

                writer.endObject();

                writer.flush();
            }
        };
    }

我的问题是:如何使我的第一个示例工作。我做得对吗?现在我在服务器端收到空帖子,所以似乎没有数据通过。

【问题讨论】:

    标签: java android http


    【解决方案1】:

    编辑:

    我认为问题在于您在 ContentProviders writeTo() 方法中传递了一个 OutputStream,而您正在用自己的 OutputStream 覆盖它。该类/方法的约定可能要求您将数据写入传递给您的OutputStream

    基于查看Android Documentation,我看不到您指定要使用的OutputStream 的方法,因此您可能只需将文件的数据写入OutputStream,即进来了。

    相反,您应该这样做:

    public void writeTo(OutputStream outputStream) throws IOException
    {
        byte[] buf = createByteBufferFromFile(StorageManager.getFileFromName(context, gId.toString()));
        outputStream.write(buf);
        outputStream.flush();
    }
    

    当然,您需要为我提到的 createByteBufferFromFile(...) 方法提供一个实现。同样,您应该注意,您不太可能使用Base64 OutputStream,所以如果这是必要的,那么您可能必须找到不同的方法。

    【讨论】:

    • 我应该如何修改我的第一个示例以使其工作?我需要从文件中传递带有 Base64 流的 ContentProducer
    • 只是为了澄清更多 - 第一个例子是我的代码。我正在尝试使用文件中的 base64 编码数据构建生产者。
    • 那么,你们的制作人有问题吗?如果是这样,问题是什么?当问题不清楚时,很难提供帮助。我鼓励您编辑问题,以尝试向我们提供有关每个代码 sn-p 是/意味着什么、您的问题是什么以及您尝试过什么的更多详细信息...
    • 感谢您的回答!这太糟糕了。我需要找到一种流式传输 base64 编码数据的方法。将文件加载到内存中不适用于小 RAM。我需要上传大图..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多