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

在二进制文件中写入以字节为单位的字符串和整数,读取它们并在java中覆盖整数,java,file,inputstream,outputstream,randomaccessfile,Java,File,Inputstream,Outputstream,Randomaccessfile,我想用java写一个程序,我想用二进制文件来保存数据。这个程序将使用两种类型的数据-日期,这将是一个字符串和金额的钱,这将是双倍。我想: 将它们保存在同一文件中(首先,我要获取当前日期并将金额设置为0.00) 分别读取它们(并将它们的值放入变量中) 有能力覆盖,但只有两倍的金额(我希望日期保持不变) 在我将覆盖金额后,我想再次阅读它(但这次只翻了一倍) 我曾尝试创建文件、写入文件和读取文件(我正在检查其他方法中是否存在该文件,所以不要担心),但我遇到了多个问题 程序写入双字节,但字符串作为文

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

  • 将它们保存在同一文件中(首先,我要获取当前日期并将金额设置为0.00)
  • 分别读取它们(并将它们的值放入变量中)
  • 有能力覆盖,但只有两倍的金额(我希望日期保持不变)
  • 在我将覆盖金额后,我想再次阅读它(但这次只翻了一倍)
我曾尝试创建文件、写入文件和读取文件(我正在检查其他方法中是否存在该文件,所以不要担心),但我遇到了多个问题

  • 程序写入双字节,但字符串作为文本(而我需要 它们必须是二进制的)
  • 我写入或读取不正确的双精度值
  • 它无法正确读取字符串
  • 我试图在java文档和StackOverflow上寻找解决方案,我发现一个主题说,如果我想覆盖二进制文件的一部分,我应该使用RandoAccessFile。但我仍然非常缺乏经验,我不知道如何在实际代码中使用它。我不知道如何获得二进制中每个值的长度,然后必须正确设置accesspoint
  • 我使用了不推荐使用的方法,我的编译器仍然将其删除。我可能错了,但将来我想将这个java应用程序转换为android,所以我认为可以使用旧版本java的尽可能多的Metchod,因为android不接受最新版本(至少我被告知这一点。如果我错了,请纠正我)
  • 我还是很没经验。我一直在寻找解决方案,但就是找不到。因此,我想寻求你的智慧并寻求你的帮助。谢谢大家!

    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后立即抛出异常

    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");
        }
    
    String finaldate=“”;
    双倍金额=0.00;
    试一试{
    //使用文件名test创建一个新的RandomAccessFile
    RandomAccessFile sDataRAF=新的RandomAccessFile(“sData.bin”、“rws”);
    DataInputStream in=新的DataInputStream(新文件InputStream(“sData.bin”);
    对于(int c=0;c<10;c++){
    finaldate+=in.readChar();
    }
    System.out.println(finaldate.length());
    系统输出打印LN(最终日期);
    金额=in.readDouble();
    系统输出打印项次(金额);
    //双重覆盖
    sdaf.seek(10);
    sDataRAF.可写双(30.0);
    金额=in.readDouble();
    系统输出打印项次(金额);
    in.close();
    sDataRAF.close();
    }
    捕获(例外e){
    System.out.println(“出错”);
    }
    
    您正在使用
    writeChars
    编写字符串,并使用
    readLine
    读取字符串。如果我使用readLine读取字符串,我如何使它忽略这个双值,它将位于字符串后面的同一文件和行中?因为您对日期使用固定大小的格式,您知道此日期的字符串长度为10个字符,因此可以跳过这些字节:尝试使用skipBytes(10)而不是readLine()