如何将PrintWriter输出流的内容存储为字符串变量?
把CMD命令的输出捕获为字符串变量
我明白你的需求啦——你现在是想把通过PrintWriter发送给CMD的命令输出结果存成字符串,而不是直接打印到控制台对吧?这其实需要你去捕获CMD进程的标准输出流,而不是只往它的输入流写命令。
问题根源
你之前的代码只处理了向CMD进程的输入(用PrintWriter写"vol"命令),但没有读取CMD执行命令后返回的输出内容,所以这些内容直接默认输出到了控制台。
解决方案:捕获进程的输出流
我们可以用ProcessBuilder来创建CMD进程,同时获取它的输入、输出流,然后把输出流的内容读取到字符串变量里。这里还要注意处理错误流,避免进程阻塞。
完整示例代码
package cmd_prompt; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class my_main { public static void main(String[] args) { StringBuilder output = new StringBuilder(); ProcessBuilder processBuilder = new ProcessBuilder("cmd"); // 把错误流合并到标准输出流,这样只需要读取一个流 processBuilder.redirectErrorStream(true); try { Process process = processBuilder.start(); // 向CMD写入命令 PrintWriter stdin = new PrintWriter(new OutputStreamWriter(process.getOutputStream())); stdin.println("vol"); // 必须关闭输入流,告诉CMD命令已经发送完毕 stdin.close(); // 读取CMD的输出内容 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { output.append(line).append(System.lineSeparator()); } // 等待进程执行完毕 int exitCode = process.waitFor(); System.out.println("进程退出码: " + exitCode); // 现在output里就是CMD输出的内容了 String cmdOutput = output.toString(); System.out.println("捕获到的输出内容:"); System.out.println(cmdOutput); // 这里就可以把cmdOutput拿去做后续处理啦 } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
关键细节说明
processBuilder.redirectErrorStream(true):把CMD的错误输出(比如命令错误时的提示)合并到标准输出流,这样我们只需要读取一个流就能拿到所有输出。stdin.close():必须关闭输入流,否则CMD会一直等待输入,进程不会结束,导致程序卡住。process.waitFor():等待CMD进程执行完毕后再读取输出,确保能拿到完整的结果。StringBuilder:用来高效拼接输出的每一行内容,最后转成字符串变量cmdOutput。
这样修改后,你就能把原来打印到控制台的卷信息存到cmdOutput变量里,后续想怎么用都可以啦!
内容的提问来源于stack exchange,提问作者B. Stein




