gpt4 book ai didi

java - BufferedInputStream 不适用于文件中的随机查找

转载 作者:行者123 更新时间:2023-11-30 09:45:51 27 4
gpt4 key购买 nike

我的文件写入过程如下(我称之为非集群模式)

  1. Write an object to the current position of the file. Note the position of write in another file (called the index file) so I know where have I placed the objects.
  2. Leave some space (Randomly 1/2/3/4 KB of space) by writing zero bytes
  3. Repeat steps 1 and 2

现在我决定从文件中读回对象。但我想使用 BufferedInputStream。但是,当我将 BufferedInputStream 封装在 ObjectInputStream 中时,在读取一些对象后出现错误。我猜这发生在 一次缓冲读取之后(即读取一次缓冲区中可以容纳的尽可能多的对象,下次我收到错误时)。

另一方面,将 FileInputStream 直接封装在 ObjectInputStream 中也没有任何问题。

如果需要,我也会提供编写代码的文件。请随时询问有关以下代码的任何问题。

public class RecordsFileReader {
RecordsFile rFile;
Iterator itr;
FileInputStream fis;
ObjectInputStream ois;<p></p>

<pre><code>// The constructor
public RecordsFileReader(RecordsFile rFile) throws IOException, ClassNotFoundException {
this.rFile = rFile;
fis = new FileInputStream(rFile.getFileName());


ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream(rFile.getFileName() + ".index"));



rFile.recordsLocationList = (ArrayList <Long>) ois2.readObject();
itr = rFile.recordsLocationList.iterator();
/**********************************************************/
/* HERE IS THE PROBLEM. */
/* Doesnt work when I additionally use BufferedInputStream*/
/**********************************************************/

ois = new ObjectInputStream(fis);

/**********************************************************/
}

public Tuple readNext() throws IOException, ClassNotFoundException {
if(!itr.hasNext())
return null;
Long nextRecordPosition = itr.next();
fis.getChannel().position(nextRecordPosition);
//System.out.println((Tuple) ois.readObject());
return ((Tuple) ois.readObject());
}

public void close() throws IOException {
ois.close();
fis.close();



}

public boolean hasNext() {
return itr.hasNext();

}
</code></pre>

<p>}
</p>

public class RecordsFile {<p></p>

<pre><code>boolean clustered;
private String fileName;

public RecordsFile(String fileName, boolean clustered) throws IOException {
this.fileName = fileName;
this.clustered = clustered;
}

/*
The byte positions at which the records are located in the file.
*/
ArrayList<Long> recordsLocationList= new ArrayList<Long>();

public String getFileName() {
return fileName;
}
</code></pre>

<p>}
</p>

这是导致错误的更改:ois = new ObjectInputStream(new BufferedInputStream(fis, 4096)); 而不是 ois = new ObjectInputStream(fis);

错误是java.io.StreamCorruptionException: invalid type code : 00

编辑:

我现在已经想通了这个问题。当我的 fis 被定位到一个新位置时,我的 bis 并没有被跳到那个新位置。相反,bis 试图仅从旧位置读取,因此出现异常

最佳答案

这表示从流(和文件)中读回的字节被解释为一个对象(由 OIS)但实际上这些字节是其他东西(不是实际的字节表示)目的 )。这可能是因为明确指定了缓冲区大小(结合您手动设置位置的事实)。

我建议尝试不明确指定缓冲区大小。

ois = new ObjectInputStream(new BufferedInputStream(fis))

关于java - BufferedInputStream 不适用于文件中的随机查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422467/

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