Gsutil инструмент для облачного хранилища Google с Java
Если у нас есть около 30 ГБ файлов (в диапазоне от 50 МБ до 4 ГБ), которые необходимо загружать в Google Cloud Storage каждый день, согласно документации Google, gsutil может быть единственным подходящим выбором, не так ли?
Я хочу вызвать команду gsutil через Java, теперь приведенный ниже код может работать. Но если я удалю этот цикл while, программа остановится сразу же после выполнения runtime.exec (команды), но процесс python был запущен, но загрузка не производилась, и он скоро будет убит. Интересно, почему.
Причина, по которой я читаю из потока sterr, основана на выводе gsutil в файл Pipe
Я решаю, завершит ли gsutil выполнение read read последней строкой своего состояния, но является ли это надежным способом? Есть ли лучшие способы определить, заканчивается ли выполнение gsutil в Java?
String command="python c:/gsutil/gsutil.py cp C:/SFC_Data/gps.txt"
+ " gs://getest/gps.txt";
try {
Process process = Runtime.getRuntime().exec(command);
System.out.println("the output stream is "+process.getErrorStream());
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = reader.readLine()) != null){
System.out.println("The inout stream is " + s);
}
} catch (IOException e) {
e.printStackTrace();
}
2 ответа
Несомненно, существует более одного способа загрузки данных 30G в день в GCS. Поскольку вы работаете в Java, рассматривали ли вы возможность использования клиентской библиотеки Java Cloud Storage API? https://developers.google.com/api-client-library/java/apis/storage/v1
Что касается конкретных вопросов о вызове gsutil из Java с помощью Runtime.exec(), я подозреваю, что при отсутствии цикла while программа завершит работу сразу после создания подпроцесса, в результате чего переменная "process" будет GC'ed, который может убить подпроцесс.
Я думаю, что вам следует дождаться завершения подпроцесса, что и делает цикл while. Или вы можете просто вызвать waitFor() и проверить existValue(), если вас не волнует вывод: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html
Я рисую следующую картинку согласно объяснениям Чжихонга Яо. Надеюсь, что это может помочь любому с тем же вопросом, что и мой.