【问题标题】:How do I read data from a binary file into an array with different file types in a field? Java如何将二进制文件中的数据读取到字段中具有不同文件类型的数组中?爪哇
【发布时间】:2016-04-03 06:17:55
【问题描述】:

我已经尝试了大约一百种不同的方法,但似乎都没有奏效。我正在尝试从输入数据的二进制文件中获取数据,并将其放入一个数组中,其中包含:String、Int、Int、Int、Double,全部存储到一个对象中。更具体地说,我的数组 toolArray[] 包含对象 ToolItem,它由 toolName、toolID、toolQuality、toolNumberInStock 和 toolPrice 组成。

我可以将数据写入二进制文件就好了,但是我无法将其取出并放回数组中,因为如果用户退出程序并想稍后再回来再次填充数组使用先前输入的数据(来自二进制顺序 .dat 文件)。

这就是我输入数据的方式:

try
     {           
        FileOutputStream fout = new FileOutputStream("myfile.dat");
        DataOutputStream out = new DataOutputStream(fout);

        System.out.println("Writing array into myfile");
        System.out.println(tools.toolArray[0].getName());
        System.out.println(tools.numberOfItems);

        for(int i=0; i<=tools.numberOfItems-1; i++)
        {
           System.out.println("Printing " + tools.toolArray[i].getName());
           out.writeUTF(tools.toolArray[i].getName());

           System.out.println("Printing " + tools.toolArray[i].getID());
           out.writeInt(tools.toolArray[i].getID());

           System.out.println("Printing " +          tools.toolArray[i].getQuality());
           out.writeInt(tools.toolArray[i].getQuality());

           System.out.println("Printing "+tools.toolArray[i].getNumberInStock());
           out.writeInt(tools.toolArray[i].getNumberInStock());

           System.out.println("Printing " + tools.toolArray[i].getPrice());
           out.writeDouble(tools.toolArray[i].getPrice());

        }

  System.out.println("Done");

  out.close();
  fout.close(); 
     }
    catch ( IOException ioe)
     {
        JOptionPane.showMessageDialog(this, ioe.toString(), "Error", JOptionPane.ERROR_MESSAGE);
        System.exit(1);
     }

这是我当前的 read() sn-p,它没有正确获取数据:

try{
        FileInputStream fin = new FileInputStream("myfile.dat");
        BufferedInputStream bin = new BufferedInputStream(fin);
        DataInputStream din = new DataInputStream(bin);            

        while(true)
       int x = 0;
       {

        System.out.println("Reading...");
           tools.toolArray[x].setName(din.readUTF());
           tools.toolArray[x].setID(din.readInt());
           tools.toolArray[x].setQuality(din.readInt());
           tools.toolArray[x].setNumberInStock(din.readInt());
           tools.toolArray[x].setPrice(din.readDouble());
         System.out.println(tools.toolArray[x].getName()+tools.toolArray[x].getID()+
         tools.toolArray[x].getQuality()+tools.toolArray[x].getNumberInStock()+tools.toolArray[x].getPrice());
     x++;
      }

     }
     catch(EOFException eofe)
     {
        System.out.println("File read");
     }
    catch ( IOException ioe)
     {
        JOptionPane.showMessageDialog(this, ioe.toString(), "Error, cannot read from file", JOptionPane.ERROR_MESSAGE);
        System.exit(1);
     } 

有什么想法吗?只是为了了解数据应该如何流动,它是: 打开程序 > 打开文件 > 从单独的 JFrame 窗口将数据放入数组 > 关闭文件 > 关闭程序 > 打开程序,新数组 > 用文件中的数据填充新数组 > 继续从上次离开的地方输入数据

【问题讨论】:

  • “遇到麻烦”不是问题描述。您的 I/O 代码一目了然。当然,您需要在循环之前初始化x,并在循环结束时将其递增。
  • 是的,我现在意识到我把它搞砸了,但是仍然没有解决它。代码没有正确读取或插入到数组中,就像它应该的那样。
  • 这也不是问题描述。再试一次。您会接受这是客户的问题报告吗?
  • 问题是当我关闭程序并用二进制文件中的先前数据重新填充数组时,它保持数字正确但工具名变为空。代码中的某些内容会阻止特定名称被读取,但只要我不关闭程序,整个过程就可以正常工作。
  • 'Becomes null' 与您在此处发布的任何其他内容一样,不再是问题描述,并且此代码中没有 toolName 变量。

标签: java arrays binaryfiles


【解决方案1】:

你需要在循环之前初始化x = 0,而不是在循环内部,并在循环底部增加它。

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多