在java中不能同时从文件中读取对象和数据。m能够将对象写入文件,但不能提取所有对象。只提取第一个对象,并且不能检索对象之后的数据。
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) at java.base/java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2971) at java.base/java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:3043) at java.base/java.io.ObjectInputStream.read(ObjectInputStream.java:906) at FileLists.main(createnewfile.java:33)
发布于 2018-06-16 03:42:58
问题可能出在这里:
while((ch=ois.read())!= -1){
System.out.println("as");
}
您正在编写“writeobj”类,后跟文件字节,然后重复。因此,希望您保存的文件将如下所示:
使用ObjectOutputStream
但是,当您正在读取时,您读取了一个writeobj对象,然后尝试从ObjectInputStream读取另一个对象。
要使其正常工作,您必须:
直接从ObjectInputStream
中读取下一次
https://stackoverflow.com/questions/50879463
复制相似问题