java - 处理 Streams 和 ContentProducer - Java

标签 java android http

我对使用流进行编码还很陌生,但现在我必须这样做才能更有效地进行 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 Streamer 一起使用的 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();
            }
        };
    }

我的问题是:如何使我的第一个示例发挥作用。我做得正确吗?现在我在服务器端收到空帖子,所以看起来没有数据通过。

最佳答案

编辑:

我认为问题在于您在 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,因此如果这是必要的,那么您可能必须找到不同的方法。

关于java - 处理 Streams 和 ContentProducer - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696108/

相关文章:

java - 如何进行自定义 Eclipse 构建?

java - 在修改java中的条目集值时同步对静态 HashMap 的访问

java - try catch block 不适用于 sql

java - 如何为单个对象添加连续 LOD?

android - '非法状态异常 : Activity has been destroyed' when 'getSupportFragmentManager()' called after Activity restart

rest - 如何将大量数据发送到无状态 RESTful 检索服务

android - 安装后自动将小部件放在桌面上

java - 该方法必须返回InputStream类型的结果

java - 通过 RESTful Web 服务编辑对象

http - 我应该什么时候响应我网站上的 HTTP HEAD 请求