Arrays 有没有办法将可观察的传递到AbstractInputStreamContent?

Arrays 有没有办法将可观察的传递到AbstractInputStreamContent?,arrays,google-drive-api,rx-java,rx-java2,google-drive-realtime-api,Arrays,Google Drive Api,Rx Java,Rx Java2,Google Drive Realtime Api,我正在把一个文本文件上传到谷歌硬盘 ByteArrayContent content = new ByteArrayContent("text/csv", fileContent.getBytes(Charset.forName("UTF-8"))); Drive.Files.Insert request = drive.files().insert(file, content); 其中typefileContent=String 我想重构并将fileContent的类型更改为Observab

我正在把一个文本文件上传到谷歌硬盘

ByteArrayContent content = new ByteArrayContent("text/csv", fileContent.getBytes(Charset.forName("UTF-8")));
Drive.Files.Insert request = drive.files().insert(file, content);
其中typefileContent=String

我想重构并将fileContent的类型更改为Observable,是否有好的解决方法将其传递给以AbstractInputStreamContent作为第二个参数的插入函数

谢谢

这是一个通用的可流动->输入流桥接器,您可以委托:

导入java.io.*; 导入java.nio.charset.charset; 导入java.util.concurrent.AtomicReference; 导入org.reactivestreams.*; 导入io.reactivex.FlowableSubscriber; 导入io.reactivex.internal.subscriptions.SubscriptionHelper; 公共最终类FlowableStringInputStream{ 私有FlowableStringInputStream{ 抛出新的非法状态例外无实例!; } 公共静态InputStream createInputStream 发布者源,字符集字符集{ StringInputStream父项=新StringInputStreamcharset; source.subscribeeparent; 返回父母; } 静态最终类StringInputStream扩展了InputStream 实现FlowableSubscriber{ 最终原子参考上游; 最终字符集字符集; 易失字节[]字节; 整数指数; 挥发性布尔完成; 一次性错误; StringInputStreamCharset字符集{ this.charset=charset; 上游=新原子参考; } @凌驾 订阅时的公共无效订阅{ 如果SubscriptionHelper.setOnceupstream,则为{ s、 请求1; } } @凌驾 公共无效ONNEXTT字符串{ 字节=t.getBytescharset; 同步这个{ 通知所有人; } } @凌驾 可丢弃的公共垃圾{ 误差=t; 完成=正确; 同步这个{ 通知所有人; } } @凌驾 公共空间未完成{ 完成=正确; 同步这个{ 通知所有人; } } @凌驾 公共int读取引发IOException{ 为了{ 字节[]a=如有必要; 如果a==null{ 可丢弃ex=错误; 如果ex!=null{ if ex instanceof IOException{ 抛出IOExceptionex; } 抛出新的IOExceptionex; } 返回-1; } int idx=指数; 如果idx==a.length{ 指数=0; 字节=空; 上游.get.request1; }否则{ int result=a[idx]&0xFF; 指数=idx+1; 返回结果; } } } 字节[]waitBufferIfEssential引发IOException{ 字节[]a=字节; 如果a==null{ 同步这个{ 为了{ 布尔d=完成; a=字节; 如果a!=null{ 打破 } 如果d | | upstream.get==SubscriptionHelper.CANCELLED{ 打破 } 试一试{ 等待 }捕获中断异常{ 如果upstream.get!=SubscriptionHelper.CANCELLED{ InterruptedIOException exc=新的InterruptedIOException; exc.initCauseex; 抛出exc; } 打破 } } } } 返回a; } @凌驾 public int readbyte[]b,int off,int len抛出IOException{ 如果关闭<0 | | len<0 | | off>=b.length | | off+len>b.length{ 抛出新的IndexOutOfBoundsException b、 长度=+b.length+,off=+off+,len=+len; } 为了{ 字节[]a=如有必要; 如果a==null{ 可丢弃ex=错误; 如果ex!=null{ if ex instanceof IOException{ 抛出IOExceptionex; } 抛出新的IOExceptionex; } 返回-1; } int idx=指数; 如果idx==a.length{ 指数=0; 字节=空; upstream.get.req uest1; }否则{ int r=0; 而idx0{ b[off]=a[idx]; idx++; off++; r++; len-; } 指数=idx; 返回r; } } } @凌驾 公共int可用引发IOException{ 字节[]a=字节; int idx=指数; 返回a!=null?Math.max0,a.length-idx:0; } @凌驾 公共无效关闭引发异常{ SubscriptionHelper.cancelupstream; 同步这个{ 通知所有人; } } } } 用法:

@Testtimeout=10000 公共void异步引发异常{ AtomicInteger调用=新的AtomicInteger; Flowable f=Flowable.range100,10.mapObject::toString .doOnCancel->calls.incrementAndGet .subscribeOnSchedulers.computation .delay10,时间单位为毫秒; try InputStream is=FlowableStringInputStream.createInputStreamf,utf8{ assertEquals'1',is.read; assertEquals'0',is.read; assertEquals'0',is.read; 字节[]buf=新字节[3]; 资产质量3,is.readbuf; assertArrayEquals101.getBytesutf8,buf; } assertEquals1,calls.get; }
您可能需要编写一个完整的阻塞适配器作为AbstractInputStreamContent,或者寻找一个使用Google自己的反应式API gRPC、AGRA等编写的适配器。看起来很棒,您能帮我集成这段代码吗?我尝试过这样做,但没有成功,因为insert需要AbstractInputStreamContent作为第二个参数。InputStream in=FlowableStringInputStream.createInputStreamFlowable.just,Charset.forNameUTF-8;Drive.Files.Insert req=Drive.Files.insertfile,in;创建AbstractInputStreamContent的实例并委托给in的相应方法。谢谢,因此基本上有3个方法:getInputStream应该返回我以前创建的这个实例InputStream InputStream=FlowableStringInputStream.createInputStreamtextFlowable,Charset.forNameUTF-8;,retrySupported->false,如何以良好的方式提供getLength的实现?我在FlowableStringInputStream中没有找到相应的方法。更新了一个问题。因为流的长度通常是未知的,所以除非您愿意缓冲所有数据,否则无法预先告诉它,请预先转换它并获取其长度。也允许您不知道它:。