1

我目前正在开发一个 Web 应用程序,该应用程序涉及安装驱动器和提取 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();

在终端中运行 mount 命令和 extract 命令可以正常工作,但在 FIRST 在 java 中运行时会失败。第二个 proc.waitFor() 返回退出代码 2。但是,在第一次尝试失败后运行此代码可以正常工作。我有一种感觉,问题在于 waitFor() 没有等到 mount 命令完全完成。我在我的代码中遗漏了什么重要的东西吗?

另外,我宁愿在 Java 中完成这一切,但我很难弄清楚如何解压文件,所以我采用了这种方法。(哦,如果有人能告诉我该怎么做,我会很高兴)。任何建议将不胜感激!

4

5 回答 5

4

Making progress. In case anyone was wondering, here is how I am extracting a tar.gz file in Java. Put together from a few online tutorials.

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();
}
于 2009-07-09T17:35:43.477 回答
3

快速回答

由于存在对外部命令的依赖,因此将其简化如下:

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

命名它,mount-extract.sh然后使用单个Runtime.exec()调用调用它。

半综合答案

使用 Java API。

You will need Runtime.exec to execute the mount command.

Forward Looking

Since Java is a cross-platform software development tool, consider abstracting the mount command in your application to be derived dynamically based on the underlying operating system.

See: How can I mount a windows drive in Java?

See: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

Of course, Agile development would insist that this not be done until it is needed. So keep it in the back of your mind until then (as you might never run the application on anything but Unix-based systems).

于 2009-07-08T23:39:38.253 回答
0

看看 Ant 代码库中的org.apache.tools.tar包。该包中有一个类TarInputStream,可用于读取 tar 档案。

于 2009-07-08T23:31:32.760 回答
0

这可能与您调用方法的方式有关。

看到这个答案

基本上尝试使用

.exec( String [] command );

代替

.exec( String command );

我不确定它是否相关,因为您提到它第二次运行。试一试,让我们知道。

于 2009-07-08T23:31:46.973 回答
0

这一切都可以在 Java 中完成,但是在处理本机进程时必须注意一些警告。

waitFor() 命令可能没有做您希望的事情:如果您启动的进程有一个子进程来执行您需要的实际工作,那么当父进程完成时返回的 waitFor() 没有允许足够的时间子进程完成。

解决此问题的一种方法是循环执行一些测试,以查看您启动的本机进程是否已令您满意——在这种情况下,可能会检查某些 java.io.File 是否存在。

于 2009-07-08T23:37:19.270 回答