[英]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.