簡體   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