review28
前面介绍了指向文件的输入流和输出流。随机流是既能读文件也能写文件。
RandomAccessFile类创建的流称做随机流,与前面的输入、输出流不同的是,RandomAccessFile类既不是InputStream类的子类,也不是OutputStream类的子类。但是RandomAccessFile类创建的流既可以作为流的源,也可以作为流的目的地,换句话说,当准备对一个文件进行读写操作时,创建一个指向该文件的随机流即可,这样既可以从这个流中读取文件中的数据,也可以通过这个流写入数据到文件。
以下是RandomAccessFile类的两个构造方法。
RandomAccessFile(String name, String mode)参数name用来确定一个文件名,给出创建的流的源,也是流目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。
RandomAccessFile(File file, String mode)参数file是一个File对象,给出创建的流的源,也是流的目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权利。
RandomAccessFile流指向文件时,不刷新文件。
RandomAccessFile类中有一个方法seek(long a)用来定位RandomAccessFile流的读写位置,其中参数a确定读写位置距离文件开头的字节个数。
另外流还可以调用getFilePointer()方法获取流的当前位置。RandomAccessFile流对文件的读写比顺序读写更为灵活。
代码展示如下所示:
import java.io.IOException;
import java.io.RandomAccessFile; public class Test10 { public static void main(String[] args) {
// TODO Auto-generated method stub
RandomAccessFile inAndOut = null;
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; try {
inAndOut = new RandomAccessFile("E:/test/test03.txt", "rw");
for(int i = 0; i < data.length; i++)
{
inAndOut.writeInt(data[i]);//这是作为输出流
}
for(long i = data.length - 1; i >= 0; i--)
{
inAndOut.seek(i * 4);
System.out.printf(" %d", inAndOut.readInt());//这是作为输入流
}
inAndOut.close();
}
catch (IOException e)
{ } } }
程序运行后,在test03.txt文件中将会写入10个整数,然后并在控制台输出这10个整数。截图如下所示:

需要注意的是,RandomAccessFile流的readLine()方法在读取含有非ASCII字符的文件时(比如含有汉字的文件)会出现“乱码”现象,因此,需要把readLine()读取的字符串用“iso-8859-1”编码重新编码存放到byte数组中,然后再用当前机器的默认编码将该数组转化为字符串。
import java.io.IOException;
import java.io.RandomAccessFile; public class Test11 { public static void main(String[] args) {
// TODO Auto-generated method stub
RandomAccessFile in = null;
try{
in = new RandomAccessFile("E:/test/test01.txt", "rw");
long length = in.length();
long position = 0;
in.seek(position);
while(position < length)
{
String str = in.readLine();
byte b[] = str.getBytes("iso-8859-1");
str = new String(b);
position = in.getFilePointer();
System.out.println(str);
}
in.close();
}
catch(IOException e){}
} }
程序运行之后会把test01.txt的数据读出并显示出来。

字节流读取数据使用的是字节数组,字符流读取数据使用的是字符数组,缓冲流读取数据的时候使用的是字符串,用readLine()来实现读取一个文本行。
随机流读取数据的时候像缓冲流一样使用readLine()方法。
随机流与其他流不一样的地方在于它可以从指定位置开始读取数据。
总结
从以上分析可以看出RandomAccessFile最大两个特点:
1.可以指定位置开始操作;
2.既可以读,也可以写;
review28的更多相关文章
随机推荐
- 洛谷 P1407 [国家集训队]稳定婚姻
洛谷 这个题面很有意思,像我这样的菜鸡,完全不需考虑婚姻的稳定 性 问题. tarjan裸题,直接讲算法吧: 原配夫妻之间分别连一条边,小情人之间反向连边. 这时候我们会发现一个性质,如果婚姻稳定,那 ...
- [NOIP2018PJ]摆渡车
[NOIP2018PJ]摆渡车 luogu mdPJ组这么难,还好考的TG组 先按t排序 设f[i][j]表示前i个人,第i个人等j分钟的最小总等待时间 这里j是小于2m的 可以考虑最坏情况下,一个人 ...
- java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
权限问题,授权给 root 所有sql 权限 在Navicat for MySQL中按F6进入命令列界面 mysql> grant all privileges on *.* to root@& ...
- ubuntu16.04的下载地址
官网不推荐 https://www.ubuntu.com/download 阿里云开源镜像站 http://mirrors.aliyun.com/ubuntu-releases/16.04/ 浙江大学 ...
- 《Python机器学习》笔记(五)
通过降维压缩数据 在前面已经介绍了几种不同的特征选择技术对数据集进行降维的方法.另一种常用于降维的特征选择方法就是特征抽取.数据压缩也是机器学习领域中的一个重要内容.数据压缩技术可以帮助我们对数据及逆 ...
- loadrunner之脚本篇——将内容保存为参数
在VuGen中默认使用{}的字符串称为参数 注意:参数必须在双引号中才能用 将字符串保存为参数 lr_save_string("string you want to save", ...
- CSS 命名里面有大学问
其实迟迟不敢开始写关于样式里布局方面的心得, 因为大多数人眼中,哪需要管那么多,只需要最终效果达到了就行了呗. 然而,即使是如今国内外顶级大牛也不敢说自己是个优秀的 CSS 工程师. 一般大公司都是 ...
- Python编程-多进程二
7.进程间通信(IPC)方式二:管道 (1)创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象 ...
- 20145231《Java程序设计》第二次实验报告
实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD: 理解并掌握面向对象三要素: 初步掌握UML建模: 熟悉S.O.L.I.D原则: 了解设计模式: 实验要求 实现并体会例子中代码的 ...
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...