2012-04-16 5 views
0

Я пишу программу, которая требует от меня написать и прочитать объект, который я создал. Когда я пытаюсь прочитать в объекте и Deserialize это, я получаю Ilegal начало выражения ошибка. Мне было интересно, может ли кто-нибудь сказать мне, что это такое, как я могу это решить.Чтение сериализованного объекта из файла

 RandomAccessFile temp = new RandomAccessFile(fileSystemName,"r"); 
     this.numberOfDirectories= temp.readInt(); 
     this.fileSystemSize = temp.readInt(); 
     this.numberOfBlocks = temp.readInt(); 
     //Prepares and loads the bitMap 
     numberOfBytes = (numberOfBlocks/8)+1; 
     //directory = new Directory(numberOfDirectories); 
     bitMap = new byte[numberOfBytes]; 
     for(int i=0;i<numberOfBytes;i++)bitMap[i]=temp.readByte(); 
     temp.close(); 
     FileInputStream fin = new FileInputStream(fileSystemName); 
     ObjectInputStream ois = new ObjectInputStream(fin); 

     //File file = new File(fileSystemName); 
     System.out.println(bitMap.length); 
     offset = 12 + numberOfBytes; 
     //ois.skipBytes(offset); 
     //Read Directories 
     directory = <Directory> ois.readObject(); 

Смещение связано с тем, что я сначала использую объект RandomAccessFile для чтения в некоторых целых числах и символах. Я ценю помощь. Спасибо

+0

попробуйте запустить приложение wihtout ois.skipBytes (смещение) – UVM

+1

компилировать ли ваш код? Звучит как синтаксическая ошибка. Может быть, вы где-то пропустили скобки? – Kai

+0

Не могли бы вы разместить часть трассировки стека и свой код, который также записывает в файл? Трюк с этим часто соответствием выхода с входом –

ответ

0

Я бы использовал один поток, тогда вам не нужно беспокоиться о смещениях, и убедитесь, что вы читаете то, что пишете. например, следующие работы: тонкие

final String name = "tmp.data"; 
int numberOfDirectories = 2; 
int fileSystemSize = 4; 
byte[] bitMap = new byte[] { 0, 1, 0 }; 
File someObject = new File("."); 
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(name)); 
outputStream.write(numberOfDirectories); 
outputStream.write(fileSystemSize); 
outputStream.write(bitMap.length); 
outputStream.write(bitMap); 
outputStream.writeObject(someObject); 
outputStream.close(); 
// .... 
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(name)); 
System.out.println("numberOfDirectories:" + inputStream.read()); 
System.out.println("fileSystemSize:" + inputStream.read()); 
final int size = inputStream.read(); 
byte[] readBitMap = new byte[size]; 
inputStream.read(readBitMap); 
System.out.println("bitMap:" + readBitMap); 
System.out.println("someObject:" + inputStream.readObject()); 
inputStream.close(); 

Кроме того, чтобы сделать жизнь еще проще, я был бы соблазн создать класс, который представляет все данные, которые вы хотите сохранить в файле, а затем поток объекта берет на себя все для вас:

public static class Data { 
    private int numberOfDirectories; 
    private int fileSystemSize; 
    private byte[] bitMap; 
    private File someObject; 
    // getters and setters .... 
} 

final String name = "tmp.data"; 
Data data = new Data(); 
data.setNumberOfDirectories(2); 
data.setFileSystemSize(4); 
data.setBitMap(new byte[] { 0, 1, 0 }); 
data.setSomeObject(new File(".")); 
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(name)); 
outputStream.writeObject(data); 
outputStream.close(); 
// .... 
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(name)); 
Data readData = (Data) inputStream.readObject(); 
System.out.println("numberOfDirectories:" + readData.getNumberOfDirectories()); 
System.out.println("fileSystemSize:" + readData.getFileSystemSize()); 
System.out.println("bitMap:" + readData.getBitMap()); 
System.out.println("someObject:" + readData.getSomeObject()); 
inputStream.close(); 
+0

Ну, дело в том, что я должен сохранить размер, который я выводил на этот постоянный размер. Насколько я понял, только RandomAccessFile позволяет мне это делать. –

0

Вы должны прочитать данные в соответствии с тем, как вы его написали.

Поток объекта имеет конкретный формат. Он имеет заголовок, и он потерял байта вокруг интересующих вас байтов. если вы напишете Integer, это займет 88 байт. Вы не можете просто читать внутри потока объектов, а бит доступа его произвольно или пропускать байты, ожидайте его работы.

Как вы написали данные?

+0

Вы имеете в виду, что я должен убедиться, что сначала прочитал то, что написал, а затем прочитал в объекте? –

+0

Я имею в виду, что вы должны читать в соответствии с тем, что вы написали. Если вы не используете пропуски при написании, маловероятно знать, куда его пропустить при чтении. –

Смежные вопросы