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

为什么我在尝试用txt(java)保存数据时会得到这些符号,java,swing,file,save,Java,Swing,File,Save,在你认为这会持续很久之前,请帮我解决这个问题。我整天都在讨论这个问题,上午9:52到下午4:54,这让我很烦 我似乎无法正确保存这些数据我主要有双精度和字符串,我将它们保存在一个名为autosadi.txt的.txt文件中,我得到这些奇怪的代码和框,有时出于某种原因,我的文本字段中有中文?下面是出现的示例: 正如你所看到的,这些奇怪的框出现在任何地方,我没有注册任何类似的东西,我在数据中导航的方式是单击>>下一步或writeInt、writeDouble等。RandomAccessFile的方法

在你认为这会持续很久之前,请帮我解决这个问题。我整天都在讨论这个问题,上午9:52到下午4:54,这让我很烦

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

正如你所看到的,这些奇怪的框出现在任何地方,我没有注册任何类似的东西,我在数据中导航的方式是单击>>下一步或writeInt、writeDouble等。RandomAccessFile的方法以二进制形式写入参数。如果要使用文本文件,请使用FileWriter,如果要使用不同于默认平台编码的编码,请使用OutputStreamWriter包装FileOutputStream。类似地,使用FileReader或封装FileInputStream的InputStreamReader来读取文本文件

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

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


阅读IO教程:

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

您说您的RandomAccessFile没有存储stings的方法,所以您可以从字符串创建一个StringBuffer,从中创建一个字符串并存储它。如果您使用的是存储字符串的方法,请不要首先创建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.@CesarDowns您是否尝试过我更新答案的示例代码?这对你有用吗?
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());
}
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',' ');
}
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();
}
RandomAccessFile.writeUTF(theString)
RandomAccessFile.readUTF()
    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());