我有一个使用Jclouds API从OpenStack Swift对象存储中检索InputStream的java程序。
我在读取此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();
当我在没有调试的情况下运行此代码或没有休眠线程时,它不返回任何内容。所以我确信这是一个时间问题,因为等待导致读取成功。我的困惑在于,我认为Read for BufferedReader是阻塞的,如下所示:http://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html#read--
当我尝试在创建后立即看到inputStream上的.available时,它读为0.我知道Thread.sleep将部分解决问题,但我希望找到一个更明智的解决方案。
如果有人对此类问题有任何经验,我将非常感激。谢谢。