- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我打算将结构化数据写入通过 HTTP 客户端访问的资源。用于执行此操作的 API(对于 JSON、YAML、XML)往往会让我向它们传递一个 OutputStream
,它们将写入该输出流 - 它们不会给我一个 InputStream
。
无论好坏,这里使用的客户端都是 Apache HTTP 组件 HttpClient。 (我们使用的其他库依赖于它。在大多数情况下,它并不完全是坏事,至少不会迫使我们采用奇怪的线程本地黑客技术来获得正常的行为,这与 java.net.URL
不同。)
发出请求时,HttpEntityEnlookingRequestBase
(在 HttpClient 中)强制我设置 HttpEntity
以将任何数据发送到服务器。 HttpEntity
似乎迫使我实现 getContent()
,返回一个 InputStream
。
我没有 InputStream
,因此我被迫在两种解决方法之间进行选择:
A) 将所有数据序列化到内存中的字节数组中,然后再次将其全部流式输出。我不想这样做,因为通常情况下,数据的序列化形式比数据本身占用更多的内存,并且在某些情况下我们甚至一开始就没有它在内存中,所以这会带来麻烦。
B) 创建一个管道
。启动第二个线程以将对象写入管道的 OutputStream
端。返回InputStream
结束。这实际上无法在 HttpEntity
本身中完成,因为 HttpEntity
不知道何时不再需要数据流。 (它可以做出有根据的猜测,当您到达流的末尾时,它就完成了,但是如果与服务器的连接中途断开,您将使管道永远打开。)这意味着我最终将解决方法移动到建立连接的每个地方,这是大量的结构重复。
这些解决方法都不是很好,但我猜 (B) 是“更少的狗屎”,因为它至少不会在传输大对象时使整个应用程序崩溃。
据我所知:
public class WriteLogicEntity extends AbstractHttpEntity {
private final WriteLogic writeLogic;
public InputStreamEntity(WriteLogic writeLogic) {
this(instream, null);
}
public InputStreamEntity(WriteLogic writeLogic,
ContentType contentType) {
this.writeLogic = writeLogic;
if(contentType != null) {
this.setContentType(contentType.toString());
}
}
@Override
public boolean isRepeatable() {
// We could enforce that all WriteLogic be repeatable
// or add a similar method there, but at least for now,
// assuming it isn't repeatable is safe.
return false;
}
@Override
public long getContentLength() {
// We really don't know.
return -1L;
}
@Override
public InputStream getContent() throws IOException {
//TODO: What do we do here?
}
@Override
public void writeTo(OutputStream outstream) throws IOException {
writeLogic.withOutputStream(outstream);
}
@Override
public boolean isStreaming() {
return true; //TODO: Verify this choice
}
}
public interface WriteLogic {
void withOutputStream(OutputStream stream) throws IOException;
}
现在我想知道 getContent()
是否可以抛出 UnsupportedOperationException。当然,在发出请求时,他们无论如何都会使用 writeTo() ,对吗?嗯,我想不通。即使它在一个实验中有效,也不能向我保证某种请求不可能要求调用 getContent()
。
所以我想知道是否有比我更了解这个库的人可以调用它 - 跳过实现这个方法是否安全?
(这个 getContent()
方法似乎不应该出现在 API 中。或者应该将其记录下来,至少允许我以某种方式实现它。无论如何,我打算提交一个有关它的错误,因为当您尝试编写请求时,被迫提供 InputStream
非常不方便。)
最佳答案
如果实体内容无法表示为 InputStream getContent
方法可能会抛出 UnsupportedOperationException。 HttpClient 在内部使用 writeTo
将实体内容流式传输到底层 HTTP 连接。
关于java - 我可以跳过实现 HttpEntity#getContent() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270670/
我的算法- private static MyList skip$DeleteItem(MyList L , int M , int N){ MyList curr = L; MyLi
我正在 SWI-Prolog 下开发,但我的目标是 Erlog (https://github.com/rvirding/erlog)。我需要一种使用非标准 Prolog 语法的方法。 有没有办法
我正在尝试从应用程序下载一大堆文件。它的shell命令是“下载文件名”。 我有一个文本文件,其中包含必须下载的所有文件名。我要做的就是运行一个脚本/命令,以便在执行上述命令时 1.从文本文件中提取文件
我试图循环遍历所有用户的评论,但使用 if 语句查找特定值。问题是我的应用程序崩溃了,因为一些用户没有发表评论,因此我得到“无法读取‘收集’未定义的属性”。如何跳过 if 语句的未定义值?代码如下:
我们有按年份分区的索引,例如: items-2019 items-2020 考虑以下数据: POST items-2019/_doc { "@timestamp": "2019-01-01" }
我只是编写一个页面来按实体编号查看每个 ASCII 条目,我想知道是否有一种更简单/更干净的方法来跳过不需要的数字。 var x = new Ar
我希望能够普遍使用重复条目,但也能够跳过特定日期。例子: ** TODO swim practice SCHEDULED 但是,我提前知道 2013-12-25 不会有练习。但是,当我将项目标
如何跳过像这样的 for 循环的一次迭代: for (int i = 65; i <= 90; i++) { if (!(i == 73)) { uniq.add((char) i);
这个问题已经存在: Scanner issue when using nextLine after nextXXX [duplicate] 已关闭 9 年前。 ask=1; while(ask==1)
我在使用一个程序时遇到了一些麻烦,我应该允许用户在程序中输入任意数量的数字,直到他们不再想要为止。然后程序应该计算输入数字的平均值和最大值。我哪里做错了? import java.util.Scann
我有一个名为segments的 Sprite 数组,我想在每个循环中跳过segments的第一个元素。我目前正在这样做: var first = true; for each (var segment
我目前正在编写一个 for 循环来遍历包含 38 个元素的 2D。然而,其中一些元素为空,我希望 for 循环简单地跳过它们(因为在我正在解决的难题中,它们没有与它们相关的移动)。快速搜索表明,我可以
我想使用pre-commit处理我的 git 项目的 git hooks。但是,当我使用它时,git commit 命令不断跳过 unittest 执行: (smartexchange) trnboo
这个问题在这里已经有了答案: Does scanf() take '\n' as input leftover from previous scanf()? (1 个回答) 关闭 9 年前。 我正在
我正在迭代 csv 文件中的每一行,并仅选择/计算满足条件的行。但是,当连续出现错误时,它会停止循环。有没有办法告诉 python 跳过错误并移动到下一行?我使用了 try 函数但没有工作。我的代码是
感谢您提供的优秀示例,我试过了,它按我的预期工作。很高兴看到有人了解问题的本质。但是,我认为我应该用 Lift 标记问题,因为我正在使用 Lift 框架,这就是(仍然)发生这个问题的地方(尽管我仍然认
大家好,我正在编写一个算法来从 NodeTree 中删除具体分支(例如 DSF)。如果您选择 Node 的名称,算法将检查该 Node 是否是其他 Node 的父 Node ;如果是,它会获取该 No
附有代码和输出。 基本上它是第二次跳过我的输入。就像我启动代码一样,它让我输入一个选项,然后第二次跳过输入,直接转到开关的默认情况。 然后第三次它就会允许我输入。不明白为什么。 任何帮助将不胜感激。
我在 JavaScript 中有一个 for 循环,它会定期跳过间隔,但我无法确定原因。 console.log(parseInt($('input.num-to-add').val())); num
我正在 JasperSoft 中填写参数。在我的报告中我有参数:参数_1、参数_2、参数_3 int a; for (a = 0; a < headers.length; a++) {
我是一名优秀的程序员,十分优秀!