首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ProcessBuilder BufferedReader read()阻塞

ProcessBuilder是Java中的一个类,用于创建操作系统进程并执行外部命令。它提供了一种创建和管理进程的方式,可以执行外部程序并与其进行交互。

BufferedReader是Java中的一个类,用于读取字符流。它提供了一种高效的方式来读取字符数据,并且可以使用缓冲区来提高读取性能。

read()是BufferedReader类中的一个方法,用于从输入流中读取一个字符。它会阻塞当前线程,直到有字符可读或者达到流的末尾。

在使用ProcessBuilder和BufferedReader的组合时,通常会使用ProcessBuilder创建一个外部进程,并通过其获取输入流,然后使用BufferedReader来读取该输入流的内容。

这种组合常用于执行外部命令并获取其输出结果。通过阻塞式的read()方法,可以等待外部进程的输出,并在有数据可读时进行读取。

以下是一个示例代码,演示了如何使用ProcessBuilder和BufferedReader来执行外部命令并读取其输出:

代码语言:txt
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        try {
            // 创建ProcessBuilder对象,并指定要执行的命令
            ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");

            // 启动外部进程
            Process process = processBuilder.start();

            // 获取进程的输入流
            InputStream inputStream = process.getInputStream();

            // 创建BufferedReader对象,用于读取输入流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            // 读取输入流的内容
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }

            // 关闭输入流和进程
            bufferedReader.close();
            process.destroy();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们创建了一个ProcessBuilder对象,并指定要执行的命令为"ls -l",即列出当前目录下的文件和文件夹的详细信息。然后,我们通过start()方法启动外部进程,并获取其输入流。接着,我们创建了一个BufferedReader对象,并使用readLine()方法逐行读取输入流的内容,并将其打印输出。最后,我们关闭了输入流和进程。

这种方式可以用于执行各种外部命令,并获取其输出结果。在实际应用中,可以根据具体需求进行适当的处理和扩展。

腾讯云提供了一系列与云计算相关的产品和服务,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和使用场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java学习笔记 调用外部程序

byte[] bytes = new byte[process.getInputStream().available()]; process.getInputStream().read(bytes);...System.out.println(new String(bytes)); 进程的阻塞 如果你实际执行上面的代码的话,很可能抛出IllegalThreadStateException。...因此,为了安全的等待进程结束,我们需要调用waitFor()方法,阻塞当前线程,直到进程退出为止。 所以最后的代码类似这样。在进程启动之后,我们需要阻塞,直到它结束。然后获取返回值和输出结果。...所以输出流的代码也需要修改,我们将它包装到BufferedReader中,BufferedReader有一个接受字符集参数的构造方法。...而且BufferedReader在Java 8中还新增了一个lines()方法,返回所有输入行的stream,我们可以利用Java 8的流类库和lambda表达式方便的处理。

1.8K70
  • Process类详解

    一个进程如果试图从一个空的输入流中读取输入,则会一直阻塞,直到为其提供输入。因此,在调用这样的进程时,必须为其提供输入。 一个外部进程的输出可能会耗尽该进程输出流与错误流的缓冲区。...当发生这种情况时,Java 程序可能会阻塞外部进程,同时阻碍Java程序与外部程序的继续运行。因此,在运行一个外部进程时,如果此进程往其输出流发送任何数据,则必须将其输出流清空。...streams 原因 有些本机平台仅针对标准输入和输出流提供有限的=缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败(如不断发送数据),而主进程调用Process.waitfor后已挂起,则可能导致子进程阻塞...(boolean redirectErrorStream)方法即可清空流 ProcessBuilder builder = new ProcessBuilder(cmds); builder.redirectErrorStream...他会生成一个新的进程去运行调用的程序,waitFor()方法也有很明显的弊端,因为java程序给进程的输出流分配的缓冲区是很小的,有时候当进程输出信息很大的时候回导致缓冲区被填满,如果不及时处理程序会阻塞

    1.6K20

    Java:记录一次 Process调用系统命令,waitFor()阻塞不返回问题及解决方案

    以运行 ps 命令为例: ProcessBuilder processBuilder = new ProcessBuilder("ps"); processBuilder.redirectErrorStream...(true); Process process = processBuilder.start(); processBuilder.start() 会立刻返回,不会待ps进程结束。...所以Process提供waitFor方法,调用后线程阻塞,直到ps命令结束。但有一个问题,当命令的输出很多内容时,waitFor方法会一直卡着不返回。这个问题的原因是打开的进程的输出内容没有被读取。...缓冲区满被阻塞了。剩余内容输出被阻塞了,所以一直卡在那里。 二、解决方法 解决方法比较简单就是:输出内容一定要被读出来。...try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {

    61910

    socket_read阻塞的问题!

    ,没有按照PHP的思维习惯,在莫名其妙的请款下就停止了【阻塞】,阻塞的本质是在底层操作系统、网络接口等用c语言封装后暴露出来的一个PHP函数(看c的socket总结出来的) 2、socket_accept...、socket_read、socket_recv默认都会阻塞,但也可以用socket_set_nonblock()、socket_set_block()设置 3、PHP不关心buffer缓存,在这:...研究开始 两者注释一个*/ // socket_set_nonblock($socket_accept); // while(($buf_read_data = socket_read...== false){//PHP_NORMAL_READ 不够length就阻塞,PHP_BINARY_READ不会 // var_dump($buf_read_data."...、socket_recv、socket_accept三个默认都是阻塞的,不阻塞就是:不会'卡死'在这些函数上 //不开启不能反向写入数据:报错:Warning: socket_recv(): unable

    2.1K20
    领券