我正尝试在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."); }
PS: – 对于“ls”命令来说工作正常。当我在任何命令中使用“*”时,一切都不起作用。 在java中的命令需要replace“*”。
UPDATE
谢谢你们的帮助
现在我需要在java中评论“ls -d1 $ PWD / **”的结果。 它将用完整path列出所有的目录名称。
谢谢你的时间。
你可能会发现这更可靠:
Path dir = Paths.get("/path/to/directory"); try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) { for (Path file : stream) { // Do stuff with file } }
或者,您可以使用public File[] File.listFiles(FilenameFilter filter)
File[] files = dir.listFiles(new FilemaneFilter() { public boolean accept(File dir, String name) { return name.endsWith(".c"); } }
Java的方法是使用FilenameFilter
。 我从这里调整了一个代码示例:
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()
。
自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(); } } }
你需要执行形式为“bash -c'ls * .c'”的命令,因为java exec
方法不理解'*'
扩展(globbing)。 (“bash -c”形式确保使用shell来处理命令行。)
但是,不能简单地将上面的命令作为单个字符串提供给Runtime.exec(...)
,因为exec
也不理解将正引用的acommand字符串拆分的正确方法。
因此,为了让exec
做正确的事情,你需要做这样的事情:
String lscmd = "ls *.c"; Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
换句话说,你需要手动进行参数分割。
应该注意的是,这个例子也可以通过使用FileMatcher
执行“globbing”并从结果中组装参数列表来实现。 但是,如果你要做的不是运行ls
而是复杂的,而且IMO的复杂性是不合理的。
*
由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});
我知道,它不直接回答你的问题,但如果可以的话,更喜欢操作系统无关的方式列出目录中的文件。
优点是 – 不是Unix / Linux的特定不需要产生这个过程(它非常昂贵)。
在这里你可以找到一个如何在java中执行此操作的示例:
列出目录中的文件
希望这可以帮助