Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中无法同时从文件中读取对象和数据_Java_File - Fatal编程技术网

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

在java中无法同时从文件中读取对象和数据,java,file,Java,File,在java中无法同时从文件中读取对象和数据 我可以将对象写入文件,但无法获取所有对象,只能获取第一个对象,并且无法检索对象后的数据 import java.io.*; import java.util.*; class writeobj implements Serializable { public String name; public long size; } class FileLists { public static void main(Strin

在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:无效类型代码:69 at java.base/java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2937) 在 java.base/java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2971) 在 java.base/java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:3043) 在 java.base/java.io.ObjectInputStream.read(ObjectInputStream.java:906) 位于FileLists.main(createnewfile.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
  • 等等

请通过编辑将跟踪信息包含在您的问题中-难以在评论中阅读。另外,请格式化问题中的代码,这也是不太可读的。我认为您不应该在同一个文件上同时使用文件流和对象流。我将尝试序列化writeobj(转换为字符串),并仅使用FileOutputStream编写字符串