класс записи Java в файл - PullRequest
       1

класс записи Java в файл

1 голос
/ 29 декабря 2011

Это домашнее задание, которое я делаю на прогулке, изучая Java.

Я пишу программу, и все работает как положено, кроме чтения / записи в файл.

У меня есть один класс с именем Medico, который содержит только одну строку (typeOfMedico) и один int (valorFacturado).Medico является подклассом Pessoa.Pessoa содержит данные, такие как имя и адрес.public class Medico extends Pessoa implements Serializable является главной функцией класса Medico.

В моем основном классе с именем Clinica я запрашиваю ввод данных пользователем, и в конце я создаю new Medico, который добавляется в Arraylist с именем medico.

Длячтение и запись в файл Я создал этот класс:

package clinica;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class FicheiroObjectos {

    private ObjectInputStream iS;
    private ObjectOutputStream oS;

    public void abreLeitura(String nomeDoFicheiro) throws IOException {
        iS = new ObjectInputStream(new FileInputStream(nomeDoFicheiro));
    }

    public void abreEscrita(String nomeDoFicheiro) throws IOException {
        oS = new ObjectOutputStream(new FileOutputStream(nomeDoFicheiro));
    }

    public Object leObjecto() throws IOException, ClassNotFoundException {
        return iS.readObject();
    }

    public void escreveObjecto(Object o) throws IOException {
        oS.writeObject(o);
    }

    public void fechaLeitura() throws IOException {
        iS.close();
    }

    public void fechaEscrita() throws IOException {
        oS.close();
    }

    public void leFicheiroMedicos() {
        Medico medicos;
        while (true) {
            try {
                medicos = (Medico) this.leObjecto();
                Clinica.medicos.add(medicos);
            } catch (EOFException eof) {
                break;
            } catch (ClassNotFoundException cnf) {
                System.out.print("\nClassNotFoundException!\nO programa vai terminar\n");
                System.exit(-1);
            } catch (IOException ioe) {
                System.out.print("\nErro ao ler o ficheiro!\nO programa vai terminar\n");
                System.exit(-1);
            }
        }
    }

    public void escreveFicheiroMedicos() {
        try {
            for (Medico medicos: Clinica.medicos) {
                this.escreveObjecto(medicos);
            }
        } catch (IOException e) {
            System.out.print("\nErro ao escrever no ficheiro!\nO programa vai terminar\n");
            System.exit(-1);
        }
    }
}

В моем основном классе я создал следующие две функции:

 public static void insereDadosExistentes() {

        try {
            FicheiroObjectos file = new FicheiroObjectos();
            file.abreLeitura("Medicos.dat");
            file.leFicheiroMedicos();
            file.fechaLeitura();
        } catch (IOException ioe) {
        }

    }


    public static void gravarMedicos() {

        try {
            FicheiroObjectos file = new FicheiroObjectos();
            file.abreEscrita("Medicos.dat");
            file.escreveFicheiroMedicos();
            file.fechaEscrita();
        } catch (IOException e) {
            System.out.print("\nErro ao escrever no ficheiro!\nO programa vai terminar\n");
            System.exit(-1);
        }

    }
}

Затем добавил insereDadosExistentes() в началемоей функции main и добавлен gravarMedicos() сразу после добавления Medico в мой массив medicos.

Когда я запускаю свою программу (При первом запуске файл Medicos.dat не существует) и создайте Medico, Medico будет добавлен в мой массив и файл Medicos.dat создан.Затем я останавливаю программу и при следующем запуске, который теперь имеет файл Medicos.dat, я получаю сообщение об ошибке:

Erro ao ler o ficheiro!
O programa vai terminar

Проблема заключается в записи файла или чтении файла?Я знаю, что при чтении файла выдается ошибка, но это может быть связано с тем, что извлечение в файл выполняется неправильно.

Если я пытаюсь открыть Medicos.dat, я вижу некоторые символы, но ничего не связано с информацией, которую яввод, так что я даже не знаю, в порядке ли запись файла.

Помните, что все, кроме обработки файла, работает должным образом.

Можете ли вы указать мне в некоторых направлениях?

favolas

Ответы [ 4 ]

3 голосов
/ 29 декабря 2011
  1. Убедитесь, что вы явно закрыли ObjectOutputStream, чтобы записать все данные.

  2. Ваша проблема - исключение IOException.Однако обратный след скажет вам, что происходит: проблемы с открытием, чтением, что?Вы можете вызвать printStackTrace (), но лучше использовать отладку и просто посмотреть трассировку стека.

2 голосов
/ 29 декабря 2011

Если вы ловите исключение, просто не пишите что-то в system.out, а печатайте трассировку стека, это обычно даст вам подсказку, что не так

try {
            FicheiroObjectos file = new FicheiroObjectos();
            file.abreEscrita("Medicos.dat");
            file.escreveFicheiroMedicos();
            file.fechaEscrita();
        } catch (IOException e) {
           e.printStackTrace();
        }
1 голос
/ 29 декабря 2011

В: Вы пытаетесь читать и записывать ДАННЫЕ или пытаетесь сериализовать и десериализовать ОБЪЕКТЫ?

Я думаю, все, что вам нужно сделать, это открыть и записать в простой текстовый файл:

Например:

http://www.exampledepot.com/egs/java.io/AppendToFile.html

import java.io.*;

public class TestFile
{
  public static void main (String[] args)
  {
    // Test "append"
    // SOURCE: http://www.exampledepot.com/egs/java.io/AppendToFile.html
    try {
        BufferedWriter out = 
          new BufferedWriter(
            new FileWriter("myfile.txt", true));
        out.write("testing: a b c\n");
        out.write("testing: d e f\n");
        out.close();
    } 
      catch (IOException e) {
    }
  }
}

Пример вывода:

testing: a b c 
testing: d e f
0 голосов
/ 29 декабря 2011

Я не знаю, что такое сериализация в Java, но это кажется "слишком простым":

public void escreveObjecto(Object o) throws IOException {
    oS.writeObject(o);
}

Как поток вывода объекта должен знать, какие части вашего объекта должны быть записаны на диск? Возможно, ваш объект содержит только вычисленные значения, которые не должны храниться. Возможно, данные вашего объекта должны быть полностью сохранены. Возможно, ссылки на String объекты должны быть просто удалены ... или, возможно, эти Strings должны быть записаны на диск.

Должно быть что-то большее в использовании ObjectStream, чем здесь показано - и ответ paulsm4 показывает, что написание собственного контента вручную не так уж плохо. Стоит ли использовать этот подход вместо этого? Есть ли в вашем классе определенный формат хранения, которого вы должны придерживаться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...