В Java есть альтернатива readObject () для RandomAccessFile - PullRequest
0 голосов
/ 23 ноября 2011

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

ObjectInputStream FileIn= new ObjectInputStream(new FileInputStream("cars.txt"));

//AND HERE IS THE CODE FOR THE RandomAccessFile VERSION:
RandomAccessFile FileIn = new RandomAccessFile("cars.txt", "rw");

  au=(Cars)FileIn.readObject(); //THIS readObject(), is giving me errors
  //Cars is a Class

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

Ответы [ 4 ]

1 голос
/ 23 ноября 2011

Как и FileInputStream, вам нужно обернуть файл RandomAccessFile в ObjectInputStream.то есть RandomAccessFile ничего не покупает.

final RandomAccessFile raf = new RandomAccessFile("file.dat", "r");
ObjectInputStream ois = new ObjectInputStream(new InputStream() {
    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        return raf.read(b, off, len);
    }

    @Override
    public int read() throws IOException {
        return raf.read();
    }
});
0 голосов
/ 23 ноября 2011

Если вы спрашиваете, можете ли вы использовать RandomAccessFile для поиска внутри потока объектов и чтения объектов, тогда короткий ответ - «нет».Потоки сериализованных объектов в значительной степени кодируются с помощью обратных указателей на ранее использовавшиеся объекты, включая ранее записанные определения классов и т. Д.* Вот некоторые подробности о формате сериализации .

Обсуждение случайной записи из документов Java .

У нас было похожее требованиеи написал некоторый код, который время от времени закрывает и повторно открывает сериализованный поток, и записывает положения этих точек останова.Это не дало нам возможности читать конкретный объект, но дало нам возможность добавлять к сериализованному потоку и пропускать определенную часть файла - переходить к следующему разрыву.

0 голосов
/ 23 ноября 2011

Для простых объектов String гораздо проще использовать обычный DataInputStream / DataOutputStream:

package test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

public class TestFile {

    static final String FILE = "/tmp/cars.txt";

    public static void main(String[] args) {
    try {
        List<String> strs = new ArrayList<String>();
        strs.add("Audi");
        strs.add("Seat");
        strs.add("Renault");

        saveStrings(strs);

        strs = loadStrings();

        System.out.println("Read strings: " + strs);

    } catch (Exception e) {

    }
    }

    static List<String> loadStrings() throws Exception {
    DataInputStream dis = null;
    List<String> list = new ArrayList<String>();
    try {
        dis = new DataInputStream(new FileInputStream(FILE));
        while (dis.available() > 0) {
        list.add(dis.readUTF());
        }
    } finally {
        if (dis != null)
        dis.close();
    }

    return list;
    }

    static void saveStrings(List<String> list) throws Exception {
    DataOutputStream dos = null;

    try {
        dos = new DataOutputStream(new FileOutputStream(FILE));
        for (String str : list) {
        dos.writeUTF(str);
        }
    } finally {
        if (dos != null)
        dos.close();
    }
    }

}
0 голосов
/ 23 ноября 2011

Ну, вам нужно вызвать writeObject() вместо readObject(), который фактически предназначен для чтения с диска в память, и, конечно, когда программа заканчивается, то же самое относится и к памяти, используемой этой программой.

...