Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 22:01   #1
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию исправить программу, записывающую объекты в файл с помощью RandomAccessFile (на Java)

Доброго времени суток!
Есть программа, записывающая объекты(строка таблицы, вида: выпускник | количество дипломов| вуз | год окончания) в файл, с помощью RandomAccessFile.
Так вот, сначала в файл записывается количество записей, потом размер строки, потом сама строка, потом размер следующей строки и т.д.
А преподаватель требует, чтобы записывалось так: количество записей, потом по порядку размеры всех строк, а потом строки.
И нужно осуществить доступ к строке по её номеру, а именно-вывести на экран.
Вот имеющийся код.
Заранее огромное спасибо.
Код:
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
 
public class Students {
 
    String fio;
    int diploms;
    String vuz[];
    int god[];
 
    public void vvod() {
        try {
            StringBuffer str = new StringBuffer();
            char ch;
            System.out.println("Введите ФИО выпускника:");
            str = new StringBuffer();
            while ((ch = (char) System.in.read()) != '\n') {
                str.append(ch);
            }
            fio = new String(str.toString());
 
            System.out.println("Введите количество дипломов:");
            str = new StringBuffer();
            while ((ch = (char) System.in.read()) != '\n') {
                str.append(ch);
            }
            int t = Integer.parseInt(str.toString());
            diploms = t;
            vuz = new String[t];
            god = new int[t];
 
            for (int i = 0; i < t; i++) {
                System.out.println("Введите название учебного учреждения:");
                str = new StringBuffer();
                while ((ch = (char) System.in.read()) != '\n') {
                    str.append(ch);
                }
                vuz[i] = new String(str.toString());
                System.out.println("Введите год окончания");
                str = new StringBuffer();
                while ((ch = (char) System.in.read()) != '\n') {
                    str.append(ch);
                }
                god[i] = Integer.parseInt(str.toString());
 
            }
        } catch (IOException e) {
            System.out.println(e.toString());
        }
 
    }
 
    public void vivod() {
        int t = diploms;
        System.out.print(fio + " " + t);
        for (int i = 0; i < t; i++) {
            System.out.print(" " + vuz[i] + " " + god[i]);
        }
        System.out.println("\n");
    }
 
    public void writeToFile(DataOutputStream out) {
        try {
            out.writeInt(this.getInFileSize());
            out.writeUTF(fio);
            out.writeInt(diploms);
            for (int i = 0; i < diploms; i++) {
                out.writeUTF(vuz[i]);
                out.writeInt(god[i]);
            }
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }
 
//чтение информаци из файла
    public void readFromFile(RandomAccessFile inp, int startPosition) {
        try {
            inp.seek(startPosition);
            fio = inp.readUTF();
            fio = fio.trim();
            diploms = inp.readInt();
            vuz = new String[diploms];
            god = new int[diploms];
            for (int i = 0; i < diploms; i++) {
                vuz[i] = inp.readUTF();
                god[i] = inp.readInt();
            }
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }
 
    //функция реализует подсчет размера объекта при записи его в файл
    public int getInFileSize() {
        int res;
        res = fio.length() + 2 + 4;
        for (int i = 0; i < diploms; i++) {
            res += vuz[i].length() + 2 + 4;
        }
        return res;
    }
V-alterman вне форума Ответить с цитированием
Старый 03.12.2014, 22:01   #2
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию

Код:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import javax.swing.JOptionPane;
 

    public static void main(String[] args) {
        // TODO code application logic here
        try {
//инициализация ппотоков для вывода
            OutputStream f = null;
            StringBuffer str;
            char ch;
            try {
                f = new FileOutputStream("test.txt");
            } catch (FileNotFoundException e) {
                System.out.println("Файл не найден");
                return;
            }
            BufferedOutputStream b = new BufferedOutputStream(f);
            DataOutputStream out = new DataOutputStream(b);
//ввод количества строк в таблице
            int n;
            System.out.println("Введите кол-во  строк в таблице");
            str = new StringBuffer();
            while ((ch = (char) System.in.read()) != '\n') {
                str.append(ch);
            }
            n = Integer.parseInt(str.toString());
            out.writeInt(n);
//ввод объектов с клавиатуры и зпись их в файл
            for (int i = 0; i < n; i++) {
                Students s = new Students();
                s.vvod();
                s.writeToFile(out);
            }
            out.close();
 
            // InputStream f1 = new FileInputStream("test.j");
            // BufferedInputStream bi= new BufferedInputStream(f1);
            // DataInputStream inp = new DataInputStream(bi);
//инициализация файла проихвольного доступа
            File f1 = new File("test.txt");
            RandomAccessFile inp = new RandomAccessFile(f1, "r");
            Students s1 = new Students();
 
//считывание номера необходимой записи
            System.out.println("\nВведите номер записи которую хотите прочитать");
            str = new StringBuffer();
            while ((ch = (char) System.in.read()) != '\n') {
                str.append(ch);
            }
            n = Integer.parseInt(str.toString());
            int k = inp.readInt();
            if (n > k) {
                System.out.println("В файле нет такой записи");
                return;
            }
//подсчет положения необходимой записи в файле
            int pos = 4, t;
            for (int i = 0; i < n - 1; i++) {
                t = inp.readInt();
                pos += t + 4;
                inp.seek(pos);
            }
            pos += 4;
//считывание необходимой записи и вывод ее на экран
            s1.readFromFile(inp, pos);
            System.out.println("Считанная запись:\n");
            s1.vivod();
            inp.close();
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }
 
}
V-alterman вне форума Ответить с цитированием
Старый 04.12.2014, 11:47   #3
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию

Кажется сделал. Тему можно закрывать.
V-alterman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу на Pascal, записывающую в файл закодированный текст, считывающую его и выполняющую дешифрование Avengerone Помощь студентам 1 26.05.2014 17:43
Исправить программу решения уравнения ax^3+bx=0(JAVA) ksss Помощь студентам 0 26.12.2012 00:39
Файл, исправить программу ilyas22 Помощь студентам 7 08.06.2010 18:13
[Java]Переделать программу,используя объекты Dekker Помощь студентам 0 01.12.2009 19:54
Задача на объекты. Исправить код. AVer Помощь студентам 1 21.01.2007 14:55