1

我正在尝试根据我的字符串数组列表将 char、double 和 integer 写回我的二进制文件。但是,在完成写入后,我再次读取二进制文件,它会产生错误。任何人都可以提供帮助,我真的很感激。

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();
         }
4

1 回答 1

2

这是一个非常简单的示例,它将向您展示如何顺序读取数据:

public void readFile(String absoluteFilePath){
    ByteBuffer buf = ByteBuffer.allocate(2+4+8) // creating a buffer that is suited for data you are reading
    Path path = Paths.get(absoluteFilePath);

    try(FileChannel fileChannel = (FileChannel)Files.newByteChannel(path,Enum.setOf(READ))){
        while(true){
            int bytesRead = fileChannel.read(buf);
            if(bytesRead==-1){
                break;
            }
            buf.flip(); //get the buffer ready for reading.
            char c = buf.asCharBuffer().readChar(); // create a view buffer and read char
            buf.position(buf.position() + 2); //now, lets go to the int
            int i = buf.asIntBuffer().readInt(); //read the int
            buf.position(buf.position()+ 4); //now, lets go for the double.
            double d = buf.asDoubleBuffer().readDouble();
            System.out.println("Character: " + c + " Integer: " + i + " Double: " + d);
            buf.clear();
        }
    }catch(IOException e){
        e.printStackTrace();
    }// AutoClosable so no need to explicitly close
}  

现在,假设您始终将数据作为 (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它是一个专用的读取通道,WritableByteChannel它是一个专用的写入通道,SeekableByteChannel它可以同时进行读取和写入,但有点复杂。

使用通道和 ByteBuffer 时,请注意阅读方式。没有什么可以阻止我将 14 个字节作为一组 7 个字符读取。虽然这看起来很吓人,但这让您可以完全灵活地读取和写入数据

于 2013-04-27T19:02:43.820 回答