2009-07-08 7 views
1

현재 드라이브를 마운트하고 tar.gz 파일을 추출하는 웹 응용 프로그램을 Java로 작성하고 있습니다. 응용 프로그램은 리눅스 환경에서 실행되기 때문에 "mount"및 "tar"와 같은 유닉스 명령을 사용하려고합니다.Java에서 파일 마운트 및 untar 화

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(); 

터미널에서 mount 명령과 extract 명령을 실행해도 문제가 없지만 FIRST를 java에서 실행할 때 실패합니다. 두 번째 proc.waitFor()는 종료 코드 2를 반환합니다. 그러나 첫 번째 실패한 시도 후에이 코드를 실행하면 정상적으로 작동합니다. 문제는 마운트 명령이 완전히 완료 될 때까지 waitFor()가 기다리지 않는다는 느낌입니다. 내 코드에서 중요한 것이 빠졌습니까?

또한 Java에서는이 모든 작업을 수행하지만 파일을 압축 해제하는 방법을 파악하는 데는 어려움이 있으므로이 방법을 사용하고 있습니다. (오, 누구든지이 일을하는 방법을 말해 준다면 나는 아주 행복 할거야.) 어떤 제안이라도 muuuuuuuuuuu는 인정 될 것이다!

답변

2

진행 중입니다. 혹시 궁금한 점이 있다면, 자바에서 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(); 
} 
0

Ant 코드베이스의 org.apache.tools.tar 패키지를 살펴보십시오. 이 패키지에는 tar 아카이브를 읽는 데 사용할 수있는 클래스 인 TarInputStream이 있습니다.

+0

그래, 어떻게 가야할 것 같아서, 나는 그것을 사용했을 때 추출 된 파일에 마지막으로 수정 한 날짜를 보존하는 방법을 알아낼 수 없었다. – Matthew

0

메서드 호출과 관련이있을 수 있습니다.

는도 관련이 경우 당신이 두 번째로 실행 언급하기 때문에이 answer

는 기본적으로, 나는 확실하지 않다

.exec(String [] command); 

대신

.exec(String command); 

의를 사용해보십시오 참조하십시오. 시도해보고 알려주십시오.

+0

입력 해 주셔서 감사합니다. 그러나 이것이 작동하지 않는 것 같습니다. 내가 읽은 것에서 이것은 각 프로세스가 끝나기를 기다리지 않고 하나의 exec를 호출합니다. – Matthew

+0

:(너무 슬프다.) 실제로, 인자를 정확히 분리하는 것은 실제로 할 수 없다. 그래서 "command parameter option option"은 4 부분 (command, parameter, option, option)으로 변형된다. 잘못된 순서로 "명령 매개 변수" "옵션 옵션"을 4 대신 2 개의 문자열을 사용하여 보냅니다. – OscarRyz

0

이 모든 작업은 Java로 수행 할 수 있지만 네이티브 프로세스를 처리 할 때는주의해야합니다.

waitFor() 명령은 원하는 작업을 수행하지 않을 수 있습니다. 시작한 프로세스에 실제 작업을 수행하는 자식 프로세스가있는 경우 부모 프로세스가 완료되면 반환되는 waitFor()가 필요하지 않습니다. 자식 프로세스가 끝날 수있는 충분한 시간을 허용했습니다.

이 문제를 해결하는 방법 중 하나는 몇 가지 테스트를 반복하여 시작한 네이티브 프로세스가 만족 스럽습니다.이 경우 java.io.File이 있는지 확인하는 것입니다. 외부 명령에 대한 종속성이 존재하기 때문에

+0

아, 그 의미가 있습니다.이 파일 트릭을 사용하면 효과가 있지만 너무 해킹 된 것 같습니다. – Matthew

3

빠른 응답

, 이런 식으로 단순화 :

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

이름이 mount-extract.sh 다음 하나의 Runtime.exec() 전화를 사용하여 호출합니다.

세미 통합 대답

를 사용하여 자바 API는.http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/GZIPInputStream.html

  • http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/api/org/apache/tools/tar/TarInputStream.html
    • 당신은 마운트 명령을 실행 Runtime.exec가 필요합니다.

      기대

      자바는 크로스 플랫폼 소프트웨어 개발 도구이기 때문에, 기본 운영 체제에 따라 동적으로 파생되는 응용 프로그램에서 mount 명령을 추상화 고려한다.

      참조 : How can I mount a windows drive in Java?

      참조 : http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties() 물론

      , 민첩한 개발이 필요할 때까지이 작업을 수행 할 수 없습니다 주장한다. 그때까지 (유닉스 기반의 시스템을 제외하고는 결코 응용 프로그램을 실행할 수 없을 것입니다.

    +0

    많은 도움을 주셔서 감사합니다. 첫 번째 빠른 방법을 시도했지만 같은 문제로 인해 실패했습니다 .bash 스크립트는 마운트가 끝날 때까지 기다리지 않았습니다. tar 명령을 실행하고 프로그램이 폭발했다. 자바로 압축을 풀 때 두 번째 시도를 할 것이다. 실제로 tar 라이브러리를 사용하여 실제로 시도했지만 압축을 푼 파일에서 마지막으로 수정 한 날짜를 보존하는 방법을 알지 못했다. o 나는 포기했다. 거기에는 쉽게 할 수있는 방법이 있습니다. 꽤 유망한 SMB 라이브러리 (jcifs.samba.org)도 있습니다. – Matthew

    +0

    이제 이전에 알지 못했던 것을 알게됩니다. 마운트 명령은 완료되기 전에 종료됩니다. 또 다른 해결책은 파일을 읽을 수있을 때까지 sleep 또는 loop를 사용하는 것입니다 (또는 정해진 반복 횟수가 지나면). –