【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.首先在项目下创建测试目录和文件
File demo= new File("demo");
if(!demo.exists()){
demo.mkdirs();
}
File file=new File(demo,"raf.txt");
if(!file.exists()){
file.createNewFile();
}

2.初始化RandomAccessFile类,打开刚刚创建的文件,查看文件指针的位置
RandomAccessFile raf=new RandomAccessFile(file, "rw");
//指针的位置
System.out.println(raf.getFilePointer());
3.使用RandomAccessFile类写入int类型变量
int i=0x7fffffff;//最大的整数
//用write方法每次只能写一个字节,如果把i写进去就得写4次
raf.write(i>>>24);//高8位
raf.write(i>>>16);
raf.write(i>>>8);
raf.write(i);
//也可以直接用writeInt()方法,直接写入,此方法原理同上
raf.writeInt(i);
其中writeInt()方法的原理也是使用write()方法完成的,和我写的write()方法异曲同工:

4.使用RandomAccessFile类写入String字符串
定义一个字符串s
String s="中文";
1)先将字符串转为字节数组,再将此数组写入
byte[] gbk=s.getBytes("utf-16be");
raf.write(gbk);
注意:这里的编码格式要按utf-16be,因为java 的内部编码格式就是这个,否则等下读出时会乱码。更多关于编码问题请阅读我另一篇文章《计算机中的编码问题》
2)使用writeChars()方法
raf.writeChars(s);
原理:writeChars()是调用writeChar()方法将字符串s的一个个字符写入文件,而writeChar()的内容代码如下(本质都是利用write()方法将一个个字节写入):

5.使用RandomAccessFile类读出文件内容
//读操作,必须把指针移到头部
raf.seek(0);
//一次性读取
byte[] buf=new byte[(int)raf.length()];
raf.read(buf);
System.out.println(Arrays.toString(buf));//打印出字节数组
//将字节数组转为字符串
String s1=new String(buf,"utf-16be"); 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 表示它是正数)。
【Java IO流】RandomAccessFile类的使用的更多相关文章
- Java—IO流 RandomAccessFile类
RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. java文件模型,在硬盘上的文件是byte byte byt ...
- Java—IO流 File类的常用API
File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOE ...
- JAVA:IO流——File类
1.掌握File 类的作用 2.可以使用File 类中的方法对文件进行操作 所有的 io 操作都保存在 java.io 包中. 构造方法:public File (String pathname) 直 ...
- Java IO流-File类
2017-10-24 23:50:22 File类 File类:文件和目录路径名的抽象表示形式.该文件或者目录不一定真实存在. * 构造方法 File类有四种构造方法,主要采用的构造方法师第二种,也就 ...
- java ->IO流_File类
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
- java ->IO流_commons类
commons-IO 导入classpath 加入classpath的第三方jar包内的class文件才能在项目中使用 1.创建lib文件夹 2.将commons-io.jar拷贝到lib文件夹 3. ...
- Java IO流-File类的使用示例-创建文件夹和文件的正确方法
当创建一个文件时,比如:E:\\test\\test.txt,此时若文件夹test不存在,那么直接创建文件会出错,故首先要判断文件夹是否存在,不存在的话要首先创建文件夹. public class F ...
- Java学习笔记33(IO:打印流,IO流工具类)
打印流: 有两个类:PrintStream PrintWriter类,两个类的方法一样,构造方法不一样 PrintStream构造方法:接收File类型,接收字符串文件名,接收字节输出流(Ou ...
- java IO流的继承体系和装饰类应用
java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对应的装饰类. 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的 ...
- Java常用工具类之IO流工具类
package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * ...
随机推荐
- 网络数据传输安全及SSH与HTTPS工作原理
本节内容 网络数据传输安全概述 数据加密算法分类 SSH工作原理 HTTPS工作原理 参考资料 个人一直在努力推动git在公司内部的普及和使用,前些日子在公司内部做了一次分享课,给大家介绍了下项目发布 ...
- 利用angular控制元素的显示和隐藏
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- caffe源码学习之Proto数据格式【1】
前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下 ...
- java IO文件操作简单基础入门例子,IO流其实没那么难
IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...
- 不再迷惑,无值和NULL值的转换
在关系型数据库的世界中,无值和NULL值的区别是什么?一直被这个问题困扰着,甚至在写TSQL脚本时,心有戚戚焉,害怕因为自己的一知半解,挖了坑,贻害后来人,于是,本着上下求索,不达通幽不罢休的决心(开 ...
- POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)
题目描述 给定A,B,求A^B的所有因数的和,再MOD 9901 输入 一行两个整数 A 和 B. 输出 一行,一个整数 样例输入 2 3 样例输出 15 提示 对于100%的数据满足:0 <= ...
- rest api get 查询接口 多个参数
查询时,使用get,传递参数至服务器. angular js中,$http可以直接传递object,在get中,params:data 在服务端, query(x=x,y=y)可写成 query(** ...
- Cordova各个插件使用介绍系列(三)—$cordovaImagePicker从手机图库选择多张图片
详情链接地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/cordova-3-cordovaimagepicker/ 这是能从手 ...
- Kafka官方文档翻译——简介
简介 Kafka擅长于做什么? 它被用于两大类应用: 在应用间构建实时的数据流通道 构建传输或处理数据流的实时流式应用 几个概念: Kafka以集群模式运行在1或多台服务器上 Kafka以topics ...
- 统计dir_path下所有文件类型的文件数量
#!/bin/bash #!文件名为countfile.sh ]; then echo "Usage is $0 basepath"; exit fi path=$ declare ...