我正在从文件中读取数字以执行合并排序。合并排序必须作为外部排序执行,因为它是一个很大的数字列表,并且可用的主内存非常少。我有一个工作实现,它使用BufferedOutputStream加速输出,我想对输入流做同样的事情。但是,必须从两个不同的位置读取输入才能执行合并。
基本上,如果我有:
RandomAccessFile File = new RandomAccessFile("File.dat", "rw");
BufferedInputStream Buffer = new BufferedInputStream(
new FileInputStream(File.getFD()));
DataInputStream InputStream = new DataInputStream(Buffer);
我使用InputStream.readInt()
读取了一些整数,但是也希望使用File.seek(n)
来访问文件的其他部分,我怎么知道下次调用File以获取更多数据的时间,从而寻求在被要求提供更多数据之前回来。或者,对于相同的底层文件,是否可以有两个RandomAccessFiles?
答案 0 :(得分:0)
对于其他需要做同样事情的人来说,这是一个使用两个不同的bufferedInputStreams和RandomAccessFiles从流中读取的例子:
RandomAccessFile FileA = new RandomAccessFile("File.dat", "rw");
System.out.println("Writing 100");
for (int i = 0; i < 100; i++) {
FileA.writeInt(i);
}
FileA = new RandomAccessFile("File.dat", "r");
RandomAccessFile FileB = new RandomAccessFile("File.dat", "r");
FileA.seek(0);
DataInputStream InputStreamA = new DataInputStream(new BufferedInputStream(
new FileInputStream(FileA.getFD())));
FileB.seek(0);
DataInputStream InputStreamB = new DataInputStream(new BufferedInputStream(
new FileInputStream(FileB.getFD())));
System.out.println("Read A");
for (int i = 0; i < 10; i++) {
System.out.println(InputStreamA.readInt());
}
System.out.println("Read B");
for (int i = 0; i < 10; i++) {
System.out.println(InputStreamB.readInt());
}
System.out.println("Run A");
for (int i = 0; i < 10; i++) {
System.out.println(InputStreamA.readInt());
}
System.out.println("Run B");
for (int i = 0; i < 10; i++) {
System.out.println(InputStreamB.readInt());
}