我想在文件中写入和读取数据,文件以字(字符串)开头,然后是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();
我的第二个问题是如何从此文件中读取?
答案 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)
您的方法存在两个主要问题,因为它基本上是文本和二进制文件的混合。
当然,你可以对字节数组进行编码,例如在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]