为什么我试图在txt中保存数据时会得到这些符号(java)

时间:2011-12-03 23:33:57

标签: java swing file save

在你认为这个问题很久之前,请尽量帮我解决这个问题(上午9:52 - 下午4:54),这只会让我烦恼。 < / p>

我似乎无法正确保存这些数据我主要是双打和字符串,我将这些保存在名为“autosAudi.txt”的.txt文件中,我得到这些奇怪的代码和框,有时候出于任何原因我的文本字段中的中文?以下是出现的示例:

http://www.flickr.com/photos/63259070@N06/6449175293

正如你可以看到这些奇怪的盒子无处出现我没有注册这样的东西,我浏览数据的方式是点击&gt;&gt; (下一个)或&lt;&lt; (上一个)并且信息应该改变,“Numero”旁边的文本字段应该给我一个输入int代码的方法,这样我就可以搜索数据(例如,如果我写1,它应该找到那个注册表)。它仅适用于数字1,之后它会出现此错误:

run:
3-Dec-2011 5:02:01 PM rent_autos.Interfaz3 jbBucar_AMouseClicked
SEVERE: null
java.io.EOFException
at java.io.RandomAccessFile.readChar(RandomAccessFile.java:695)
at rent_autos.Autos.leerCadena(Autos.java:276)
at rent_autos.Autos.buscar(Autos.java:344)
at rent_autos.Interfaz3.jbBucar_AMouseClicked(Interfaz3.java:4640)
at rent_autos.Interfaz3.access$1100(Interfaz3.java:30)
at rent_autos.Interfaz3$12.mouseClicked(Interfaz3.java:745)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

以下是我用于在“autosAudi.txt”中保存文件的代码:

public void guardar() throws IOException    {
int opcion = JOptionPane.showConfirmDialog(null,"¿Desea guardar los                  
cambios?","Datos Persona",JOptionPane.YES_NO_CANCEL_OPTION);


if(opcion == 0){
RandomAccessFile f = new RandomAccessFile("autosAudi.txt","rw");
f.seek(f.length());
f.writeInt(codigo);
f.writeDouble(costo);
f.writeDouble(rendimientoGalon);
escribirCadena(f, ACRISS);
escribirCadena(f, color);
escribirCadena(f, modelo);
escribirCadena(f, tipoAM);
escribirCadena(f, placa);
escribirCadena(f, marca );

f.close();
}

}

并且还使用了:

public boolean cargarDatosRegistro(long iPosicion, String sRuta){
boolean bRealizado = true;
try {
RandomAccessFile fRegistro = new RandomAccessFile(sRuta,"rw");
fRegistro.seek(iPosicion);
codigo  = fRegistro.readInt();
costo = fRegistro.readDouble();
rendimientoGalon  = fRegistro.readDouble();
ACRISS  = leerCadena(fRegistro);
color  = leerCadena(fRegistro);
modelo = leerCadena(fRegistro);
tipoAM = leerCadena(fRegistro);
placa = leerCadena(fRegistro); 
marca = leerCadena(fRegistro);

fRegistro.close();
} catch (Exception e) {
bRealizado = false;
}
return bRealizado;
}

escribirCadena方法用于String类型,因为java没有.writeString,下面是代码:

private void escribirCadena( RandomAccessFile file, String cadena) throws IOException               
{    
StringBuffer buffer = (cadena == null)? new StringBuffer(15): 
new         StringBuffer(cadena);
buffer.setLength(30);
file.writeChars(buffer.toString());
}

leerCadena方法用于读取字符串:

private String leerCadena( RandomAccessFile file ) throws IOException   {
char cadena[] = new char[30], temp;
for ( int c=0;c<cadena.length;c++)
{
temp = file.readChar();
cadena[c]=temp;
}
return new String(cadena).replace('\0',' ');
}

我根据我的导师的例子制作了这个项目,文件真的不同,下面是图片:

http://www.flickr.com/photos/63259070@N06/6449172477/in/photostream/

说“Registro.txt”的是我的老师,“autosAudi.txt”是我的

最后一件事:搜索方法有点长:

public void buscar(int cod) throws IOException{
RandomAccessFile f = new RandomAccessFile("autosAudi.txt","rw");
boolean encontrado=false;
registroExistente = false ;
long bytes = 0;
do{
codigo = f.readInt();
costo = f.readDouble();
rendimientoGalon = f.readDouble();
ACRISS = leerCadena(f);
color = leerCadena(f);
modelo = leerCadena(f);
tipoAM = leerCadena(f);
placa = leerCadena(f);
marca = leerCadena(f);

if(cod==codigo){
iCodigoBusqueda = codigo;
encontrado=true;
registroExistente = true;
break;
}else{
iCodigoBusqueda = 0;
registroExistente = false;
}
bytes += iTamanioRegistro;
f.seek(bytes);
}
while(bytes<f.length());

if(!encontrado){
registroExistente = false;
JOptionPane.showMessageDialog(null,"Archivo no encontrado");
}
f.close();
}

所以任何人都可以帮助我!这真的很棒我知道它有点长但是如果有人有解决这个问题的知识请分享,是的我尝试过.dat文件类型

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,我会尝试指出最明显的代码以及如何修复它们。

你说你的RandomAccessFile没有办法存储蜇,所以你要从你的String创建一个StringBuffer,从中创建一个String并存储它。您正在使用存储字符串的方法,不要首先创建StringBuffer。您还将StringBuffer的原始容量设置为30,并且似乎认为这意味着它总是30个字符。事实并非如此,只有在不调整自身大小的情况下才能存储30个字符。

这会在回读字符串时导致您的下一个问题。即使您的字符串不是30个字符,也总是读取30个字符。这会将数据输入到不属于它的字符串中。然后,您可以尝试通过用空格替换空字符来删除。

您要用于存储字符串的是

RandomAccessFile.writeUTF(theString)

这将存储字符串的长度及其字符。要再次阅读它,您应该使用

RandomAccessFile.readUTF()

如果您想使用writeChars,首先需要存储字符串的长度,以便在读取文件时知道要读回多少。

这是一个如何运作的简短例子

    RandomAccessFile f = new RandomAccessFile("theRandomeAccessFile", "rw");
    f.writeInt(1);
    f.writeDouble(2.34);
    f.writeUTF("SomeString");
    f.writeChar('C');
    f.seek(0);
    System.err.println(f.readInt());
    System.err.println(f.readDouble());
    System.err.println(f.readUTF());
    System.err.println(f.readChar());

答案 1 :(得分:0)

writeInt的{​​{1}},writeDouble等方法以二进制形式写出他们的参数。如果您想要文本文件,请使用RandomAccessFileFileWriter包装OutputStreamWriter,如果您想使用与默认平台编码不同的编码。同样,使用FileReader或包装FileInputStream的InputStreamReader来读取文本文件。

如果要存储和读取文本文件中的结构化数据,最好选择易于解析的格式,如XML或JSON,而不是实现自己的协议。

关于您的错误,您的代码太大而且无法调试它。如果您希望我们能够进行调试,请发布SSCCE。

阅读IO教程:http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html