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

Я рисую следующую картинку согласно объяснениям Чжихонга Яо. Надеюсь, что это может помочь любому с тем же вопросом, что и мой.

введите описание изображения здесь

Другие вопросы по тегам