【Java IO流】RandomAccessFile类的使用
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类的使用相关推荐
- Java IO流-File类
2017-10-24 23:50:22 File类 File类:文件和目录路径名的抽象表示形式.该文件或者目录不一定真实存在. * 构造方法 File类有四种构造方法,主要采用的构造方法师第二种,也就 ...
- Java IO流大闯关--IO流的常用实现类
这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...
- Java常用工具类(六):文件、资源、IO流工具类
1. 文件工具类 1.1 FileCopyUtils 输入 // 从文件中读入到字节数组中 byte[] copyToByteArray(File in) // 从输入流中读入到字节数组中 byte[ ...
- java io 流选择题_java Io流面试题和选择题
Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象.下面就由学习啦小编为大家介绍一下java Io流面试题和选择题的文章,欢迎阅读. ja ...
- java io流 教程_Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...
- Java IO: 流
转载自 Java IO: 流 原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流. ...
- java IO流小结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java基础17:Java IO流总结
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/80201802 这位大侠,这是我的公众号:程序员江湖 ...
- java IO流详解及特性
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流
一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...
最新文章
- IOS设计模式第六篇之适配器设计模式
- jsp网上商城jsp课程设计
- python语言打印菱形_Python打印菱形
- 有关Java 锁原理
- (转)Struts2访问Servlet的API及......
- 一主多备几影响 oracle,Oracle 10g 一主多备的搭建技巧
- scala集合day03
- java中路由的使用方法_java – 在camel路由中使用方法作为生产者
- 服务器模型---总结
- 压测工具ab的安装(mac环境)
- 最新中国大陆行政区域划分
- EXCEL使用技巧大全:输入的技巧
- (原创)二十一天定律
- linux c语言内存管理,C程序内存管理 第2页_Linux编程_Linux公社-Linux系统门户网站...
- 告别360全家桶,安利一波电脑必备软件
- 安卓开发用什么语言?一次违反常规的安卓大厂面试经历,含BATJM大厂
- OpenMP: sections分段并行
- emoji java_java 处理emoji表情信息转换为String
- C语言 | 文件打开关闭
- Springcloud个人总结
热门文章
- 重磅推荐:2017 年最流行的 15 个数据科学 Python 库
- 终于,J 神还是加入了 Google!
- linux usb摄像头 监控软件,Linux下的motion detection(最简单的办公室监控系统)
- pbewithmd5anddes算法 对应.net_「AI」目标检测第一话:R-CNN和SPP-Net
- Kubernetes安装部署
- win10使用navicat管理数据库
- 浅谈最近公共祖先(LCA)
- linux ssh远程无密码登陆无效
- 读Zepto源码之Callbacks模块
- 截取 %# Eval(val) %中的字符