如何解决尝试使用带字节缓冲区的Apache Common exec将输出从一个命令推送到Java中的另一个命令
我的计划是将ByteBuffer
与 Apache Common Exec 一起使用,以将一个命令的输出作为输入发送到另一命令。
我可以使用PipedOutputStream
和PipedInputStream
进行此操作,下面的代码可以正常工作。
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
)。
在这种情况下,我使用的是自定义类PipedInputStream
和ByteBufferBackedOutputStream
,我从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 举报,一经查实,本站将立刻删除。