문제

현재 Java에서 드라이브를 장착하고 Tar.GZ 파일을 추출하는 웹 응용 프로그램을 작업하고 있습니다. 응용 프로그램은 Linux 환경에서 실행되기 때문에 "Mount"및 "Tar"와 같은 Unix 명령을 사용해 보겠다고 생각했습니다.

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 ()는 Exit Code 2를 반환합니다. 그러나 첫 번째 실패한 시도 후이 코드를 실행하면 제대로 작동합니다. 문제는 Waitfor ()가 Mount 명령이 완전히 완료 될 때까지 기다리지 않는다는 것입니다. 내 코드에서 중요한 것을 놓치고 있습니까?

또한,이 모든 것을 Java로하고 싶지만 파일을 사용하지 않는 방법을 알아내는 데 어려움을 겪었 으므로이 접근 방식을 취하고 있습니다. (오, 누군가가 이것을하는 방법을 말해 줄 수 있다면 나는 매우 행복 할 것입니다). 모든 제안은 muuuuuuuuuch를 감사합니다!

도움이 되었습니까?

해결책 2

진전. 누구나 궁금한 점이 있으면 Java에서 Tar.gz 파일을 추출하는 방법이 있습니다. 몇 가지 온라인 자습서에서 구성하십시오.

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() 전화.

반 통합 답변

Java API를 사용하십시오.

필요할 것이예요 Runtime.exec 마운트 명령을 실행합니다.

앞으로의 외모

Java는 크로스 플랫폼 소프트웨어 개발 도구이므로 응용 프로그램에서 Mount 명령을 추상화하여 기본 운영 체제를 기반으로 동적으로 도출됩니다.

보다: Java에서 Windows 드라이브를 어떻게 장착 할 수 있습니까?

보다: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/system.html#getproperties ()

물론, 민첩한 개발은 이것이 필요할 때까지 이루어지지 않아야한다고 주장합니다. 그러므로 그때까지는 마음의 뒤에 보관하십시오 (Unix 기반 시스템 이외의 어떤 것에서 응용 프로그램을 실행할 수 없으므로).

살펴보십시오 org.apache.tools.tar 개미 코드베이스의 패키지. 그 패키지에는 수업이 있습니다. TarinputStream, 그것은 타르 아카이브를 읽는 데 사용될 수 있습니다.

방법을 부르는 방식과 관련이있을 수 있습니다.

이것 좀 봐 대답

기본적으로 사용해보십시오

.exec( String [] command );

대신에

.exec( String command );

두 번째로 실행된다고 언급하기 때문에 관련이 있는지 확실하지 않습니다. 시도해보고 알려주십시오.

이것은 모두 Java에서 이루어질 수 있지만 기본 프로세스를 다룰 때 경고를 알고 있어야합니다.

Waitfor () 명령은 당신이 희망하는 일을하지 않을 수 있습니다. 시작한 프로세스에 필요한 실제 작업을 수행하는 어린이 프로세스가있는 경우, 부모 프로세스가 완료되면 반환되는 Waitfor ()는 충분한 시간을 허용하지 않았습니다. 아동 과정이 끝나는 과정.

이 문제를 해결하는 한 가지 방법은 약간의 테스트를 거치는 것입니다. 시작한 기본 프로세스가 만족도로 완료되었음을 확인하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top