要实现一个自定义的文件结构来存储文件
//文档原型
import java.io.Serializable;
class docmeta implements Serializable{
public String title = null;
public String content= null;
}.......
//写入100个文档
for(int i = 0 ; i < 100 ; i++){
docmeta m_data = new docmeta();
m_data.title="title"+i;
m_data.content="content"+i;
byte[] b = objcetToBytes(m_data); //转换为byte[]
putBytesToFile(b,"d:\\doc.dat"); //将byte[]以增量模式写入到文件d:\\doc.dat
}
//写入完成。
请教如何将写入的100个文档循环读取出来,求解!
//文档原型
import java.io.Serializable;
class docmeta implements Serializable{
public String title = null;
public String content= null;
}.......
//写入100个文档
for(int i = 0 ; i < 100 ; i++){
docmeta m_data = new docmeta();
m_data.title="title"+i;
m_data.content="content"+i;
byte[] b = objcetToBytes(m_data); //转换为byte[]
putBytesToFile(b,"d:\\doc.dat"); //将byte[]以增量模式写入到文件d:\\doc.dat
}
//写入完成。
请教如何将写入的100个文档循环读取出来,求解!
File[] fs = f.listFiles();
for(int i=0; i<fs.length; i++){
try {
BufferedReader br = new BufferedReader(new FileReader(fs[i]));
……
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我想你上面这个写操作至少应该有个分割标志吧。
或者应该有objcetToBytes的逆方法,
不然你那一大堆毫无规律的byte神都没法知道你是100个文件还是1个文件。
我举个例子说啊,你像一个Office文件,如果用二进制打开,它前面有一部分是标识这是个word还是excel,
中间部分可能是文件的内容。
但是,如果你认为它就是一个二进制文件,所有的文本全部是文件内容也未尝不可。所以,针对这个问题,我认为最好结合你文件的特点进行分割,简单来说,就是你能够自己能够区分哪些是文件内容,哪些是分隔即可。
比如说,你的文件内容肯定不包括-----------------,那么你就可以用它当文件的分割符。以上只是我的观点,可能其他人有更好的解释或解决方法。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class DocsWriter { public void writeDocs(File[] files, File des) throws IOException {
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(des)));
for(int i = 0; i < files.length; i++){
writeDoc(files[i],out);
if(i < (files.length-1))
out.writeBoolean(true);
else
out.writeBoolean(false);
}
out.close();
}
private void writeDoc(File f, DataOutputStream out) throws IOException{
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(f)));
byte[] buffer = new byte[8192];
int c;
String fileName = f.getName();
long fileSize = f.length();
out.writeUTF(fileName);
out.writeLong(fileSize);
while( (c = in.read(buffer)) != -1) {
out.write(buffer, 0, c);
}
in.close();
}
public void readDocs(File docs) throws IOException{
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(docs)));
readDoc(in);
while(in.readBoolean()){
readDoc(in);
}
in.close();
}
private void readDoc(DataInputStream in)throws IOException{
String fileName = in.readUTF();
long fileSize = in.readLong();
FileOutputStream fileOut = new FileOutputStream(new File("D:" + File.separator + fileName));
long len = 0;
byte[] buff = new byte[8192];
int c;
while(len < fileSize ){
if(fileSize - len >= buff.length){
c = in.read(buff);
fileOut.write(buff, 0, c);
}else{
c = in.read(buff, 0, (int) (fileSize -len));
fileOut.write(buff, 0, c);
}
len += c;
}
fileOut.close();
}
public static void main(String[] args) throws IOException{
File[] files = new File("D:\\lei\\images").listFiles();
File des = new File("D:\\docs.data");
DocsWriter w = new DocsWriter();
//w.writeDocs(files, des);
w.readDocs(des);
}}