繁体   English   中英

无法在Java中同时从文件读取对象和数据

[英]Not able to read object and data from the file at same time in java

无法在Java中同时从文件中读取对象和数据,无法将对象写入文件,但无法获取所有对象,仅获取第一个对象,并且无法获取对象之后的数据

 import java.io.*;
 import java.util.*;

 class writeobj implements Serializable
 {
   public String name;
   public long size;
 }

 class FileLists
 {
   public static void main(String[] args)  throws Exception
   {
   try{
    File folder = new File("/home/shubham/Desktop/packer/dem");

    File[] files = folder.listFiles();

    FileOutputStream fobj = new FileOutputStream("myfile.ser");

     ObjectOutputStream oobj = new ObjectOutputStream(fobj);
      int ch;

    for (File file : files) 
        {   
            if (file.isFile())
                {  
            writeobj obj = new writeobj();
                    obj.name = file.getName();
            obj.size = file.length();
            oobj.writeObject(obj);
            String str = file.getAbsolutePath();
            FileInputStream fre =new FileInputStream(str); 
            System.out.println(file.getName()+"-"+file.length()+"-"+str);


            //FileReader f = new FileReader(obj.name);
            byte[] buffer = new byte[1024];

            while((ch = fre.read(buffer))!=-1){
                //System.out.println((char)ch);
                fobj.write(buffer,0,ch);
            }
            //Fread = null;
            fre.close();
            obj = null;
        }
        }
}
catch(Exception e)
{
    System.out.println(e);
}       
}
}

从该文件读取时,它仅读取第一个对象并创建该文件,但在此之后,不能从myfile.ser中读取非对象的数据。

import java.io.*; 
import java.util.*;

  class writeobj implements Serializable
  {
    public String name;
    public long size;
   }
  class FileLists
  {
   public static void main(String[] args) 
{

int ch;
//File folder = new File("/home/shubham/Desktop/packer/dem/hello/demo");
try
{
    FileInputStream fobj = new FileInputStream("myfile.ser");
    //BufferedInputStream br = new BufferedInputStream(fobj);

    ObjectInputStream ois = new ObjectInputStream(fobj);
    writeobj e;
    while( (e = (writeobj)ois.readObject()) != null)
    {
        FileWriter f = new FileWriter(e.name);

        System.out.println(e.name+"name :"+e.size);

        while((ch=ois.read())!= -1){
            System.out.println("as");
        }
    }   

}
catch(Exception ef){
System.out.println();
    ef.printStackTrace();
}

}
}

堆栈跟踪:

java.io.StreamCorruptedException:无效类型代码:java.base / java.io.ObjectInputStream $ BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2937)处的java.base / java.io.ObjectInputStream $ BlockDataInputStream.refill(ObjectInputStream.java) FileLists.main(createnewfile)上的java.base / java.io.ObjectInputStream.read(ObjectInputStream.java:906)处的java.base / java.io.ObjectInputStream $ BlockDataInputStream.read(ObjectInputStream.java:3043)处的:2971)。的java:33)

问题可能出在这里:

while((ch=ois.read())!= -1){
    System.out.println("as");
}

您正在编写'writeobj'类,后跟文件字节,然后重复。 因此,希望您保存的文件如下所示:

  • writeobj-用ObjectOutputStream编写
  • 文件字节-直接写入FileOutputStream
  • writeobj-用ObjectOutputStream编写
  • 文件字节-直接写入FileOutputStream

但是,在读取时,您读取了一个writeobj对象,然后尝试从ObjectInputStream中读取另一个对象。

为此,您必须:

  • 从ObjectInputStream读取writeobj
  • 直接从FileInputStream读取确切的文件字节数
  • 从ObjectInputStream读取下一个writeobj
  • 等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM