微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用带字节缓冲区的Apache Common exec将输出从一个命令推送到Java中的另一个命令

如何解决尝试使用带字节缓冲区的Apache Common exec将输出从一个命令推送到Java中的另一个命令

我的计划是将ByteBuffer Apache Common Exec 一起使用,以将一个命令的输出作为输入发送到另一命令。

我可以使用PipedOutputStreamPipedInputStream进行此操作,下面的代码可以正常工作。

public static void testApacheCommons1() throws ExecuteException,IOException {
        PipedOutputStream ifOutputStream = new PipedOutputStream();
        PipedInputStream ifInputStream = new PipedInputStream();
        ifOutputStream.connect(ifInputStream);

        String readCommand = "sudo dd bs=1 count=30 if=" + "/dev/sdb1" + " skip=50k";
        CommandLine cmdLineForRead = CommandLine.parse(readCommand);
        DefaultExecutor executorRead = new DefaultExecutor();
        ExecuteStreamHandler executeReadStreamHandler = new PumpStreamHandler(ifOutputStream);
        executorRead.setStreamHandler(executeReadStreamHandler);
        executorRead.execute(cmdLineForRead,new DefaultExecuteResultHandler());

        String writeCommand = "sudo dd bs=1 of=" + "/dev/sdb2"+ " seek=50k";
        CommandLine cmdLineForWrite = CommandLine.parse(writeCommand);
        DefaultExecutor executorWrite = new DefaultExecutor();
        ExecuteStreamHandler executeWriteStreamHandler = new PumpStreamHandler(System.out,System.err,ifInputStream);
        executorWrite.setStreamHandler(executeWriteStreamHandler);
        executeWriteStreamHandler.start();
        executorWrite.execute(cmdLineForWrite,new DefaultExecuteResultHandler());
    }

上面的代码工作正常,但是我想从第一个命令获取输出,并将其放到ByteBuffer并将其作为下一个命令的输入。

下面是我正在尝试执行的代码,但未按预期工作(我能够看到缓冲区已填充,但未写入磁盘,这在我使用{ {1}}和PipedOutputStream)。

在这种情况下,我使用的是自定义PipedInputStreamByteBufferBackedOutputStream,我从SO的另一篇文章中获得了实现。

ByteBufferBackedInputStream

解决方法

好的,问题是position的{​​{1}}位于最后一个位置,因此在写操作发生时,它找不到在缓冲区中保存的元素。 通过反复试验,遍历我所了解的bytebuffer

的所有功能
buffer.rewind()

所以从磁盘读取后运行了Buffer java.nio.Buffer.rewind() Rewinds this buffer. The position is set to zero and the mark is discarded. ,我就能看到写入磁盘的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。