2011-12-29 3 views
1

Это для домашней работы, которую я делаю на своей прогулке, изучая Java.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 arraylist.

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

Erro ao ler o ficheiro! 
O programa vai terminar 

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

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

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

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

favolas

+0

Пожалуйста [перевести вывод программы] (HTTP: // translate.google.com/?um=1&ie=UTF-8&hl=ru&sa=N&tab=wT#auto|en|Erro%20ao%20ler%20o%20ficheiro!%0AO%20programa%20vai%20terminar) на английский! Это, кажется, означает .. * «Ошибка чтения файла! Программа закончится« *. –

+1

Вместо этой выходной строки введите 'e.printStackTrace()'. –

+0

Я подумал, что это отличный способ поупражняться в португальском. Это был португальский, не так ли? :) – sarnold

ответ

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

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

+0

Я закрыл ObjectOutputStream, и проблема не устранена. printStackTrace() дает мне 'Caused by: java.io.InvalidClassException: clinica.Medico; no valid constructor', но глядя на мой конструктор, я не вижу, что проблема – Favolas

+0

Ну, у Medico есть конструктор no-args? Я думаю, что это необходимо. – bmargulies

1

Q: Вы пытаетесь читать и записывать данные, или вы пытаетесь сериализации и десериализации объектов?

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

Например:

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

Мне нужно записать в файл объектов – Favolas

+1

Ну, тогда вы получите двоичный файл. С строкой заголовка «CAFEBABE»;) http://java.sun.com/developer/technicalArticles/Programming/serialization/ – paulsm4

+0

Разве это не для написания текстовых файлов? – Favolas

0

Я вообще не знаю Java-сериализацию, но это кажется «слишком легким»:

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

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

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

2

Если вы ловите исключение как раз не писать что-то System.out но напечатать StackTrace это, как правило, дать вам подсказку, что случилось

try { 
      FicheiroObjectos file = new FicheiroObjectos(); 
      file.abreEscrita("Medicos.dat"); 
      file.escreveFicheiroMedicos(); 
      file.fechaEscrita(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
Смежные вопросы