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的更多相关文章
随机推荐
- echarts+thinkphp 学习写的第一个程序
一.前台 建个名为map.html,代码如下. <!doctype html><html lang="en"><head> <meta c ...
- distinct与NULL在count的注意事项
select * from errorinfo ) from errorinfo select distinct info from errorinfo select count(distinct i ...
- 洛谷 P3393 逃离僵尸岛
洛谷 这道题目其实是最短路裸题. 首先看到题目,要求的到"被占点"距离不大于S的点,自然想到了以"被占点"为源点,求一遍最短路,处理出"危险点&quo ...
- (4.9)SQL Server如何校验备份文件
译 SQL Server如何校验备份文件 转自:https://blog.csdn.net/tjvictor/article/details/5261666 RESTORE VERIFYONLY与 c ...
- 基于twemproxy的redis集群部署
一.系统及软件版本 操作系统:CentOS Linux release 7.3.1611 (Core) 内核版本:3.10.0-514.el7.x86_64 redis版本:3.2.8 twempro ...
- 标准c字符和字符串的使用方法
cppreference.com -> Standard C String & Character -> 详解 标准c字符和字符串 atof 语法: #include &l ...
- C#如何打印RichTextBox控件的内容
本任务的内容 摘要 创建 RichTextBoxPrintCtrl 控件 测试控件 参考 概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任 ...
- 解释python中的help()和dir()函数
help函数是一个内置函数,用于查看函数或模块用途的详细说明 import copy print(help(copy.copy)) Help on function copy in module co ...
- bacula 备份恢复
一.数据恢复: 在bacula服务器执行: /opt/bacula/etc/ bconsole #进入交互窗口 *restore #输入restore恢复命令 Automatically select ...
- 妙用php中的register_shutdown_function和fastcgi_finish_request
前言 在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和 ...