当我尝试将数据保存在 txt (java) 中时,为啥我会得到这些符号

Posted

技术标签:

【中文标题】当我尝试将数据保存在 txt (java) 中时,为啥我会得到这些符号【英文标题】:Why do I get these symbols when im trying to save data in txt (java)当我尝试将数据保存在 txt (java) 中时,为什么我会得到这些符号 【发布时间】:2011-12-03 23:33:56 【问题描述】:

在您认为这很长之前,请尝试帮助我解决这个问题,我整天(上午 9 点 52 分 - 下午 4 点 54 分)一直在处理这个问题,它只是在困扰我。

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

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

你可以看到这些奇怪的框出现在任何地方,我没有注册任何类似的东西,我浏览数据的方式是单击 >>(下一个)或

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 文件类型

【问题讨论】:

您为什么在没有首先回复您今天开始的活跃和类似的先前问题的情况下发布此内容?问题已经得到解答。如果答案让您感到困惑,请在您之前的问题中发表评论并澄清您之前的问题。 -1. 【参考方案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());

【讨论】:

@CesarDowns 您是否尝试过我更新答案的示例代码?这对你有用吗?【参考方案2】:

RandomAccessFilewriteIntwriteDouble 等方法将它们的参数写成二进制形式。如果您想要一个文本文件,请使用FileWriter,或者如果您想使用与默认平台编码不同的编码,请使用包装FileOutputStreamOutputStreamWriter。同样,使用 FileReader 或包装 FileInputStream 的 InputStreamReader 来读取文本文件。

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

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

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

【讨论】:

以上是关于当我尝试将数据保存在 txt (java) 中时,为啥我会得到这些符号的主要内容,如果未能解决你的问题,请参考以下文章

使用 numpy numpy 将矩阵保存在 txt 文件中时出错

当我没有将模型保存在内存中时,如何使用 gcforest 模型进行预测?

当我将数据保存在文本文件中时,末尾有一条多余的行,它是啥(C#)?

当我将 .txt 文件加载到我的程序中时,如何删除这些随机整数(我根本没有输入)

c#如何始终将数据保存在第一行区域的txt文件中?

(Django)当我尝试将夹具文件加载到我的数据库中时,我不断收到字段冲突错误