我正在尝试在java中打印“* .C”文件
我使用以下代码
public static void getFileList(){
try
{
String lscmd = "ls *.c";
Process p=Runtime.getRuntime().exec(lscmd);
p.waitFor();
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=reader.readLine();
while(line!=null)
{
System.out.println(line);
line=reader.readLine();
}
}
catch(IOException e1) {
System.out.println("Pblm found1.");
}
catch(InterruptedException e2) {
System.out.println("Pblm found2.");
}
System.out.println("finished.");
}
P.S: - 它对“ls”命令工作正常。当我在任何命令中使用“*”时,一切都不起作用。需要在java中的命令中替换“*”。
更新
感谢您的帮助。
现在我需要在java中注释“ls -d1 $ PWD / **”的相同结果。它将列出具有完整路径的所有目录名称。
感谢您的时间。
答案 0 :(得分:12)
您可能会发现这更可靠:
Path dir = Paths.get("/path/to/directory");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) {
for (Path file : stream) {
// Do stuff with file
}
}
答案 1 :(得分:2)
或者,您可以使用public File[] File.listFiles(FilenameFilter filter)
File[] files = dir.listFiles(new FilemaneFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".c");
}
}
答案 2 :(得分:2)
您需要执行“bash -c'ls * .c'”形式的命令...因为java exec
方法不理解'*'
扩展(globbing)。 (“bash -c”形式确保使用shell来处理命令行。)
但是,您不能简单地将上述命令作为单个String提供给Runtime.exec(...)
,因为exec
也无法理解拆分在其中引用的acommand字符串的正确方法。 / p>
因此,要让exec
做正确的事,你需要做这样的事情:
String lscmd = "ls *.c";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
换句话说,你需要手工分裂参数......
应该注意的是,这个例子也可以通过使用FileMatcher
来执行“globbing”并从结果中组装参数列表来实现。但是如果你要运行ls
以外的其他东西,那就太复杂了...而IMO的复杂性是不合理的。
答案 3 :(得分:1)
*
由shell扩展。因此,要使用它将文件名扩展为glob,您必须通过shell调用ls
命令,例如像这样:
String lscmd = " bash -c 'ls *.c' ";
的 修改 强>
来自@Stephen的好点,关于exec未能拆分命令。要执行ls -d1 $PWD/*
,您可以这样做:
String lscmd = "ls -d1 $PWD/*";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
答案 4 :(得分:1)
Java方法是使用FilenameFilter
。我改编了here的代码示例:
import java.io.File;
import java.io.FilenameFilter;
public class Filter implements FilenameFilter {
protected String pattern;
public Filter (String str) {
pattern = str;
}
public boolean accept (File dir, String name) {
return name.toLowerCase().endsWith(pattern.toLowerCase());
}
public static void main (String args[]) {
Filter nf = new Filter (".c");
// current directory
File dir = new File (".");
String[] strs = dir.list(nf);
for (int i = 0; i < strs.length; i++) {
System.out.println (strs[i]);
}
}
}
<强>更新强>
对于您的更新,您可以迭代new File (".").listFiles();
并在每个文件上发出file.getAbsolutePath()
。
答案 5 :(得分:1)
自Java 7以来列出文件的一个示例。
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
Path dir = Paths.get("/your/path/");
try {
DirectoryStream<Path> ds = Files.newDirectoryStream(dir, "*.{c}");
for (Path entry: ds) {
System.out.println(entry);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}