等待Jclouds的一个InputStream(Java)

时间:2017-01-13 16:13:41

标签: java asynchronous inputstream openstack jclouds

我有一个使用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将部分解决问题,但我希望找到一个更明智的解决方案。

如果有人对此类问题有任何经验,我将非常感激。谢谢。

0 个答案:

没有答案