You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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

火山引擎 最新活动