gpt4 book ai didi

java - 在文件中写入和读取混合数据

转载 作者:太空宇宙 更新时间:2023-11-04 14:44:01 24 4
gpt4 key购买 nike

我想在文件中写入和读取数据,这些文件以单词(字符串)开头,然后是文件中的字节数组。我的文件非常大,其内容如下:

book byte[] array1 
bench byte[] array2
......

......

我正在寻找一种有效的方法来完成这项任务,我的实现方式有效吗?,因为我不熟悉 Java-IO,所以我需要你的帮助。

以下代码是我迄今为止在文件中写入一行的代码,

FileWriter fileWritter = new FileWriter(fileName,true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
bufferWritter.write(key+" ");
byte[] compressPostings=compress.compress(postings);


FileOutputStream fos = new FileOutputStream(fileName);
fos.write(compressPostings);
fos.close();

bufferWritter.newLine();
bufferWritter.close();
fileWritter.close();

我的第二个问题是如何读取该文件?

最佳答案

您的方法存在两个主要问题,因为它基本上是文本文件和二进制文件的混合。

  1. 如果您的数组没有恒定长度,您将不知道数组在哪里结束
  2. 如果使用分隔符,例如\n,这自然会出现在字节数组中。

现在当然,您可以对字节数组进行编码,例如使用 base64,但这让我觉得非常不优雅。不幸的是,您现在并没有明确说明格式是如何指定的以及是否可以修改它。

如果可以的话,我会规避所有这些问题,并让 Java 序列化通过将数据作为数组列表进行一些转换来处理它,其中偶数索引包含名称,奇数索引包含二进制数据。 toString 方法只是为了表明它的工作原理,您可能还想添加一个方便的函数 getRow()。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class HybridFile implements Serializable
{
private static final long serialVersionUID = 1L;
private List<byte[]> data = new ArrayList<>();

public void addRow(String s,byte[] a)
{
data.add(s.getBytes()); // add encoding if necessary
data.add(a);
}

@Override public String toString()
{
StringBuilder sb = new StringBuilder();
synchronized (data)
{
for(int i=0;i<data.size();i+=2)
{
sb.append(new String(data.get(i)));
sb.append(Arrays.toString(data.get(i+1))+"\n");
}
}
return sb.toString();
}

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException
{
HybridFile hf = new HybridFile();
hf.addRow("peter",new byte[] {1,2,3});
hf.addRow("jaqueline",new byte[] {4,5,6});

try(ObjectOutput output =
new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("hybrid"))))
{output.writeObject(hf);}

ObjectInput input = new ObjectInputStream(new BufferedInputStream(new FileInputStream("hybrid")));
HybridFile hf2 = (HybridFile)input.readObject();

System.out.println(hf2);
}
}

输出

peter[1, 2, 3]
jaqueline[4, 5, 6]

关于java - 在文件中写入和读取混合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645756/

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