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

时间:2014-07-09 05:06:52

标签: java java-io

我想在文件中写入和读取数据,文件以字(字符串)开头,然后是file.My文件中的一个字节数组,文件非常庞大,内容如下:

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();

我的第二个问题是如何从此文件中读取?

4 个答案:

答案 0 :(得分:0)

为您的文件创建FileInputStream实例。

在这个类中声明了以下方法:

public int read(byte[] b) throws IOException

使用它并根据需要处理读取字节。如果应该有一个字符串,请将这些字节转换为字符串。

答案 1 :(得分:0)

参考此示例: -

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.DoubleBuffer;
import java.nio.LongBuffer;
import java.nio.channels.FileChannel;
public class MainClass {
  public static void main(String[] args) {
    long[] primes = new long[] { 1, 2, 3, 5, 7 };
    File aFile = new File("C:/test/primes.txt");
    FileOutputStream outputFile = null;
    try {
      outputFile = new FileOutputStream(aFile);
    } catch (FileNotFoundException e) {
      e.printStackTrace(System.err);
    }
    FileChannel file = outputFile.getChannel();
    final int BUFFERSIZE = 100;
    ByteBuffer buf = ByteBuffer.allocate(BUFFERSIZE);
    DoubleBuffer doubleBuf = buf.asDoubleBuffer();
    buf.position(8);
    CharBuffer charBuf = buf.asCharBuffer();
    for (long prime : primes) {
      String primeStr = "prime = " + prime;
      doubleBuf.put(0, (double) primeStr.length());
      charBuf.put(primeStr);
      buf.position(2 * charBuf.position() + 8);
      LongBuffer longBuf = buf.asLongBuffer();
      longBuf.put(prime);
      buf.position(buf.position() + 8);
      buf.flip();
      try {
        file.write(buf);
      } catch (IOException e) {
        e.printStackTrace(System.err);
      }
      buf.clear();
      doubleBuf.clear();
      charBuf.clear();
    }
    try {
      System.out.println("File written is " + file.size() + "bytes.");
      outputFile.close();
    } catch (IOException e) {
      e.printStackTrace(System.err);
    }
  }
}

答案 2 :(得分:0)

由于您要为每个字节数组添加换行符,因此在Java中的任何XXXXReader类中使用readLine()方法会很方便。它将逐行读取,因此您不需要使用read()或read(byte [] b)。当然read()或read(byte [] b)有效,但您可能需要添加一些额外的逻辑来处理从文件中读取的字节。

答案 3 :(得分:0)

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

  1. 如果您的数组没有恒定长度,则不知道数组的结束位置和
  2. 如果你使用分隔字符,例如\ n,这自然会出现在字节数组中。
  3. 当然,你可以对字节数组进行编码,例如在base64中,但这让我觉得非常不优雅。 不幸的是,您没有明确说明目前是如何指定格式的,以及您是否可以修改它。

    如果可以的话,我会绕过所有这些问题,并让Java Serialization通过一些数据转换来处理它,作为数组列表,其中偶数索引包含名称,奇数索引包含二进制数据。 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]