Java 将数据写回二进制文件

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

我正在尝试将char、double和integer写回到基于字符串arraylist的二进制文件中。但是,在完成写入并再次读取二进制文件后,它会生成错误。任何人都可以帮忙,我真的很感激

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)