处理Streams和ContentProducer - Java

时间:2011-07-14 15:50:28

标签: 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/ 我的目标是使用此函数将我从二进制文件读取的数据提供给HttpClient作为base64编码流。

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

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();
            }
        };
    }

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

1 个答案:

答案 0 :(得分:1)

修改

我认为问题在于您使用OutputStream ContentProviders方法传递了writeTo(),并且您使用自己的OutputStream覆盖了它。该类/方法的合同可能要求您将数据写入传递给您的OutputStream

基于查看Android Documentation,我没有看到您指定要使用的OutputStream的方法,因此您可能需要将文件的数据写出来{ {1}}传入。

相反,你应该这样做:

OutputStream

当然,您需要为我提到的createByteBufferFromFile(...)方法提供一个实现。同样,您应该注意,您不太可能使用public void writeTo(OutputStream outputStream) throws IOException { byte[] buf = createByteBufferFromFile(StorageManager.getFileFromName(context, gId.toString())); outputStream.write(buf); outputStream.flush(); } ,因此如果这是必要的,那么您可能需要找到不同的方法。