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;
而idx您可能需要编写一个完整的阻塞适配器作为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中没有找到相应的方法。更新了一个问题。因为流的长度通常是未知的,所以除非您愿意缓冲所有数据,否则无法预先告诉它,请预先转换它并获取其长度。也允许您不知道它:。