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