要实现一个自定义的文件结构来存储文件
//文档原型
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个文档循环读取出来,求解!

解决方案 »

  1.   

    如果objcetToBytes(m_data)长度是固定的就容易,按长度读就行了
      

  2.   

    你这100个文档在同一个目录下吗File f = new File(yourfilepath);
    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();
    }
    }
      

  3.   

    putBytesToFile(b,"d:\\doc.dat"); //将byte[]以增量模式写入到文件d:\\doc.dat
    我想你上面这个写操作至少应该有个分割标志吧。
    或者应该有objcetToBytes的逆方法,
    不然你那一大堆毫无规律的byte神都没法知道你是100个文件还是1个文件。
      

  4.   

    这个就复杂了。
    我举个例子说啊,你像一个Office文件,如果用二进制打开,它前面有一部分是标识这是个word还是excel,
    中间部分可能是文件的内容。
    但是,如果你认为它就是一个二进制文件,所有的文本全部是文件内容也未尝不可。所以,针对这个问题,我认为最好结合你文件的特点进行分割,简单来说,就是你能够自己能够区分哪些是文件内容,哪些是分隔即可。
    比如说,你的文件内容肯定不包括-----------------,那么你就可以用它当文件的分割符。以上只是我的观点,可能其他人有更好的解释或解决方法。
      

  5.   

    实现是可以实现感觉效率有点低,关键点是如何快速的切分byte[]数组
      

  6.   

    花了一点时间写了一个
    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);



    }}
      

  7.   

    writeDocs是将多个文件写入到一个文件中去,readDocs是将合并写入的文件分开读出来,默认是会读到D盘中。你可以试试。