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

从java程序调用unix shell?从java程序中读取和写入来自unix管道的稳定数据流

从Java程序调用Unix shell可以使用Java的ProcessBuilder类来实现。ProcessBuilder类提供了创建和管理外部进程的方法。以下是一个示例代码:

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

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

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

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

            // 读取命令执行结果
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完成
            int exitCode = process.waitFor();
            System.out.println("Exit Code: " + exitCode);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上述代码中,我们创建了一个ProcessBuilder对象,并指定要执行的命令为"ls -l",即列出当前目录下的文件和文件夹的详细信息。然后通过调用start()方法启动外部进程,并获取进程的输入流。通过读取输入流,我们可以获取命令执行的结果。

需要注意的是,从Java程序调用Unix shell可能存在安全风险,因为外部命令的执行可能受到用户输入的影响。因此,在实际应用中,应该谨慎处理用户输入,避免命令注入等安全问题。

关于从Java程序中读取和写入来自Unix管道的稳定数据流,可以使用Java的PipedInputStream和PipedOutputStream类来实现。PipedInputStream和PipedOutputStream提供了管道通信的功能,可以在不同的线程之间传递数据。

以下是一个示例代码:

代码语言:java
复制
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class UnixPipeExample {
    public static void main(String[] args) {
        try {
            // 创建PipedInputStream和PipedOutputStream对象
            PipedInputStream inputStream = new PipedInputStream();
            PipedOutputStream outputStream = new PipedOutputStream();

            // 将输入流和输出流连接起来
            inputStream.connect(outputStream);

            // 创建写入数据的线程
            Thread writerThread = new Thread(() -> {
                try {
                    outputStream.write("Hello, Unix pipe!".getBytes());
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            // 创建读取数据的线程
            Thread readerThread = new Thread(() -> {
                try {
                    int data;
                    while ((data = inputStream.read()) != -1) {
                        System.out.print((char) data);
                    }
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            // 启动线程
            writerThread.start();
            readerThread.start();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码中,我们创建了一个PipedInputStream和一个PipedOutputStream对象,并通过调用connect()方法将它们连接起来。然后,我们创建了一个写入数据的线程和一个读取数据的线程。在写入线程中,我们通过PipedOutputStream向管道写入数据;在读取线程中,我们通过PipedInputStream从管道读取数据。

需要注意的是,PipedInputStream和PipedOutputStream是在不同的线程中使用的,因此需要注意线程同步的问题,以避免数据竞争和死锁等问题的发生。

以上是关于从Java程序调用Unix shell和从Java程序中读取和写入来自Unix管道的稳定数据流的解答。希望对您有帮助!

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

相关·内容

MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容 --- 操作系统接口

当用户程序调用系统调用时,硬件会提升权限级别,并开始执行内核预先安排好函数。 内核提供系统调用集合是用户程序看到接口。Xv6内核提供了Unix内核传统上提供服务系统调用子集。...主循环使用getcmd函数用户输入读取一行,然后调用fork创建一个shell进程副本。 父进程调用wait,子进程执行命令。...按照惯例,进程文件描述符0读取(标准输入),将输出写入文件描述符1(标准输出),并将错误消息写入文件描述符2(标准错误)。 正如我们将看到shell利用这个约定来实现I/O重定向管道。...---- 管道 管道是作为一对文件描述符公开给进程小型内核缓冲区,一个用于读取,一个用于写入。将数据写入管道一端使得这些数据可以管道另一端读取管道为进程提供了一种通信方式。...当wc标准输入读取时,就是管道读取。 父进程关闭管道读取端,写入管道,然后关闭写入端。

27520

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

这些系统调用shell使用,体现了它们设计是多么独具匠心。 shell是一个普通程序,它读取用户命令并且执行它们,shell也是传统UnixUnix-like)系统主要用户界面。...当没有更多数据可以读取时,read返回0,表示文件结束了。 系统调用write(fd,buf,n)buf取出n个字节输入写入到文件描述符fd所指文件,并返回写入字节数。...管道 管道是一个小内核缓冲区,它提供了两个文件描述符给两个进程,一个用于读取数据,另一个用于写入数据。管道一端写入数据,可以使这些数据管道另一端被读取管道提供了进程间通信一种方式。...当wc标准输入读取时,它实际上是管道读取数据。父进程管道写端口写入数据,然后关闭了管道文件描述符。...如果管道没有可用数据,管道读取数据系统调用read将一直等待,直到有数据写入管道或者所有与管道写端口关联文件描述符都被关闭。

60060
  • UNPv2第四章:管道FIFO

    filedes[0]为管道读取端 filedes[1]则为管道写入端 若成功则返回零,否则返回-1,错误原因存于errno ?...第一个管道用于客户端向服务器发送路径名,第二个管道用于服务器向客户端发送该文件内容 ?...也就是说,它要么创建一个新FIFO,要么返回一个EEXIST错误 管道FIFO区别如下: 创建并打开一个管道只需要pipe,创建并打开一个FIFO则需要调用mkfifo再调用open 管道在将它打开着进程中最后一个关闭它之后自动消失...,FIFO名字只有通过调用unlink才文件系统删除 FIFO需要额外调用好处是:FIFO在文件系统中有一个名字,该名字允许某个进程创建一个FIFO,与它无亲缘关系另一个进程却打开这个FIFO...(i)如果还有1字节空间,那么内核写入管道或FIFO能容纳数目的数据字节,该数目同时作为来自write返回值  (ii)如果空间已满,那么立即返回EAGAIN 如果写入一个没有打开着用于读管道或者

    50530

    Java基本功】浅析JavaIO流概念用法

    以下是最典型数据源目标媒介: 文件 管道 网络连接 内存缓存 System.in, System.out, System.error(注:Java标准输入、输出、错误输出) 下面这张图描绘了一个程序数据源读取数据...流 在Java IO,流是一个核心概念。流概念上来说是一个连续数据流。你既可以读取数据,也可以往流写数据。流与数据源或者数据流媒介相关联。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同JVM线程通信(不同进程)。在概念上,Java管道不同于Unix/Linux系统管道。...在Unix/Linux,运行在不同地址空间两个进程可以通过管道通信。在Java,通信双方应该是运行在同一进程不同线程。...read()方法write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程同时进行读写,可能会导致线程死锁。 管道替代 除了管道之外,一个JVM不同线程之间还有许多通信方式。

    46420

    Java基础17:Java IO流总结

    以下是最典型数据源目标媒介: 文件 管道 网络连接 内存缓存 System.in, System.out, System.error(注:Java标准输入、输出、错误输出) 下面这张图描绘了一个程序数据源读取数据...流概念上来说是一个连续数据流。你既可以读取数据,也可以往流写数据。流与数据源或者数据流媒介相关联。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同JVM线程通信(不同进程)。在概念上,Java管道不同于Unix/Linux系统管道。...在Unix/Linux,运行在不同地址空间两个进程可以通过管道通信。在Java,通信双方应该是运行在同一进程不同线程。...read()方法write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程同时进行读写,可能会导致线程死锁。 管道替代 除了管道之外,一个JVM不同线程之间还有许多通信方式。

    99800

    linux c程序获取shell脚本输出

    比如实现一个ping程序来测试网络连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统ping命令呢?通常在程序通过 system函数来调用shell命令。...使用匿名管道   在>一书中给出了一种通过匿名管道方式将程序结果输出到分页程序例子,因此想到,我们也可以通过管道来将外部命令结果同应用程序连接起来。...方法就是fork一个子进程,并创建一个匿名管道,在子进程执行shell命令,并将其标准输出dup 到匿名管道输入端,父进程管道读取,即可获得shell命令输出,代码如下:   /**   *...小结   有统计数据表明,代码缺陷率是一定,与所使用语言无关。Linux提供了很多实用工具脚本,在程序调用工具脚本,无疑可以简化程序,从而降低代码缺陷数目。...Linux shell脚本也是一个强大工具,我们可以根据需要编制脚本,然后在程序调用自定义脚本。

    5.6K20

    夯实Java基础系列16:一文读懂Java IO流常见面试题

    概念上来说是一个连续数据流。你既可以读取数据,也可以往流写数据。流与数据源或者数据流媒介相关联。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同JVM线程通信(不同进程)。在概念上,Java管道不同于Unix/Linux系统管道。...在Unix/Linux,运行在不同地址空间两个进程可以通过管道通信。在Java,通信双方应该是运行在同一进程不同线程。...read()方法write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程同时进行读写,可能会导致线程死锁。 管道替代 除了管道之外,一个JVM不同线程之间还有许多通信方式。...比如文件拷贝,输入流输出流都包括了。输入流文件读取数据存储到进程(process),输出流进程读取数据然后写入到目标文件。 字节流字符流区别。

    52410

    夯实Java基础系列16:一文读懂Java IO流常见面试题

    概念上来说是一个连续数据流。你既可以读取数据,也可以往流写数据。流与数据源或者数据流媒介相关联。...所以管道也可以作为数据源以及目标媒介。 你不能利用管道与不同JVM线程通信(不同进程)。在概念上,Java管道不同于Unix/Linux系统管道。...在Unix/Linux,运行在不同地址空间两个进程可以通过管道通信。在Java,通信双方应该是运行在同一进程不同线程。...read()方法write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程同时进行读写,可能会导致线程死锁。 管道替代 除了管道之外,一个JVM不同线程之间还有许多通信方式。...比如文件拷贝,输入流输出流都包括了。输入流文件读取数据存储到进程(process),输出流进程读取数据然后写入到目标文件。 字节流字符流区别。

    1.4K21

    进程间通信历史与未来

    5 种进程间通信方式 管 道 SysV IPC TCP 套接字 UDP 套接字 UNIX 套接字 管道   所谓管道,就是能够从一侧输入,然后另一侧读取文件描述符对。...Shell 管道也是通过这一方式实现。   文件描述符在每个进程是独立存在,但创建子进程时会继承父进程中所有的文件描述符,因此它可以用于在具有父子、兄弟关系进程之间进行通信。   ...下面我们将读取一方文件描述符称为 r,将写入一侧文件描述符称为 w。 通过 fork 系统调用创建子进程。 在父进程一方将描述符 w 关闭。 在子进程一方将描述符 r 关闭。...在子进程一方将要发送给父进程数据写入描述符 w。 在父进程一方描述符 r 读取数据。 笔者直接上代码演示: #!...所谓数据流通信,是指发送数据是作为字节流来处理通常输入输出一样,不会保存写入数据长度信息。   看了上面的内容,大家可能觉得这些都是理所当然

    1.2K140

    Linux文件类型

    二.详解 管道文件 管道分为匿名管道命名管道管道都是一端写入、另一端读取,它们是单方向数据传输,它们数据都是直接在内存传输管道是进程间通信一种方式,例如父进程写,子进程读。...在shell,可以使用mknod命令或mkfifo命令创建命名管道,在写某些特殊需求shell脚本时,命名管道非常有用。...进程1向A写入数据,将自动推送到B上,进程2可从B上读取A写入数据,同理进程2向B写入数据将自动推送到A上,进程1可从A上读取B写入数据。...进程1向自己套接字send buffer写入数据,将发送到对端recv buffer,然后对端进程2就可以recv buffer读取数据,反之亦然。...最后等待用户空间进程发起accept()系统调用让内核将其accept queue移除。被accept()后连接表示已经建立好连接,可以真正实现两端进程间数据传输。

    3K10

    DDIA:Unix 蕴含批处理哲学

    这意味着,我们之前例子对日志处理 Unix 命令行能够轻松应对大数据集,而不会耗尽内存(OOM)。不过,性能瓶颈会转移到磁盘读取输入文件 IO 上。...管道类比到今天仍然存在,并且成了 Unix 哲学一部分。Unix 哲学是一组在 Unix 用户开发者很流行设计原则,在 1978 年被表述为: 每一个程序专注干一件小事。...管道(pipe)能让你将一个程序标准输出(即编码实现该程序时,程序视角 stdout)冲定向到另外一个程序标准输入(仅需要一个比较小缓冲区足矣,并不需要将所有的中间数据流写入磁盘)。...这种设定,让 shell 用户可以按任意方式对多个程序输入输出进行组织(也即接线,wire up);每个程序既不需要关心输入来自何处,也不需要知道输出去往何方(我们有时也将这种设计称为松耦合,延迟绑定或者控制反转...只要你工具是标准输入读取数据,并将处理结果写入标准输出,就能作为一环嵌入到 Unix 数据处理流水线

    20610

    python 标准类库-并行执行之subprocess-子进程管理

    因为不是当前进程读取管道(pipe),如果子进程没有生成足够输出来填充OS管道缓冲区,可能会阻塞子进程。...因为不是当前进程读取管道(pipe),如果子进程没有生成足够输出来填充OS管道缓冲区,可能会阻塞子进程。...因为不是当前进程读取管道(pipe),如果子进程没有生成足够输出来填充OS管道缓冲区,可能会阻塞子进程。...类似在Unix上使用os.execvp(),Windows上使用CreateProcess()函数。 args 参数值为字符串、序列。默认,如果args是个序列,程序会执行args第一项。...stdin, stdout stderr 分别指定被执行程序标准输入,标准输出,标准错误文件句柄。

    4.2K20

    数据处理大一统—— Shell 脚本到 SQL 引擎

    Unix 管道 Unix 管道是一项非常伟大发明,体现了 Unix 一贯哲学: 程序应该只关注一个目标,并尽可能把它做好。让程序能够互相协同工作。...— Unix Pipe 机制发明者 Malcolm Douglas McIlroy 上述三句话哲学正体现了我们提到两点,标准化数据集合——来自标准输入输出文本数据流,可组合数据变换——能够协同工作程序...(如像 sort, head, tail 这种 Unix 自带工具,用户自己编写符合管道要求程序)。...让我们来看一个使用 Unix tools 管道来解决实际问题例子。...使用 Unix Shell ,我们会写出类似的命令: cat /var/log/nginx/access.log | # 读取文件,打入标准输出 awk '{print $7}' | # 取出每行按空格分割第七个字段

    19720

    详解操作系统之进程间通信 IPC (InterProcess Communication)

    数据读出写入:一个进程向管道内容被管道另一端进程读出。写入内容每次都添加在管道缓冲区末尾,并且每次都是从缓冲区头部读出数据。...管道局限: 管道主要局限性正体现在它特点上: 只支持单向数据流; 只能用于具有亲缘关系进程之间; 没有名字; 管道缓冲区是有限管道制存在于内存,在管道创建时,为缓冲区分配一个页面大小)...(3)管道消息队列通信数据都是先进先出原则。 (4)消息队列可以实现消息随机查询,消息不一定要以先进先出次序读取,也可以按消息类型读取.比FIFO更有优势。...著名消息传递系统有开放网络运算远程过程调用(ONC RPC)、CORBA、Java RMI、Distributed COM、SOAP。 5....(3)接下来,系统调用listen来创建一个队列并将其用于存放来自客户进入连接。 (4)最后,服务器通过系统调用accept来接受客户连接。

    3.7K30

    如何友好把PythonBash结合在一起

    随着Linux社区对命令行依赖不断增长,UNIX shell(如bashzsh)已发展成为极其强大工具,可以补充UNIX shell经验。...使用bash其他类似的shell,可以使用许多强大功能,例如管道,文件名通配符以及称为脚本文件读取命令功能。 让我们看一个真实示例来演示命令行功能。...编写以UNIX方式运行Python程序(即读入标准输入并写入标准输出)与为现有的shell命令(如catsort)编写Python替代品一样强大。 让我们以本文前面已解决问题为基础。...首先,它从通过sys.stdin对象公开标准输入读取输入。任何输出都将写入sys.stdout对象,这是在Python实现标准输出方式。...在这种情况下使用Python优点如下: 与catsort等工具链接能力。简单实用程序(逐行读取文件并以数字方式对文件进行排序)由久经考验UNIX命令处理。

    99610

    这些操作系统概念,保你没听过!

    点击蓝色“Java建设者”关注我 这是Java建设者第 65 篇原创文章 操作系统概念 大部分操作系统提供了特定基础概念抽象,例如进程、地址空间、文件等,它们是需要理解核心内容。...与进程管理有关最关键系统调用往往是决定着进程创建和终止系统调用。考虑一个典型例子,有一个称为 命令解释器(command interpreter) 或 shell 进程终端上读取命令。...对于大部分在应用程序操作系统之间交互主要是应用程序抽象,例如创建、写入读取删除文件。计算机资源管理对用户来说基本上是透明。因此,用户程序操作系统之间接口主要是处理抽象。...在多数情况下, 在 fork 之后,子进程需要执行父进程不一样代码。终端读取命令,创建一个子进程,等待子进程执行命令,当子进程结束后再读取下一个输入指令。...然后是6个文件操作,在功能上 UNIX 调用类似,然而在参数细节上是不同 UNIX 中一样,文件可以打开,读取写入,关闭。

    35810

    时间序列数据MongoDB:第三部分 - 查询,分析呈现时间序列数据

    几乎所有主要编程语言都有驱动程序,包括C#,Java,NodeJS,Go,R,Python,Ruby等等。...这是通过使用执行特定阶段操作来完成,例如分组,匹配,排序或加工数据。流经阶段数据及其相应处理称为聚合管道概念上讲,它类似于通过Unix shell命令行管道数据流。...图1:通过聚合管道示例数据流 $match是第一阶段在这两个阶段管道。 $match将整个订单集合作为输入,并提供一个过滤器,其中包含文档列表,其中“status”包含“A”值。...一个有用功能是通过将数据处理阶段组装到画布上,然后将生成管道导出为用于复制粘贴到应用程序代码,从而可视化地构建聚合管道。...在每个行业每个公司,都需要查询,分析报告时间序列数据。实际业务价值来自从数据获得分析见解。 MongoDB使您可以收集,分析处理环境每个时间序列数据。

    4.3K20

    进程间通信 IPC 完全指南:各种机制原理与实战

    管道(Pipe)可能是本地使用最广泛 IPC 方法之一。管道(Pipe)实际上是使用一段内核内存实现。系统调用始终创建一个管道两个关联文件说明,用于管道读取写入管道。...两个文件描述符形成了一个单向数据流通道。数据传输:写操作:进程可以通过写文件描述符将数据写入管道。数据会被存储在管道缓冲区,直到被读取。...; write(pipefd[1], message, strlen(message));读操作:另一个进程可以通过读取文件描述符管道读取数据。读取操作会从缓冲区中提取数据,并将其返回给调用进程。...例如,父进程创建管道,并在fork()之后将管道读写文件描述符分别传递给子进程父进程。子进程可以将数据写入管道,父进程则从管道读取数据。...操作系统将多个进程地址空间中内存段映射到该内存段读取写入,而无需调用操作系统函数。对于交换大量数据应用程序,共享内存远远优于消息队列技术,因为IPC消息队列需要对每次数据交换进行系统调用

    1.2K20

    时间序列数据MongoDB:第b三部分 - 查询,分析呈现时间序列数据

    几乎所有主要编程语言都有驱动程序,包括C#,Java,NodeJS,Go,R,Python,Ruby等等。...这是通过使用执行特定阶段操作来完成,例如分组,匹配,排序或加工数据。流经阶段数据及其相应处理称为聚合管道概念上讲,它类似于通过Unix shell命令行管道数据流。...图1:通过聚合管道示例数据流 $match是第一阶段在这两个阶段管道。 $match将整个订单集合作为输入,并提供一个过滤器,其中包含文档列表,其中“status”包含“A”值。...一个有用功能是通过将数据处理阶段组装到画布上,然后将生成管道导出为用于复制粘贴到应用程序代码,从而可视化地构建聚合管道。...在每个行业每个公司,都需要查询,分析报告时间序列数据。实际业务价值来自从数据获得分析见解。 MongoDB使您可以收集,分析处理环境每个时间序列数据。

    3.7K20
    领券