在二进制文件中写入字符串和整数(以字节为单位),读取它们并在java中覆盖整数

时间:2015-01-06 01:38:09

标签: java file inputstream outputstream randomaccessfile

我想用java编写程序,我想用二进制文件来保存数据。该程序将使用两种类型的数据 - 日期,这将是一个字符串和金额将是两倍。我想:

  • 将它们保存在同一个文件中(首先我要获取当前日期并将金额设置为0.00)
  • 分别阅读它们(并将它们的值放入变量中)
  • 有能力覆盖,但只有两倍(我希望日期保持不变)
  • 在我将覆盖金额之后我想再次阅读(但这次只能翻倍)

我试图创建文件,写入并读取它(我正在检查其他方法中存在的文件,所以不要担心)并且我遇到了多个问题。

  1. 程序将double作为字节写入,但将字符串写为文本(我希望 它们是二进制的。)
  2. 我写或读不正确的双值。
  3. 它无法正确读取字符串。
  4. 我试图在java文档中找到一个解决方案,在这里我在StackOverflow上找到了一个主题,如果我想覆盖部分二进制文件,我应该使用RandoAccessFile。但我仍然非常缺乏经验,我无法找到如何在实际代码中使用它。我不知道如何获得二进制中每个值的legth,然后必须设置accesspoint correclty。
  5. 我使用过弃用的方法,我的编译器仍然将其删除。我可能错了,但将来我想将这个java应用程序转换为android,所以我认为从旧版本的java中使用尽可能多的metchods是可以的,因为android不接受最新版本(至少这是我被告知的)如果我错了请纠正我。)
  6. 我仍然非常缺乏经验。我一直在寻找解决方案,但我找不到它。所以我想寻求你的智慧,并请求你的帮助。谢谢!

    static final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
    static Date date = new Date();
    try{
            final Formatter filecreation = new Formatter("sData.bin");
            filecreation.close();
    
            DataOutputStream datafill = new DataOutputStream(new FileOutputStream("sData.bin"));
            datafill.writeChars(dateFormat.format(date));
            datafill.writeDouble(0.00);
    
            //Debug
            System.out.println("File created");
    
        }
        catch(Exception a) {
            JOptionPane.showMessageDialog(null, "File has not been created","Error", JOptionPane.WARNING_MESSAGE);
        }
    
    
    @SuppressWarnings("deprecation")
    static public void readfile () {
        String finaldate = "";
        Double amount = 0.00;
        try {
            DataInputStream in = new DataInputStream(new FileInputStream("sData.bin"));
    
            finaldate = in.readLine();
    
            while(in.available() > 0) {
    
                amount = in.readDouble();
            }
            System.out.println("You have spend" + amount);
            in.close();
        }
        catch (Exception e) {
            System.out.println("Something went wrong");
        }
    

    编辑:感谢您的信息,我终于设法正确地编写和阅读了所有内容。但我仍然没有设法覆盖二进制文件中的double值。现在它看起来像这样,并且在我尝试覆盖double之后总是不可避免地抛出异常

    String finaldate = "";
        Double amount = 0.00;
        try {
    
            // create a new RandomAccessFile with filename test
            RandomAccessFile sDataRAF = new RandomAccessFile("sData.bin", "rws");
    
            DataInputStream in = new DataInputStream(new FileInputStream("sData.bin"));
    
            for (int c = 0; c < 10; c++) {
                finaldate += in.readChar();
            }
    
            System.out.println(finaldate.length());
    
            System.out.println(finaldate);
            amount = in.readDouble();
            System.out.println(amount);
    
    
            //overwrite double
            sDataRAF.seek(10);
            sDataRAF.writeDouble(30.0);
    
            amount = in.readDouble();
            System.out.println(amount);
    
                        in.close();
            sDataRAF.close();
        }
        catch (Exception e) {
            System.out.println("Something went wrong");
        }
    

0 个答案:

没有答案