【发布时间】:2014-11-20 08:39:11
【问题描述】:
我尝试使用 java 从命令行调用文件列表。它看起来像这样:
try {
p=Runtime.getRuntime().exec("cmd.exe /k dir /b /S /a-d \"C:\\Image");
} catch (IOException e1) {
e1.printStackTrace();
}
BufferedReader reader=new BufferedReader(
new InputStreamReader(p.getInputStream())
);
然后我一行一行地准备好……这行得通。
但我也想获得文件名和文件大小,所以我尝试这样调用:
try {
p=Runtime.getRuntime().exec("cmd.exe for %F in (\"C:\\Image*\") do @echo %~zF %F");
} catch (IOException e1) {
e1.printStackTrace();
}
BufferedReader reader=new BufferedReader(
new InputStreamReader(p.getInputStream())
);
这仅返回两行: Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。版权所有。 这不是文件名和文件大小;)
这是否可以通过从 java 代码中调用 cmd 来获取这些信息(文件大小)?
【问题讨论】:
-
是否有理由这样做,而不是使用 Java 库?您所做的将非常脆弱,并且只能在 Windows 上运行。
-
同时调用第三方程序会使您的系统易受攻击:想象一下
cmd.exe是否是一个被屏蔽的受感染文件 -
Env 只是 windows。我需要使用命令行运行,因为在某些位置我需要列出 5k-10-15k 文件。如果我只使用 java 文件,这是一个性能杀手……我不完全确定,但使用 shell 列出应该快得多并减少 IO 到磁盘。基本上我需要知道文件三个信息:文件名、文件大小和最后修改日期。
-
@user1055201 我不明白为什么它会减少文件 I/O,但无论如何我已经发布了一个答案,解释了我认为错误在哪里,以及如何使用更现代的
Files而不是File。
标签: java file command-line