gpt4 book ai didi

java - FSDataInputStream 是否仅限于创建时已经写入的那些字节?

转载 作者:可可西里 更新时间:2023-11-01 14:54:40 25 4
gpt4 key购买 nike

所以我试图了解 HDFS 中的一些行为。我的目标是设置一个配置,在该配置中我将 FSDataOutputStream 打开到某个位置,然后在我写入任何字节之前,我的应用程序的其他部分立即将 FSDataInputStream 打开到同一位置。

我的想法是,当我将字节写入 FSDataOutputStream、刷新它们并调用“sync()”时,任何有权访问相同位置的 FSDataInputStream 的人都应该能够读取这些字节。

可悲的是,它似乎并没有那样工作。当我以这种方式设置我的代码时:

FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
writer.write(new byte[]{1, 1, 1, 1, 1});
writer.flush();
writer.sync();
System.out.println(reader.available()); // writes '0'

但是!当我以这种方式设置我的代码时,会发生这种情况:

FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
writer.write(new byte[] {1, 1, 1, 1, 1});
writer.flush();
writer.sync();
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
System.out.println(reader.available()); // writes '5'

最后,我运行的第三个测试是这样的:

FSDataOutputStream writer = fs.create(new Path("/foo/bar"));
writer.write(new byte[] {1, 1, 1, 1, 1});
writer.flush();
writer.sync();
FSDataInputStream reader = fs.open(new Path("/foo/bar"));
writer.write(new byte[] {2, 2, 2, 2, 2});
writer.flush();
writer.sync();
System.out.println(reader.available()); // writes '5'

我的结论是 FSDataInputStream 的范围总是限制在创建输入流时已经写入的那些字节。有没有办法解决?我在输入流上没有看到“refresh()”方法或类似的东西。

如果有某种方法可以强制输入流更新其可用字节,我会非常非常喜欢它。我错过了什么?我究竟做错了什么?这仅仅是错误的方式来做这样的事情吗?

最佳答案

据我所知,DFSInputStream 仅在打开时以及在尝试从 block 中读取时遇到错误时刷新其定位 block 列表。因此,无论您在输出流中做什么,输入流都不会更新。

如果您正在尝试实现单生产者/多消费者系统,您可能会考虑使用诸如 zookeeper 之类的东西来进行协调。

关于java - FSDataInputStream 是否仅限于创建时已经写入的那些字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16673331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com