【问题标题】:RandomAccessFile java malformed inputRandomAccessFile java格式错误的输入
【发布时间】:2017-03-26 17:53:49
【问题描述】:

我正在处理二进制文件,我正在尝试读写它们,我有这两个功能:

 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) {

    }
 } 

和:

 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);
     }


 }

当我使用函数 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 是一个短的!

【问题讨论】:

  • 对已经给出的答案的补充:在 ListToBin 函数中,您经常编写 整个 列表,因为字符串很长,因为您有一个带有列表的 for 循环size 和其中的另一个 for-each 循环。它不会导致问题,但仍然是不必要的

标签: java input randomaccessfile malformed


【解决方案1】:

您正在使用writeChars() 编写每个字符恰好写入 2 个字节。但是您使用 readUTF() 阅读,每个字符读取 1 个或更多字节(取决于字符)。

要么使用writeChars()readChars(),要么使用writeUTF()readUTF()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多