RandomAccessFile java格式错误的输入

RandomAccessFile java格式错误的输入,java,input,randomaccessfile,malformed,Java,Input,Randomaccessfile,Malformed,我正在处理二进制文件,我正在尝试从中写入和读取,我有以下两个功能: public static void ListToBin (List<ModelVehicle> llModVeh,List<Vehicle> llVeh,String NomFitxerXml){ try { File ff = new File("pruebas.bin"); RandomAccessFile raf = new Ran

我正在处理二进制文件,我正在尝试从中写入和读取,我有以下两个功能:

 public static void ListToBin (List<ModelVehicle> llModVeh,List<Vehicle> llVeh,String NomFitxerXml){


         try {
             File ff = new File("pruebas.bin");
        RandomAccessFile raf = new RandomAccessFile(ff, "rw");
        int q = llModVeh.size();
        raf.writeInt(q);
        for (int i = 0; i < q; i++) {
            for(ModelVehicle m : llModVeh){
                raf.writeChars(m.getNom() );
                raf.writeChars(m.getMarca());
                raf.writeShort(m.getCilindrada());
            }
        }
        raf.close();
    } catch (FileNotFoundException ex) {

    } catch (IOException ex) {

    }
 } 
publicstaticvoidlisttobin(List llModVeh,List llVeh,stringnomfitxerxml){
试一试{
文件ff=新文件(“pruebas.bin”);
RandomAccessFile raf=新的RandomAccessFile(ff,“rw”);
int q=llModVeh.size();
raf.书面材料(q);
对于(int i=0;i
以及:

publicstaticvoidbintolist(列表llModVeh、列表llVeh、字符串NomFitxerXml){
试一试{
llModVeh=新的ArrayList();
文件ff=新文件(“pruebas.bin”);
RandomAccessFile raf=新的RandomAccessFile(ff,“r”);
int q=raf.readInt();
if(q<0){
抛出新的运行时异常(“Fitxer corrupt”);
}
对于(int i=0;i
当我使用函数ListToBin编写时,一切正常,但当我调用函数BinToList时,我不断得到错误:

java.io.UTFDataFormatException:字节41周围的输入格式错误

位于java.io.DataInputStream.readUTF(DataInputStream.java:634) java.io.RandomAccessFile.readUTF(RandomAccessFile.java:965)位于 info.infomila.Utils.BinToList(Utils.java:299)位于 info.infomila.Prova.main(Prova.java:84)


getMarca和getNom返回一个字符串,getCilindrada是一个短字符串

您正在使用
writeChars()
进行写入,它为每个字符写入2个字节。但是您可以使用
readUTF()
进行读取,它可以为每个字符读取1个或更多字节(取决于字符)


可以使用
writeChars()
readChars()
,也可以使用
writeUTF()
readUTF()
您正在使用的
writeChars()
为每个字符写入2个字节。但是您可以使用
readUTF()
进行读取,它可以为每个字符读取1个或更多字节(取决于字符)


可以使用
writeChars()
readChars()
,或者
writeUTF()
readUTF()
,对已经给出的答案进行添加:在ListToBin函数中,您可以经常编写整个列表,因为字符串很长,因为您有一个带有列表大小的for循环,每个循环中都有一个for循环。它不会引起问题,但仍然是对已经给出的答案的不必要的补充:在ListToBin函数中,您编写整个列表的频率与字符串的长度一样高,因为您得到了一个具有列表大小的for循环和其中每个循环的另一个for循环。它不会引起问题,但仍然是不必要的
 public static void BinToList(List<ModelVehicle> llModVeh,List<Vehicle> llVeh,String NomFitxerXml){
     try {
         llModVeh =new ArrayList();
         File ff = new File("pruebas.bin");
         RandomAccessFile raf = new RandomAccessFile(ff, "r");
         int q = raf.readInt();
         if (q < 0) {
             throw new RuntimeException("Fitxer corrupte");
         }
         for (int i = 0; i < q; i++) {
             String nom = raf.readUTF();
             String marca = raf.readUTF();
             Short cilindrada = raf.readShort();


         }
         raf.close();
     } catch (FileNotFoundException ex) {
         Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
     } catch (IOException ex) {
         Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
     }


 }