这是我在学习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()
arraylist添加Medico
后添加了medicos
。
当我运行我的程序时(第一次运行,文件Medicos.dat
,不存在)并创建Medico
,Medico
被添加到我的arraylist和文件{{1 }} 被建造。然后我停止程序,并在下一次运行,现在有一个Medicos.dat
文件,我收到错误:
Medicos.dat
问题在于写文件还是读取文件? 我知道在读取文件时会出现错误,但可能是因为文件的扭曲没有正确执行。
如果我尝试打开Erro ao ler o ficheiro!
O programa vai terminar
我可以看到一些字符但与我输入的信息无关,所以我甚至不知道文件写入是否正常。
请记住,除文件处理之外的所有内容都按预期工作。
你能指点我吗?
favolas
答案 0 :(得分:3)
确保明确关闭ObjectOutputStream以便写入所有数据。
您的问题是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显示了如何手工编写自己的内容并不是太糟糕。你应该采取这种方法吗?您的班级是否具有必须遵守的已定义存储格式?