您的位置:首页 > 博客中心 > 数据库 >

IO_RandomAccessFile

时间:2022-03-16 11:29

RandomAccessFile类不属于流,是Object类的子类
RandomAccess支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
已有文件作为RandomAccessFile打开的时候,这个文件并不会被删除。技术分享图片

read方法只读流中的数据,字节数据在网络中传输,数据可能刚到接收端(存储在TCP接收缓冲区)的可能只是其中一部分数据,其他还在路上或还没发,read读到就走,接收到的可能只是数据的一部分。readFully方法会阻塞等待,知道数据缓冲区装满。不过如果不是确定要用特定长度的数据,还是用read方法去读取。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileJava {
    public static void main(String[] args) throws IOException {
        //创建文件
        String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
        File f = new File(strFile);
        try(RandomAccessFile raf = new RandomAccessFile(f, "rw");) 
        {
            //byte[] b = "写入数据...".getBytes();
            //raf.write(b);
            //boolean b = true;
            //直接打开文件看到的是乱码
            //raf.writeBoolean(b);
            //String s = "写入数据...";
            //raf.writeUTF(s);
            //System.out.println(raf.readUTF());
            //readLine()方法读到的数据是ISO-8859-1,如果有中文会显示乱码,需要进行转码
            
            //下面这样很可能读到的数据控制台输出的时候会产生漏行,因为readLine()每次读取一行,在while()条件中读取了一次,这里是不会输出的
            //只有println方法中的println才会输出
            while(raf.readLine() != null) {
                System.out.println(new String(raf.readLine().getBytes("ISO-8859-1"),"utf-8"));
            }
            
            //所以要改为
            String ss = null;
            while((ss = raf.readLine()) != null) {
                System.out.println(new String(ss.getBytes("ISO-8859-1"),"utf-8"));
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

本类排行

今日推荐

热门手游