Ожидание InputStream от Jclouds (Java)
У меня есть Java-программа, которая извлекает InputStream из OpenStack Swift Object Storage с помощью API Jclouds.
У меня возникла проблема с чтением содержимого этого InputStream, содержимое обычно возвращает ноль, когда я запускаю программу без Thread.sleeps или отладки. Когда я добавлю "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
Когда я пытаюсь увидеть.available на inputStream сразу после создания, он читается как 0. Я знаю, что Thread.sleep частично решит проблему, но я надеюсь найти более разумное решение.
Если у кого-то есть опыт работы с такого рода проблемами, я был бы очень признателен. Спасибо.