Вопрос

В настоящее время я работаю над веб-приложением, которое включает в себя подключение диска и извлечение файла tar.gz, и все это на Java.Поскольку приложение работает в среде Linux, я решил попробовать использовать команды Unix, такие как «mount» и «tar».

Runtime runtime = Runtime.getRuntime();
Process proc;

String mountCommand = "mount -t cifs -o username=...";
String extractCommand = "tar xzf ..."

proc = runtime.exec(mountCommand);
proc.waitFor();

proc = runtime.exec(extractCommand);
proc.waitFor();

Запуск команды монтирования и команды извлечения в терминале работает нормально, но происходит сбой при ПЕРВОМ запуске в java.Второй метод proc.waitFor() возвращает код выхода 2.Однако запуск этого кода после первой неудачной попытки работает нормально.У меня такое ощущение, что проблема в том, что waitFor() не ждет полного завершения команды монтирования.Я упускаю что-то важное в своем коде?

Кроме того, я бы предпочел сделать все это на Java, но мне было очень трудно понять, как распаковать файл, поэтому я использую этот подход.(о, если кто-нибудь скажет мне, как это сделать, я буду очень рад).Любые предложения будут оценены по достоинству!

Это было полезно?

Решение 2

Продвигается.Если кому-то интересно, вот как я извлекаю файл tar.gz на Java.Составлено из нескольких онлайн-уроков.

public static void extract(String tgzFile, String outputDirectory)
    throws Exception {

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(outputDirectory + File.separator + tarEntry.getName());

    if (tarEntry.isDirectory()) {
    destPath.mkdirs();
    } else {
    // If the parent directory of a file doesn't exist, create it.
    if (!destPath.getParentFile().exists())
        destPath.getParentFile().mkdirs();

    FileOutputStream fout = new FileOutputStream(destPath);
    tin.copyEntryContents(fout);
    fout.close();
    // Presserve the last modified date of the tar'd files.
    destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();
}

Другие советы

Быстрый ответ

Поскольку существует зависимость от внешних команд, упростите ее следующим образом:

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...

Назови это mount-extract.sh затем вызовите его, используя один Runtime.exec() вызов.

Полуинтегрированный ответ

Используйте API Java.

Тебе понадобится Runtime.exec для выполнения команды монтирования.

Перспективный

Поскольку Java является кросс-платформенным инструментом разработки программного обеспечения, рассмотрите возможность абстрагирования команды монтирования в вашем приложении, чтобы она производилась динамически на основе базовой операционной системы.

Видеть: Как я могу смонтировать диск Windows в Java?

Видеть: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

Конечно, Agile-разработка будет настаивать на том, чтобы этого не делалось до тех пор, пока в этом нет необходимости.Так что держите это в уме до тех пор (поскольку вы, возможно, никогда не запустите приложение ни на чем, кроме систем на базе Unix).

Взгляните на org.apache.tools.tar пакет в базе кода Ant.В этом пакете есть класс, Таринпутстрим, который можно использовать для чтения tar-архивов.

Это может быть связано с тем, как вы вызываете метод.

Видеть это отвечать

В основном попробуйте использовать

.exec( String [] command );

вместо

.exec( String command );

Я не уверен, связано ли это вообще, потому что вы упомянули, что это запускается во второй раз.Попробуйте и дайте нам знать.

Все это можно сделать на Java, но при работе с собственными процессами необходимо учитывать некоторые предостережения.

Команда waitFor() может не делать то, на что вы надеетесь:Если у запущенного вами процесса есть дочерний процесс, который выполняет необходимую вам работу, то функция waitFor(), которая возвращается после завершения родительского процесса, не предоставила достаточно времени для завершения дочернего процесса.

Один из способов обойти это - выполнить циклический тест, чтобы убедиться, что начатые вами собственные процессы завершились к вашему удовлетворению - в этом случае, возможно, проверка существования какого-либо файла java.io.File.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top