1、什么是 随机访问文件流 RandomAccessFile

这个类在很多资料上翻译成中文都是:随机访问文件,在中文里,随机是具有不确定的含义,指一会访问这里,一会访问那里的意思。如果以这种语义来解释的话,就会感到很困惑。其实,Random在英文中不仅仅有随机,还有任意的意思。如果中文名为任意访问文件是不是就会更好的理解。任意表示我们可以指定文件中任何一个位置去操作一个文件。

RandomAccessFile适用于大小已知的文件,能够随机的读取或者写入文件。可以通过使用seek()将记录从一处转移到另外一处,然后读取或者修改记录。文件中记录的大小不一定相同,只要我们能确定记录的大小和它们在文件的位置即可。

2、RandowAccessFile存在的价值

1、是JAVA I/O流体系中功能最丰富的文件内容访问类,它提供了众多方法来访问文件内容。

2、由于可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,RandomAccessFile将是更好的选择。

3、可以用来访问保存数据记录的文件,文件的记录的大小不必相同,但是其大小和位置必须是可知的。

3、RandomAccessFile的使用

 public class RandomFileDemo {

     public static void main(String[] args) {

         try {
RandomAccessFile raf = new RandomAccessFile(new File("E:\\a.txt"), "rw");
long offset = raf.getFilePointer();//文件指针
long len= raf.length();//当前文件的字节大小
System.out.println("offset:"+offset+" len:"+len);
//raf.seek(len);//移动到文件末尾,可进行追加文件内容
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length());
raf.write(65);//1字节
raf.writeChar(97);//2字节
raf.writeChar('\n');//2字节
raf.writeBytes("test");//4字节
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length()); raf.seek(0);//移动文件指针到开始位置
int c = raf.read();
System.out.println(c+" "+(byte)c+" "+(char)c);//从指定位置开始读取一个字节 System.out.println(raf.readChar());//从文件指针(类似一个游标)位置开始读取一个字符(2个字节)
//再次回到文件的开始位置,读取一行
raf.seek(0);
System.out.print(Arrays.toString(raf.readLine().getBytes())+" ");
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length());
raf.close(); } catch (Exception e) {
e.printStackTrace();
} } }

结果输出(a.txt是空文件):

offset:0 len:0
offset:0 len:0
offset:9 len:9
65 65 A
a
[65, 0, 97, 0] offset:5 len:9

4、进程控制和流

在java程序中执行其他操作系统的程序,并且控制这些程序的输入和输出。主要要是借助流来读取程序的输出。如下:

 public class ProcessDemo {

     public static void main(String[] args) {

         try {
Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe","/C","dir"}); BufferedReader br =new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK")); BufferedReader br2 =new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line=null;
String line2=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
while((line2=br2.readLine())!=null){
System.out.println(line2);
} br.close();
br2.close();
} catch (IOException e) {
e.printStackTrace();
} } }

输出结果:

驱动器 F 中的卷没有标签。
卷的序列号是 3A48-2555 F:\NewStudyWorkSpace\coder_java 的目录 2018/03/19 19:31 <DIR> .
2018/03/19 19:31 <DIR> ..
2018/03/19 19:31 1,433 .classpath
2018/03/19 19:31 562 .project
2018/03/19 19:31 <DIR> .settings
2018/04/05 18:05 702 pom.xml
2018/03/19 19:31 <DIR> src
2018/03/19 19:31 <DIR> target
3 个文件 2,697 字节
5 个目录 341,102,870,528 可用字节

Java IO学习--RandomAccessFile的更多相关文章

  1. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  2. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  3. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  4. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  5. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  6. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  7. java IO 学习(三)

    java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...

  8. Java IO学习笔记一:为什么带Buffer的比不带Buffer的快

    作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...

  9. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

随机推荐

  1. mysql(安装、启动、删除)服务

    必须在管理身份下运行 方式一: 安装服务 将 MySQL 安装为服务的方式: "C:\Program Files\MariaDB 10.3\bin\mysqld.exe" inst ...

  2. asp.net中Page.ClientScript.RegisterStartupScript用法小结

    ClientScript.RegisterStartupScript(Page.GetType(), "Show", "alert('" + l_strConf ...

  3. js时间日期格式

    Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...

  4. JavaScript高阶函数map/reduce、filter和sort

    map() 举例说明,比如我们有一个函数f(x)=x²,要把这个函数作用在一个数组[1,2,3,4,5,6,7,8,9]上. 由于map()方法定义在JavaScript的Array中,我们调用Arr ...

  5. Openresty最佳案例 | 第5篇:http和C_json模块

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616672 本文出自方志朋的博客 http客户端 Openresty没有提供默认的Htt ...

  6. [oracle]分区表学习

    (一)什么是分区 所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区. (二)分区的优势 提高数据可管理性.对表进行分区,数据的加载 ...

  7. npm cnpm npx nvm 傻傻分不清

    用过 npm cnpm吗?知道 npx nvm 吗? 唔~ npm npm 的全称是 Node Package Manager 是 JavaScript 世界的包管理工具,并且是 Node.js 平台 ...

  8. linux中安装node

    1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过 uname -a ...

  9. 第1章 MATLAB概述

    MATLAB系统由~开发环境.~语言.~数学函数库.~图形处理系统.~应用程序接口(API)5大部分组成. 界面 命令行中的语句格式 命令行的语句格式:>>变量=表达式(没有>> ...

  10. 文件 I/O字符流

    import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOExceptio ...