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