如何使用;ls*.c";java中的命令?
我正在尝试用java打印“*.C”文件 我使用下面的代码如何使用;ls*.c";java中的命令?,java,linux,command-line,ls,Java,Linux,Command Line,Ls,我正在尝试用java打印“*.C”文件 我使用下面的代码 public static void getFileList(){ try { String lscmd = "ls *.c"; Process p=Runtime.getRuntime().exec(lscmd); p.waitFor(); BufferedReader reader=new BufferedReader(new InputStreamRea
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.");
}
注意:-对于“ls”命令来说,它工作得很好。当我在任何命令中使用“*”时,所有命令都不工作。需要在java中替换命令中的“*”
更新
谢谢你们的帮助
现在我需要java中注释“ls-d1$PWD/**”的相同结果。它将列出所有带有完整路径的目录名
谢谢您的时间。shell扩展了
*
。因此,要使用它将文件名扩展为glob,必须通过shell调用ls
命令,例如:
编辑
@Stephen关于exec未能拆分命令的观点很好。要执行ls-d1$PWD/*
,您可以这样做:
String lscmd = "ls -d1 $PWD/*";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
String lscmd = "ls *.c";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
Java的方法是使用
FilenameFilter
。我改编了以下代码示例:
导入java.io.File;
导入java.io.FilenameFilter;
公共类筛选器实现FilenameFilter{
保护字符串模式;
公共筛选器(字符串str){
模式=str;
}
公共布尔接受(文件目录,字符串名称){
返回name.toLowerCase().endsWith(pattern.toLowerCase());
}
公共静态void main(字符串参数[]){
过滤器nf=新过滤器(“.c”);
//当前目录
文件目录=新文件(“.”);
字符串[]strs=dir.list(nf);
对于(int i=0;i
更新:
对于更新,您可以迭代一个
新文件(“.”.listFiles()编码>并在每个文件上发出file.getAbsolutePath()
。您可能会发现这更可靠:
Path dir = Paths.get("/path/to/directory");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) {
for (Path file : stream) {
// Do stuff with file
}
}
Path dir=Path.get(“/Path/to/directory”);
try(DirectoryStream=Files.newDirectoryStream(dir,“*.c”)){
用于(路径文件:流){
//处理文件
}
}
或者,您可以使用
您需要执行格式为“bash-c'ls*.c'”的命令。。。因为javaexec
方法不理解'*'
扩展(globbing)。(bash-c表单确保使用shell来处理命令行。)
但是,您不能简单地将上面的命令作为单个字符串提供给Runtime.exec(…)
,因为exec
也不了解拆分包含引号的命令字符串的正确方法
因此,要让exec
做正确的事情,您需要执行以下操作:
String lscmd = "ls -d1 $PWD/*";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
String lscmd = "ls *.c";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
换句话说,你需要手工进行参数拆分
应该注意的是,这个示例也可以通过使用FileMatcher
执行“全局绑定”并根据结果组装参数列表来实现。但是,如果您要运行的不是ls
,那么这会很复杂。。。在我看来,这种复杂性是不合理的。一个例子列出了自Java7以来的文件
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();
}
}
}
import java.io.IOException;
导入java.nio.file.DirectoryStream;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
公共班机{
公共静态void main(字符串[]args){
Path dir=Path.get(“/your/Path/”);
试一试{
DirectoryStream ds=Files.newDirectoryStream(dir,*.{c});
用于(路径条目:ds){
系统输出打印项次(输入);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
使用ls
命令执行此操作有什么具体原因吗?是的。。。我需要打印带有完整路径的文件/目录名。所以我尝试了这个例子。@Querier Re:您的更新:不要这样做;不要在你的问题上移动门柱。如果你原来的问题得到了回答,接受这个答案,并尝试使用你所掌握的信息来解决你修改过的问题。在编写整个程序时,不要拖拽回答问题的人。如果您再次陷入困境,请打开一个新问题,询问您已经走了多远。此外,在JavaSE7中,您似乎有一个API可用于全局文件路径:。Globbing就是在shell中扩展路径模式(*
,?
等)。
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();
}
}
}