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