正在等待来自Jclouds(Java)的InputStream

正在等待来自Jclouds(Java)的InputStream,java,asynchronous,inputstream,openstack,jclouds,Java,Asynchronous,Inputstream,Openstack,Jclouds,我有一个java程序,它使用Jclouds API从OpenStack Swift对象存储中检索InputStream 我在读取此InputStream的内容时遇到问题,当我在没有任何Thread.sleeps或调试的情况下运行程序时,内容通常返回null。当我在每一行读取之前添加一个“Thread.sleep(2000);”时,文件的读取效果很好。此外,当我在调试模式下单步执行读取过程时,读取会正常进行 我试图逐行读取InputStream的内容,这是检索和读取InputStream的提取代码

我有一个java程序,它使用Jclouds API从OpenStack Swift对象存储中检索InputStream

我在读取此InputStream的内容时遇到问题,当我在没有任何Thread.sleeps或调试的情况下运行程序时,内容通常返回null。当我在每一行读取之前添加一个“Thread.sleep(2000);”时,文件的读取效果很好。此外,当我在调试模式下单步执行读取过程时,读取会正常进行

我试图逐行读取InputStream的内容,这是检索和读取InputStream的提取代码:

import org.jclouds.openstack.swift.v1.SwiftApi;
import org.jclouds.openstack.swift.v1.domain.SwiftObject;
import org.jclouds.openstack.swift.v1.features.ObjectApi;

ObjectApi api = this.container.getObjectApi();
SwiftObject obj = api.get(this.file);
InputStream file = obj.getPayload.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(file));
StringBuilder sb = new StringBuilder(INITIAL_READ_SIZE);
for(int c = reader.read(); c> -1 && c !='\n'; c = reader.read()) {
    sb.append((char) c);
}
return sb.length > 0 ? Optional.of(sb) : Optional.empty();
当我在不调试或不睡眠线程的情况下运行此代码时,将不会返回任何结果。所以我相信这是一个时间问题,因为等待会导致阅读成功。我感到困惑的是,我的印象是,BufferedReader的读取正在阻塞,如下所述:

当我尝试在创建后立即在inputStream上查看.available时,它的读数为0。我知道Thread.sleep可以部分解决问题,但我希望找到一个更合理的解决方案


如果有人对这类问题有任何经验,我将不胜感激。谢谢。

永远不要使用InputStream.available(),因为它不可靠,因为InputStream的所有类型和子类都提供了一种方法。出于好奇-你为什么不使用它?实际的阅读部分是由opencsv.CSVReader完成的,这只是CSV阅读器对输入流所做工作的一个升华。我有一个openCSV的本地副本,我试图改变实际的读取方法,但没有成功;具体是哪个电话?Swift是一个最终一致的系统,因此在执行put之后立即执行get可能会失败。