【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 表示它是正数)。

时间: 2024-10-18 08:58:06

【Java IO流】RandomAccessFile类的使用的相关文章

Java—IO流 RandomAccessFile类

RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. java文件模型,在硬盘上的文件是byte byte byte存储的,是数据的集合 打开文件,有两种模式,"rw"读写."r"只读:RandomAccessFile raf = new RandomAccessFile(file, "rw");,文件指针,打开文件时指针在开头 point = 0; 写方法,

Java—IO流 File类的常用API

File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOException; public class Demo16 { public static void main(String[] args) { File file = new File("F:\\javaio"); //文件(目录)是否存在 if(!file.exists()) { //

Java IO流详解(二)——File类

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

Java IO流学习总结

Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区

Java IO流学习总结(转)

原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.   IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符

Java IO流详尽解析(转自 http://www.2cto.com/kf/201312/262036.html)

流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表.字节流和字符流的区别

黑马程序员-Java IO流

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概述 Java中与IO相关的类有很多,都集中在java.io中,都是以流的形式操作的,流是有一定的顺序,像一个管道一样,它的本质是传输数据.根据数据类型的不同可以分为字节流和字符流,根据流向的不同可以分为输入流和输出流. 字符流:因为数据有不同的编码,可以对字符进行不同的操作,其本质还是基于字节流,然后再查询相应的码表.一般用于处理纯文本数据. 字节流:可以处理所有类型数据,二进制文件(图片,音频等). 输入

学习笔记-java IO流总结 转载

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

JAVA IO 流的总结

来自http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html,写的很详细 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.   IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 [字符流和字节