java写类到文件

时间:2011-12-29 00:26:12

标签: java file

这是我在学习java时所做的功课。

我正在编写一个程序,除了读/写文件外,它都按预期工作。

我有一个名为Medico的类,它只包含一个字符串(typeOfMedico)和一个int(valorFacturado)。 MedicoPessoa的子类。 Pessoa包含姓名和地址等数据。 public class Medico extends Pessoa implements SerializableMedico类的主要功能。

在我的主要类Clinica上,我要求用户输入,并在最后创建一个new Medico,并将其添加到名为medico的Arraylist中。

为了读取和写入文件,我创建了这个类:

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() arraylist添加Medico后添加了medicos

当我运行我的程序时(第一次运行,文件Medicos.dat,不存在)并创建MedicoMedico被添加到我的arraylist和文件{{1 }} 被建造。然后我停止程序,并在下一次运行,现在有一个Medicos.dat文件,我收到错误:

Medicos.dat

问题在于写文件还是读取文件? 我知道在读取文件时会出现错误,但可能是因为文件的扭曲没有正确执行。

如果我尝试打开Erro ao ler o ficheiro! O programa vai terminar 我可以看到一些字符但与我输入的信息无关,所以我甚至不知道文件写入是否正常。

请记住,除文件处理之外的所有内容都按预期工作。

你能指点我吗?

favolas

4 个答案:

答案 0 :(得分:3)

  1. 确保明确关闭ObjectOutputStream以便写入所有数据。

  2. 您的问题是IOException。然而,回溯会告诉你发生了什么:打开麻烦,阅读,什么?你可以调用printStackTrace(),但更好的是你可以使用调试,只看堆栈跟踪。

答案 1 :(得分:2)

如果你遇到异常,不要只是写一些内容给system.out但打印堆栈跟踪这通常会给你一个错误的线索

try {
            FicheiroObjectos file = new FicheiroObjectos();
            file.abreEscrita("Medicos.dat");
            file.escreveFicheiroMedicos();
            file.fechaEscrita();
        } catch (IOException e) {
           e.printStackTrace();
        }

答案 2 :(得分:1)

问:您是在尝试读写DATA,还是在尝试序列化和反序列化OBJECTS?

我认为您需要做的就是打开并写入简单的文本文件:

例如:

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

答案 3 :(得分:0)

我根本不了解Java的序列化内容,但这似乎“太容易了”:

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

对象输出流如何知道需要将对象的哪些部分写入磁盘?可能是您的对象只包含不应存储的计算值。可能是您的对象的数据需要完全存储。也许应该删除对String个对象的引用......或者应该将那些Strings写入磁盘。

使用ObjectStream的东西必须比你在这里显示的更多 - 而且paulsm4's answer显示了如何手工编写自己的内容并不是太糟糕。你应该采取这种方法吗?您的班级是否具有必须遵守的已定义存储格式?