Почему я получаю эти символы, когда я пытаюсь сохранить данные в текстовом формате (Java) - PullRequest
0 голосов
/ 04 декабря 2011

Прежде чем вы думаете, что это слишком долго, пожалуйста, попробуйте мне помочь, я был над этим вопросом весь день (9:52 AM - 4:54 PM), это просто меня беспокоит.

Кажется, я не могу правильно сохранить эти данные. У меня есть в основном дубликаты и строки, я сохраняю их в файле .txt с именем "autosAudi.txt", я получаю эти странные коды и блоки, а иногда и по какой-то причине китайский язык в моемтекстовые поля?Вот пример того, что появляется:

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

, поскольку вы можете видеть, что эти странные поля нигде не появляются. Я ничего подобного не регистрировал, способ навигации по данным заключается в нажатии>> (next) или << (previous) и информация должна измениться, текстовое поле рядом с «Numero» должно дать мне возможность ввести int-код, чтобы я мог искать данные (например, если я пишу1, его должен найти этот реестр).он работает только для числа 1 и после этого выдает эту ошибку: </p>

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» - мой

Вот еще одна вещь: метод поиска типа long:

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 ]

1 голос
/ 04 декабря 2011

В вашем коде есть несколько ошибок, и я постараюсь указать на наиболее очевидные из них и на то, как их исправить.

Вы говорите, что в вашем RandomAccessFile нет способа хранить строки, поэтому вместо этоговы создаете StringBuffer из вашей String, создаете 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());
0 голосов
/ 04 декабря 2011

Методы RandomAccessFile writeInt, writeDouble и т. Д. Записывают свои аргументы в двоичной форме.Если вам нужен текстовый файл, используйте FileWriter или OutputStreamWriter, заключив в FileOutputStream, если вы хотите использовать кодировку, отличную от кодировки платформы по умолчанию.Аналогично, используйте FileReader или InputStreamReader, обертывающий FileInputStream, для чтения текстового файла.

Если вы хотите хранить и читать структурированные данные из текстового файла, вам лучше выбрать легко разбираемый формат, такой как XML или JSON.вместо реализации собственного протокола.

Что касается имеющейся ошибки, ваш код слишком велик и сложен для его отладки.Опубликуйте SSCCE, если вы хотите, чтобы мы могли отлаживать.

Прочтите руководство по IO: http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

...