问题描述
我的计划是将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.
,我就能看到写入磁盘的值。