[英]Reading output from Powershell takes much time to execute
所以,我在 java 上寫了這段代碼,它需要大約 6 秒的時間來執行並給出 output。因為我不是來自編碼背景,所以我期待這個專家組的人是否可以幫助我優化這一點。 下面是我的代碼,PowerShell 命令也在幾秒鍾內運行。 只有這個 while 循環需要很多時間。
我想要實現的只是獲取 HDD 驅動器列表並打印出來。
Process p = Runtime.getRuntime().exec("powershell.exe Get-Partition -disknumber 1 | select DriveLetter");
BufferedReader in = new BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line1 = "";
ArrayList<String> hddList = new ArrayList<String>();
while ((line1 = in.readLine()) != null) {
if (!line1.trim().isEmpty()) {
if (line1.contains("HDD")) {
hddList.add(line1.replaceAll(" +", "#").split("#")[0]+"#"+"HDD");
}
}
}
正如我在評論中所說,我認為問題出在powerShell
的執行上,而不是 Java。 使用cmd.exe
查看以下運行速度。 在這里,我所做的只是列出目錄並替換<DIR>
就好像它是 HDD 一樣。
Process p = Runtime.getRuntime().exec(
"cmd.exe /c dir".split("\\s+"));
System.out.println(p);
BufferedReader in = new BufferedReader(
new java.io.InputStreamReader(p.getInputStream()));
String line1 = "";
List<String> hddList = new ArrayList<String>();
while ((line1 = in.readLine()) != null) {
System.out.println(line1);
if (!line1.trim().isEmpty()) {
if (line1.contains("<DIR>")) {
hddList.add(line1.replaceAll(" +", "#").split("#")[0] + "#"
+ "HDD");
}
}
}
System.out.println(hddList);
您可能能夠以管理員身份運行cmd.exe
並使用相關的特權命令來獲取磁盤信息。 我還沒有確定如何在沒有密碼輸入的情況下做到這一點。
這似乎是一個xy 問題,因為您可以輕松地在 Java 中獲取驅動器號,例如
List<String> driveLetters = new ArrayList<>();
for(Path r: FileSystems.getDefault().getRootDirectories()) {
String s = r.toString();
if(s.length() == 3 && s.charAt(1) == ':') {
driveLetters.add(s.substring(0, 1));
}
}
從 Java 7 開始。這不需要進程間通信,因此沒有這樣的延遲問題。
如果你想將結果限制為固定硬盤,你可以使用類似
List<String> driveLetters = new ArrayList<>();
for(Path r: FileSystems.getDefault().getRootDirectories()) {
String s = r.toString();
if(s.length() == 3 && s.charAt(1) == ':') try {
FileStore store = Files.getFileStore(r);
if(!Boolean.TRUE.equals(store.getAttribute("volume:isRemovable"))
&& !Boolean.TRUE.equals(store.getAttribute("volume:isCdrom"))) {
driveLetters.add(s.substring(0, 1));
}
}
catch(IOException ex) {} // no media in drive, obviously not an HDD then
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.