繁体   English   中英

java将类写入文件

[英]java write class to 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()刚刚加入后, Medico到我的medicos的ArrayList。

当我运行程序时(第一次运行时,文件Medicos.dat不存在)并创建Medico ,将Medico添加到我的Medicos.dat并创建文件Medicos.dat 然后,我停止程序,并在下一次运行,现在有了Medicos.dat文件,出现错误:

Erro ao ler o ficheiro!
O programa vai terminar

问题是写入文件还是读取文件? 我知道读取文件时给出了错误,但这可能是因为对文件的写操作没有正确执行。

如果我尝试打开Medicos.dat我会看到一些字符,但是与我输入的信息无关,因此我什至不知道文件写入是否正常。

请记住,除了文件处理之外,其他所有功能都可以正常工作。

你能指出我的方向吗?

最爱

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

  2. 您的问题是IOException。 但是,回溯将告诉您正在发生的事情:打开麻烦,阅读困难,什么? 您可以调用printStackTrace(),但更好的方法是使用调试功能,然后查看堆栈跟踪。

如果您发现异常,请不要只是向system.out写一些东西,而要打印stacktrace,这通常会给您一个提示,指出出了什么问题

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

问:您是要读写数据,还是要序列化和反序列化对象?

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

例如:

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

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

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

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

使用ObjectStream的东西肯定比这里显示的要多-而且paulsm4的答案表明,手工编写自己的内容还不错。 您是否应该采用这种方法? 您的课程是否有必须遵守的已定义存储格式?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM