[英]java write class to file
這是我在步行學習Java時要做的一項家庭作業。
我正在編寫一個程序,除了對文件的讀/寫操作之外,其他所有功能都按預期工作。
我有一個名為Medico
類,該類僅包含一個字符串( typeOfMedico
)和一個int( valorFacturado
)。 Medico
是Pessoa
的子類。 Pessoa
擁有姓名和地址之類的數據。 public class Medico extends Pessoa implements Serializable
是Medico
類的主要功能。
在名為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
我會看到一些字符,但是與我輸入的信息無關,因此我什至不知道文件寫入是否正常。
請記住,除了文件處理之外,其他所有功能都可以正常工作。
你能指出我的方向嗎?
最愛
確保顯式關閉ObjectOutputStream,以便寫入所有數據。
您的問題是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.