Почему не работает класс динамической очереди для объектов реализованный с помощью потоков ввода/вывода?
Подскажите. Создал класс динамической очереди, реализующейся с помощью системы ввода/вывода. Т.е. объекты любого типа (благодаря дженерикам) последовательно сохраняются в текстовом файле. Проблема возникает при извлечении этих самых объектов из очереди, т.к. извлекается всегда только первый объект а последующие просто игнорируются. Скажем при заполнении очереди объектами Integer содержащими значения от 1 до 10 - метод Getin извлекает всегда только "1". Вопрос: что изменить в программе для последовательного извлечения всех объектов а не только первого?
package Qete;
import java.io.*;
class DynamicOcheredj<T> implements Ocheredj<T>, Serializable {
private int put, get; //счетчики заполнения и извлечения из очереди
private Object temp;
public DynamicOcheredj () {
put = get = 0;
temp = null;
try (FileWriter fw = new FileWriter ("Qete/Temp.txt")) { //очистка содержимого файла
fw.write("");
} catch (Exception exe) {
System.out.println ("Oshibka1: "+exe.toString());}
}
public void Putin (T ob) { //метод заполнения очереди файлами
try (ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream ("Qete/Temp.txt", true))) {
oos.writeObject(ob);
put++;
} catch (Exception exe) {
System.out.println ("Oshibka2: "+txt.toString());}
}
public Object Getin () throws ExceptionGet { //метод извлечения файлов из очереди
if (get==put) throw new ExceptionGet();
try (ObjectInputStream ois = new ObjectInputStream
(new FileInputStream ("Qete/Temp.dat"))) {
temp = ois.readObject();
if (temp==null) throw new ExceptionGet();
get++;
return temp;
} catch (Exception exe) {
System.out.println ("Oshibka3: "+exe.toString());}
throw new ExceptionGet();
}
}
Ответы (1 шт):
Как оказалось, комментарий выше был действительно к месту. При каждом вызове метода Getin() происходило извлечение только первого объекта, поэтому я начал искать пути решения этой проблемы. Не знаю насколько филигранное решение пришло в голову, но тем не менее это работает. В программе для каждого из объектов создается отдельный файл в папке "Qete/Tempa". В качестве аргумента методам FileOutputStream() и FileInputStream() указывается местонахождения текстового файла составленного из (адреса_файла(String)+номера_файла(int)+типа_файла(String)).
package Qete;
import java.io.*;
class DynamicOcheredj2<T> implements Ocheredj<T>, Serializable {
private int put, get; //счетчик заполения и извлечение элементов из очереди
private Object temp;
private int val1, val2; //номера документов в которые сохраняются/извлечкаются обьекты
private String txt, qete;
public DynamicOcheredj2 () {
put = get = val1 = val2 = 0;
txt = ".txt";
qete = "Qete/Tempa/";
}
public void Putin (T ob) { //метод заполнения очереди
try (ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream (qete+(val1++)+txt))) {
oos.writeObject(ob);
} catch (Exception exe) {
System.out.println ("Oshibka1: "+exe.toString());}
put++;
}
public Object Getin () throws ExceptionGet { //метод извлечения из очереди
if (get==put) throw new ExceptionGet();
try (ObjectInputStream ois = new ObjectInputStream
(new FileInputStream (qete+(val2++)+txt))) {
temp = (Object)ois.readObject();
} catch (Exception exe) {
System.out.println ("Oshibka2: "+exe.toString());}
get++;
return temp;
}
}