RandomAccessFile类的使用

RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件。

支持随机访问文件,可以访问文件的任意位置。

RandomAccessFile类实现步骤

(1)文件模型

第一步要知道,在硬盘上的文件时是以byte byte byte存储的,是数据的集合。

(2)打开文件

打开文件硬盘上的文件有两种模式:“rw”(读写),“r”(只读)。可以用RandomAccessFile类来指定打开文件的模式,如:

RandomAccessFile raf = new RandomAccessFile(file,"rw")

因为RandomAccessFile类是可以随机访问文件的任意位置的,其本质是因为RandomAccessFile类提供了一个文件指针。

文件指针,打开文件时指针在开头 pointer = 0;

(3)基本写方法

RandomAccessFile类里提供了一个基本的写方法write(),下面是一个写入整形int的例子:

raf.write(int)--->只写一个字节(后8位),同时指针指向下一个位置,准备再次写入

注意:write()方法对于字节以外的类型一次只能写入一个字节的大小,比如要完整写入一个int类型,则要使用4次write()方法。但是可以直接写入一个字节数组,如write(byte[])。

(4)基本读方法

RandomAccessFile类里提供了一个基本的读方法read(),用法和write()相同:

int b = raf.read()--->只读一个字节

(5)关闭流

文件读写完成以后一定要关闭流(Oracle官方说明),如果不关闭可能会产生意想不到的异常!

RandomAccessFile 类的使用案例

上面介绍了基本的RandomAccessFile类使用步骤,接下来我写一个案例来实现一下这些步骤吧。

1.首先在项目下创建测试目录和文件

1 File demo= new File("demo");
2         if(!demo.exists()){
3             demo.mkdirs();
4         }
5         File file=new File(demo,"raf.txt");
6         if(!file.exists()){
7             file.createNewFile();
8         }

2.初始化RandomAccessFile类,打开刚刚创建的文件,查看文件指针的位置

1 RandomAccessFile raf=new RandomAccessFile(file, "rw");
2         //指针的位置
3         System.out.println(raf.getFilePointer());

3.使用RandomAccessFile类写入int类型变量

1 int i=0x7fffffff;//最大的整数
2         //用write方法每次只能写一个字节,如果把i写进去就得写4次
3         raf.write(i>>>24);//高8位
4         raf.write(i>>>16);
5         raf.write(i>>>8);
6         raf.write(i);
7         //也可以直接用writeInt()方法,直接写入,此方法原理同上
8         raf.writeInt(i);

其中writeInt()方法的原理也是使用write()方法完成的,和我写的write()方法异曲同工:

4.使用RandomAccessFile类写入String字符串

定义一个字符串s

String s="中文";

1)先将字符串转为字节数组,再将此数组写入

1 byte[] gbk=s.getBytes("utf-16be");
2 raf.write(gbk);

注意:这里的编码格式要按utf-16be,因为java 的内部编码格式就是这个,否则等下读出时会乱码。更多关于编码问题请阅读我另一篇文章《计算机中的编码问题》

2)使用writeChars()方法

raf.writeChars(s);

原理:writeChars()是调用writeChar()方法将字符串s的一个个字符写入文件,而writeChar()的内容代码如下(本质都是利用write()方法将一个个字节写入):

5.使用RandomAccessFile类读出文件内容

 1         //读操作,必须把指针移到头部
 2         raf.seek(0);
 3         //一次性读取
 4         byte[] buf=new byte[(int)raf.length()];
 5         raf.read(buf);
 6         System.out.println(Arrays.toString(buf));//打印出字节数组
 7         //将字节数组转为字符串
 8         String s1=new String(buf,"utf-16be");
 9
10         System.out.println(s1);

运行结果:

前面的乱码是写入的int类型,因为读出时是字符串的编码格式,所以int型就无法识别。如果要读出int型,就得使用readInt()方法读出int型变量。此外,RandomAccessFile类还提供了读出和写入各种类型的方法,使用方法类似,这里就不再阐述了,有兴趣的朋友可以自行尝试。

注意:

  • 如果要从文件头开始读,必须把指针移到头部,seek()把指针指定到某一位置;
  • read(byte[] )可以把读到的字节都传入到该字节数组中去;
  • 将字节数组转为字符串时,主要字符串的编码格式要与写入字节时的编码格式相同,否则出现乱码。
  • 每次写入和读出时,文件指针的位置都会发生变化,请根据需要使用指针的位置。

6.关闭RandomAccessFile类

使用完RandomAccessFile类一定不要忘记关闭流,非常重要,要养成好习惯!!

//最后必须关闭
raf.close();


题外话:我在文中提到了一个有趣的int,那就是在java中最大的int类型。为什么0x7ffffff代表最大的int值呢?

解惑:

每位十六进制数占4bit,因此8位十六进制等于32bit(即4个字节),刚好是一个int整型。

F的二进制码为 1111

7的二进制码为 0111

这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1。就是说,这是最大的整型数 int(因为第一位是符号位,0 表示它是正数)。

转载于:https://www.cnblogs.com/hysum/p/7223357.html

【Java IO流】RandomAccessFile类的使用相关推荐

  1. Java IO流-File类

    2017-10-24 23:50:22 File类 File类:文件和目录路径名的抽象表示形式.该文件或者目录不一定真实存在. * 构造方法 File类有四种构造方法,主要采用的构造方法师第二种,也就 ...

  2. Java IO流大闯关--IO流的常用实现类

    这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...

  3. Java常用工具类(六):文件、资源、IO流工具类

    1. 文件工具类 1.1 FileCopyUtils 输入 // 从文件中读入到字节数组中 byte[] copyToByteArray(File in) // 从输入流中读入到字节数组中 byte[ ...

  4. java io 流选择题_java Io流面试题和选择题

    Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象.下面就由学习啦小编为大家介绍一下java Io流面试题和选择题的文章,欢迎阅读. ja ...

  5. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  6. Java IO: 流

    转载自  Java IO: 流 原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流. ...

  7. java IO流小结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. Java基础17:Java IO流总结

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/80201802 这位大侠,这是我的公众号:程序员江湖 ...

  9. java IO流详解及特性

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  10. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流

    一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...

最新文章

  1. IOS设计模式第六篇之适配器设计模式
  2. jsp网上商城jsp课程设计
  3. python语言打印菱形_Python打印菱形
  4. 有关Java 锁原理
  5. (转)Struts2访问Servlet的API及......
  6. 一主多备几影响 oracle,Oracle 10g 一主多备的搭建技巧
  7. scala集合day03
  8. java中路由的使用方法_java – 在camel路由中使用方法作为生产者
  9. 服务器模型---总结
  10. 压测工具ab的安装(mac环境)
  11. 最新中国大陆行政区域划分
  12. EXCEL使用技巧大全:输入的技巧
  13. (原创)二十一天定律
  14. linux c语言内存管理,C程序内存管理 第2页_Linux编程_Linux公社-Linux系统门户网站...
  15. 告别360全家桶,安利一波电脑必备软件
  16. 安卓开发用什么语言?一次违反常规的安卓大厂面试经历,含BATJM大厂
  17. OpenMP: sections分段并行
  18. emoji java_java 处理emoji表情信息转换为String
  19. C语言 | 文件打开关闭
  20. Springcloud个人总结

热门文章

  1. 重磅推荐:2017 年最流行的 15 个数据科学 Python 库
  2. 终于,J 神还是加入了 Google!
  3. linux usb摄像头 监控软件,Linux下的motion detection(最简单的办公室监控系统)
  4. pbewithmd5anddes算法 对应.net_「AI」目标检测第一话:R-CNN和SPP-Net
  5. Kubernetes安装部署
  6. win10使用navicat管理数据库
  7. 浅谈最近公共祖先(LCA)
  8. linux ssh远程无密码登陆无效
  9. 读Zepto源码之Callbacks模块
  10. 截取 %# Eval(val) %中的字符