File I/O

 
 
 
Сообщения:209
Например имеется сlass :

class Data {
      String name; 
      int   age; 
      // и т.д. .....
}


как это записать в файл (и после прочитать) ?
(в смысле что структура файла будет иметь тип Data).
 
 
Сообщения:3874
Как вариант, можно использовать DataOutputStream. Нужно написать два метода - который умеют сохранять/читать струткуру в/из потока, и в цикле запускать чтение или запись:

Читаем и записываем в одинаковом порядке

public void writeData(DataOutputStrea stream, Data data) throws IOException {
      stream.writeString(data.name);
      stream.writeInt(data.age);
}

public Data readData(DataInputStream stream) throws IOException {
      Data data = new Data();
      data.name = stream.readString();
      data.age = stream.readInt();
      return data;
}


DataOutputStream и DataInputStream создаются на основе FileOutputStream и FileInputStream cooтветственно.
 
 
Сообщения:209
Лучше даже не DataOutputStream и DataInputStream , а сразу
ObjectOutputStream и ObjectInputStream..
 
 
Сообщения:3874
Что получилось в результате?
 
 
Сообщения:209
Ну вот так например , как вариант ..

class WriterReader {
    FileOutputStream  fout;
    ObjectOutputStream oout;
    
public void writeObject(Data[] data) throws FileNotFoundException, IOException {
        fout = new FileOutputStream("c:\\file.dat");  
        oout = new ObjectOutputStream(fout);
        
        for(int i = 0; i < data.length; i++)
            oout.writeObject(data[i]);
        
        oout.close();   
    }
    
    //....
}


А есть ли разница какой поток закрывать oout или fout ?
 
 
Сообщения:3874
Andrew:
А есть ли разница какой поток закрывать oout или fout ?


Нет, все стандартные Java потоки закрываются каскадно (т.е. если закрыть child поток - child закроет parent поток).
 
 
Сообщения:209
...я уже дагодался..
 
 
Сообщения:994
а я делаю через
BufferedReader in = new BufferedReader(new FileReader(path));

и соотв
Quote:
BufferedWriter out = new BufferedWriter(new FileWriter(path1));


есть разница по быстродействию с примерами которые привели вы?

Скачать фото и видео из Инстаграм
https://igrab.online/
 
 
Сообщения:209
Да буферизированный ввод/вывод улучшает эффективность. НО
тут cобственно обсуждалась запись объектов в файл ObjectOutputStream/.. и альтернатива в виде DataOutputStream/...а эти патоки буферизировать не получится. Ну а FileWriter/... уж совсем не подходит для записи структуры типа Data , ещё String name; int age; кое как запишите , но а что будете делать с double, c массивами, с др. структурами ??? Помойму ObjectOutputStream/... лучше не найти для данной задачи (название потока говорит само за себя).
 
 
Сообщения:994
прошу прощения, не внимателььно прочел, думал речь идет о Стринге

Скачать фото и видео из Инстаграм
https://igrab.online/
 
 
Сообщения:15
Кстати о string, подскажите как прочитать файл. Пробую так
FileInputStream fis = new FileInputStream("путь_к_файлу");
но выводит набор чисел (по-ходу не та кодировка?), добавляю
InputStreamReader isr = new InputStreamReader(fis, "KOI8_R");
но эффекта не много, тока числа меняются.
 
 
Сообщения:994
я об этом только что писал
BufferedWriter out = new BufferedWriter(new FileWriter(path)); 

path - путь до файла. создается автоматом, в противном случае заменяется.
и посмотри методы BufferedWriter
там есть write() и newLine()
out.write(txt);
out.newLine();
вроде достаточно что бы записать

Скачать фото и видео из Инстаграм
https://igrab.online/
 
 
Сообщения:209
Cуществуют различные классы для чтения/записи из/в файл(а).

В файле записано скажем : Hello world !
.......
 FileInputStream fin = new FileInputStream("...");
        
        while(fin.available() > 0) {
            System.out.print((char)fin.read());
        }       
        fin.close(); 
.......
    }
 
 
Сообщения:15
Достаточно было сказать что в любом случае понадобится преобразование типа :
(char)

А на счёт книжки так я как раз и читаю, вот и появился вопрос почему не работает вообщем-то их листинг
http://pages.plotinka.ru/~files21/books/programmistdocs/19/Glava18/Index2.htm
Но теперь вообщем-то понятно просто забыли написать (char).
 
 
Сообщения:209
Quote:

или записывать в него:

fos.write((char)с); fw.write((char)с);


читать внимательней надо!
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет