Java 将数据写回二进制文件
我正在尝试将char、double和integer写回到基于字符串arraylist的二进制文件中。但是,在完成写入并再次读取二进制文件后,它会生成错误。任何人都可以帮忙,我真的很感激Java 将数据写回二进制文件,java,Java,我正在尝试将char、double和integer写回到基于字符串arraylist的二进制文件中。但是,在完成写入并再次读取二进制文件后,它会生成错误。任何人都可以帮忙,我真的很感激 ArrayList<String>temp = new ArrayList<String>(); for(int i = 0;i<temp.size();i++){ String decimalPattern = "([0-9]*)\\.([0
ArrayList<String>temp = new ArrayList<String>();
for(int i = 0;i<temp.size();i++){
String decimalPattern = "([0-9]*)\\.([0-9]*)";
boolean match = Pattern.matches(decimalPattern, temp.get(i));
if(Character.isLetter(temp.get(i).charAt(0))){
os.writeChar(temp.get(i).charAt(0));
}
else if(match == true){
Double d = Double.parseDouble(temp.get(i));
os.writeDouble(d);
}
else
{
int in = Integer.parseInt(temp.get(i));
os.writeInt(in);
}
}
os.close();
}
ArrayListtemp=new ArrayList();
对于(int i=0;i这是一个非常简单的示例,它将向您展示如何按顺序读取数据:
现在,假设您总是以(char,int,double)的形式将数据写入文件,并且您的数据不会以(char,int)/(char,double)的形式出现无序或不完整的情况,您可以通过指定文件中的位置来随机读取数据,该位置以字节为单位,从何处获取数据:
channel.read(byteBuffer,position);
在您的情况下,数据的大小始终为14字节,即2+4+8,因此所有读取位置都是14的倍数
First block at: 0 * 14 = 0
Second block at: 1 * 14 = 14
Third block at: 2 * 14 = 28
等等
与阅读类似,您也可以使用
channel.write(byteBuffer,position)
同样,位置将是14的倍数
这适用于FileChannel
的情况,它是ReadableByteChannel
的一个超级类,是一个用于读取的专用通道,writeablebytechannel
是一个用于写入的专用通道,seekablebytechnel
可以执行读取和写入,但稍微复杂一点
在使用通道和ByteBuffer时,请注意如何读取。没有任何东西可以阻止我将14个字节作为一组7个字符读取。虽然这看起来很可怕,但这使您可以完全灵活地读取和写入数据哪些错误?您能告诉我们您如何读取文件吗?您遇到了哪些错误?问题是您在在二进制文件中随机写入char
、double
和int
,因此在读取时您不知道如何读取,即我必须首先读取char
、double
或int
?如果您想进行随机读写,可以使用Channel
。FileChannel
或de>SeekableByteChannel
就可以了。不过,我推荐FileChannel
,因为这要简单得多。@LittleChild您可以写一个答案,说明Channel
的用法来解决这个问题。很抱歉,我忘了提到这一点,char、double和int的顺序必须基于a txt文件。如果txt文件是char double和int。然后,当您将数据写回二进制文件时,它也应该是char double int char double int…(单独一行)以此类推。它是二进制的,所以单独的一行将不可见。当你读回数据时,它取决于你以你想要的方式表示它。如果txt文件中有任何顺序的数据,那么它必须有某种方法来标识你下一步要读取的数据。当你使用channel编写时,可能有一个代码来标识下一步要读取的数据s、 您将创建一个.bin文件,而不是txt文件。
channel.write(byteBuffer,position)