安装和拆卸&x27;用Java编写文件

安装和拆卸&x27;用Java编写文件,java,process,runtime,tar,mount,Java,Process,Runtime,Tar,Mount,我目前正在开发一个web应用程序,它包括安装一个驱动器和提取一个tar.gz文件,所有这些都是用Java编写的。由于应用程序在linux环境中运行,我想我应该尝试使用unix命令,如“mount”和“tar” 在终端中运行mount命令和extract命令可以正常工作,但在java中首次运行时失败。第二个proc.waitFor()返回退出代码2。但是,在第一次尝试失败后运行此代码可以正常工作。我觉得问题在于waitFor()不会等到mount命令完全完成。我的代码中是否遗漏了重要的内容 另外,

我目前正在开发一个web应用程序,它包括安装一个驱动器和提取一个tar.gz文件,所有这些都是用Java编写的。由于应用程序在linux环境中运行,我想我应该尝试使用unix命令,如“mount”和“tar”

在终端中运行mount命令和extract命令可以正常工作,但在java中首次运行时失败。第二个proc.waitFor()返回退出代码2。但是,在第一次尝试失败后运行此代码可以正常工作。我觉得问题在于waitFor()不会等到mount命令完全完成。我的代码中是否遗漏了重要的内容


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

看看Ant代码库中的包。该包中有一个类,可用于读取tar存档。

查看Ant代码库中的包。该包中有一个类,可用于读取tar存档。

它可能与调用该方法的方式有关

看到这个了吗

基本上尝试使用

.exec( String [] command );
而不是

.exec( String command );

我不确定它是否相关,因为你第二次提到它。试试看,让我们知道

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

看到这个了吗

基本上尝试使用

.exec( String [] command );
而不是

.exec( String command );

我不确定它是否相关,因为你第二次提到它。试试看,让我们知道

这一切都可以在Java中完成,但在处理本机进程时,必须注意注意注意事项

waitFor()命令可能没有达到您希望的效果:如果您启动的进程有一个子进程完成您需要的实际工作,那么当父进程完成时返回的waitFor()没有足够的时间让子进程完成


解决这一问题的一种方法是循环一些测试,以查看您启动的本机进程是否已圆满完成—在本例中,可能会检查是否存在一些java.io.File。

这些都可以在java中完成,但在处理本机进程时,您必须注意一些注意事项

waitFor()命令可能没有达到您希望的效果:如果您启动的进程有一个子进程完成您需要的实际工作,那么当父进程完成时返回的waitFor()没有足够的时间让子进程完成


解决这个问题的一种方法是循环一些测试,以查看您启动的本机进程是否已经完成并达到您满意的程度——在本例中,可能是检查是否存在一些java.io.File。

快速回答

由于存在对外部命令的依赖关系,请将其简化为:

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...
将其命名为
mount extract.sh
,然后使用单个
Runtime.exec()调用它

半综合答案

使用JavaAPI

您需要
Runtime.exec
来执行mount命令

前瞻性

由于java是跨平台的软件开发工具,所以考虑将应用程序中的安装命令抽象化,以便基于底层操作系统动态地导出。 见:

见:


当然,敏捷开发会坚持直到需要时才这样做。因此,在此之前,请将其牢记在心(因为您可能永远不会在基于Unix的系统上运行应用程序)。

快速回答

由于存在对外部命令的依赖关系,请将其简化为:

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...
将其命名为
mount extract.sh
,然后使用单个
Runtime.exec()调用它

半综合答案

使用JavaAPI

您需要
Runtime.exec
来执行mount命令

前瞻性

由于java是跨平台的软件开发工具,所以考虑将应用程序中的安装命令抽象化,以便基于底层操作系统动态地导出。 见:

见:


当然,敏捷开发会坚持直到需要时才这样做。因此,在此之前,请记住这一点(因为除了基于Unix的系统之外,您可能永远不会在任何系统上运行应用程序)。

正在取得进展。如果有人想知道,下面是我如何用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();
}

正在取得进展。如果有人想知道,下面是我如何用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();
}

谢谢你的意见,但这似乎不起作用。从我所读到的内容来看,它只是一个接一个地调用一个exec,而不等待每个进程完成。:(太遗憾了。它实际上做的不是准确地分离参数。因此,“命令参数选项”被转换为4个部分(命令、参数、选项、选项)就是这样。有时传递参数的顺序不正确,它使用两个字符串而不是4来发送“命令参数”“选项选项”。感谢您的输入,但这似乎不起作用。据我所知,这只是一个接一个地调用exec,而不必等待每个进程完成(太可悲了。它实际上做的是准确地分离参数。因此,“命令参数选项”被转换为4个部分(命令、参数、选项、选项),仅此而已。有时传递参数的顺序不正确,它发送“命令参数”“选项”使用两个字符串而不是4。非常有用,非常感谢。我刚刚尝试了第一个快速方法,但由于同样的问题失败了。bash脚本没有等到