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. javascript操作Date对象

    Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. 参数形式有以下5种: new Dat ...

  2. PS快捷键和常用小知识

    1.快捷键: ctrl+引号 隐藏参考线 ctrl+冒号 隐藏网格线 ctrl+alt 复制选中区域 ctrl+alt+向下箭头 针对单行和单列选框复制移动 ctrl+shift+i 反向选择区域 c ...

  3. 深入 Struts2 的配置 - 处理多个请求-处理请求结果-模型驱动-异常机制

    转:http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631 本部分主要介绍struts.xml的常用配置. 1.1.   ...

  4. Oracle中的一些查询语句及其执行顺序

    查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...

  5. 更换eclipse字体

    eclipse自带的字体非常不好,看的我难受,可能是使用myeclipse习惯了,怎么调节都不好使 最后决定下载一个字体包吧! 字体下载地址如下:http://files.cnblogs.com/ic ...

  6. 单机安装hadoop+hive+presto

    系统环境 在个人笔记本上使用virtualbox虚拟机 os:centos -7.x86-64.everything.1611  ,内核 3.10.0-514.el7.x86_64 注:同样可以使用r ...

  7. 【原创】os.chdir设置的工作路径和sys.path之间到底是个啥关系?

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9390455.html   直接放上测试后的结论(测试代码和截图过多,有兴趣的小伙伴可自己测试,未来看情况 ...

  8. LeetCode 翻转链表

    基本思路 从元首节点之后每次取一个节点,并将节点接到元首节点前面 代码实现 /** * Definition for singly-linked list. * struct ListNode { * ...

  9. 【Linux磁盘优化管理--RAID和LVM】

    在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...

  10. typecho博客组插件:openSug.js百度搜索框下拉提示免费代码

      Typecho候选搜索增强插件:安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让Typecho搜索更便捷! 支持百度.谷歌.雅虎.Yandex.360好搜.UC神马.酷狗.优酷.淘 ...