我有一个管道,我需要从中读取数据。但是,正如我在阅读之前所理解的,我必须创建一些大小的缓冲区。问题是如何定义缓冲区的大小以从管道中读取all
数据?
这是我的代码:
RandomAccessFile aFile = new RandomAccessFile(PIPE_FILE, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(4);//temp 4
while(true){
System.out.println("Size:"+inChannel.size());//returns 0
int bytesRead = inChannel.read(buf);
byte [] bytes=buf.array();
...
buf.clear();
}
答案 0 :(得分:3)
与文件不同,管道没有固定大小:我们知道,管道另一端的编写器可以将通过算法创建的数据推送给您,因此管道流可能是无限的。
你需要创建一个大小的缓冲区,通常是几百到几千字节,在循环中从管道中读取,并且要么像你一样处理数据流,要么将它保存在循环中动态分配的缓冲区中
答案 1 :(得分:1)
我暂时不能发表评论,所以我会根据我的理解回答:
我将重点关注这是一个RandomAccessFile。
正如另一个答案中所建议的那样,无论缓冲区的大小如何,您都可以循环读取它,直到最后:
while(inChannel.read(buf) >= 0)
{
}
除此之外,为了准确回答您的初始问题,即使您的文件/管道很可能会继续增长,但在给定时间它有一个大小,因此您可以将其用于缓冲区,但如果文件夹在中间文件中被修改然后这可能导致不完整的读取甚至错误(例如,如果管道将被清除或类似的东西):
ByteBuffer buf = ByteBuffer.allocate(inChannel.size());