RandomAccessFile

1. java.io.RandomAccessFile

java.io.RandomAccessFile是用来读写文件的API,其基于指针可以对文件任意位置进行读写操作

  • 例如当前目录下的raf.dat文件操作
  • 其有两个构造方法
  • RandomAccessFile(String path,String mode)
  • 第一个参数为要操作文件的路径
    *
  • RandomAccessFile(File file,String mode)
  • 第一个参数是要操作的文件所表示的file对象
    *
  • 第二个参数有两个值:r/rw
  • r:只读模式,对文件做读取操作
  • rw:读写模式,对文件数据既可读又可写
    *
  • 注释:如果指定的文件不存在,那么当操作模式为读写模式 时,会自动创建该文件。如果是只读模式则会出现异常(系统找不到路径)
RandomAccessFile raf = new RandomAccessFile("./raf.dat","rw");

2. 创建一个文件并且向其中写入字节

向文件中写入1个字节void writer(int d)
写入的是给定的int值所对应的的2进制的“低八位”(对于负数也是如此)
* 整数1,二进制:
* 00000000 00000000 00000000 00000001

RandomAccessFile raf = new RandomAccessFile("./raf.dat","rw");
raf.write(1);//00000001;
raf.write(2);//00000010;
raf.write(13;//00001101;
System.out.println("写出完毕!");
raf.close();//读写完毕后必须关闭

多次调用write方法,可以写入多个字节,每一次运行都是覆盖重写

3.读取文件中的字节(一次一个,依次读取)

int read()读取一个字节(只有低八位),并以int形式返回,若返回的int值为-1则表示文件末尾

RandomAccessFile raf = new RandomAccessFile("./raf.dat","r");/** raf.dat文件中的内容:* 00000001 00000010 00001101*/
int d = raf.read();
System.out.println(d);//1
d = raf.read();
System.out.println(d);//2
d = raf.read();
System.out.println(d);//13
d = raf.read();
System.out.println(d);//-1,end
raf.close();

4.基于指针的读写操作和读写基本数据类型

long getFilePointer()获取当前指针位置
void seek(long pos)移动指针到指定位置
方便读取基本类型数据的方法:int readInt() 连续读取4字节,还原对应的int值

RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");long point =raf.getFilePointer();/** long getFilePointer()* 获取当前指针位置*/System.out.println("pos:"+point);/** 将int最大值写入文件* int最大值的2进制:*                            ********* 01111111 11111111 11111111 11111111* max>>>24*                              ********* 00000000 00000000 00000000 01111111 */int max = Integer.MAX_VALUE ;raf.write(max>>>24);raf.write(max>>>16);raf.write(max>>>8);raf.write(max);System.out.println("pos:"+raf.getFilePointer());raf.writeInt(max);//连续写四个字节,将int值写出等同于上面四句System.out.println("pos:"+raf.getFilePointer());raf.writeLong(123L);//连续写八个字节,将long值写出System.out.println("pos:"+raf.getFilePointer());raf.writeDouble(123.456);;System.out.println("pos:"+raf.getFilePointer());System.out.println("end");/** void seek(long pos)* 移动指针到指定位置* */raf.seek(0);System.out.println("pos:"+raf.getFilePointer());//0/** RAF也提供了方便读取基本类型数据的方法* int readInt()* 连续读取4字节,还原对应的int值*/int num = raf.readInt();System.out.println(num);System.out.println("pos:"+raf.getFilePointer());raf.seek(8);long ll = raf.readLong();System.out.println(ll);raf.seek(16);double dou = raf.readDouble();System.out.println(dou);/** 将long值修改为666*///1. 先将指针移动到long的第一个字节的位置raf.seek(8);//2. 重新写入8字节,将整数66对应的2进制的8个字节写入文件覆盖位置long lo = 666L;raf.writeLong(lo);raf.close();

5. 文件写入字符串

byte getBytes()将当前字符串按照系统默认的字符串集转换为一组字节
byte getBytes(String csn)将当前字符串按照指定的字符串集转换为一组字节

RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
String str = "asdasd";
byte[]data = str .getBytes("utf-8");
raf.write(data);str = "油楠数";
data = str.getBytes("utf-8");
raf.write(data);System.out.println("写出完毕");
raf.close();

相对路径中的“./"可以不写,不写就是默认./

6. 读取字符串

String提供的构造方法:
String(byte[]data,String csn)
将给定的字节数组中所有字节按照给定的字符集还原为字符串

RandomAccessFile raf = new RandomAccessFile("raf.txt","r");byte[]data = new byte[(int)raf.length()];raf.read(data);String str = new String(data,"utf-8");System.out.println(str);raf.close();

7.对文件的复制

7.1 一次性将给定的字节数组的所有字节写入文件

int read(byte[] data)
一次性读取给定的字节数组总长度的字节量,并将读取的字节放入该数组中,此时返回值表示实际读取到的字节数,如果返回值为-1则表示文件末尾
注意:
这里的返回值int不再是实际读取到的字节内容,而仅表示读取到的字节数,实际读取的内容存在数组里了

     RandomAccessFile src = new RandomAccessFile("./src/WechatIMG813.png","r");RandomAccessFile desc = new RandomAccessFile("./image.png","rw");int f = 0;long start = System.currentTimeMillis();while((f = src.read())!=-1){desc.write(f);}long end = System.currentTimeMillis();System.out.println("copy over!  use time:"+(end-start));src.close();desc.close();
7.2将给定的字节数组从指定下标处的连续指定数量的字节一次性写入文件

void write(byte[] data, int start,int len) ;将给定的字节数组从下标start处的连续len个字节一次性写入文件

  • 8位2进制 1byte
  • 1024byte 1kb
  • 1024kb 1mb
  • 1924mb 1gb
  • 1024gb 1tb
RandomAccessFile src = new RandomAccessFile("./noveie_cp.mp4","r");
RandomAccessFile desc = new RandomAccessFile("./moveie_cp.mp4","rw");byte[]buf = new byte[1024*10];//10kbint len = 0;//记录的是每次读取到的字节数long start = System.currentTimeMillis();while((len = src.read(buf))!=-1){desc.write(buf,0,len);//此处的0为buf从下标0开始}long end = System.currentTimeMillis();System.out.println("copy over! usetime:"+(end-start)+"ms");src.close();desc.close();

JAVA SE学习day_04:RandomAccessFile相关推荐

  1. 第一阶段Java SE学习概述

    Java SE学习概述 Java SE 学习分为五个阶段 第一部分:基础程序设计: 第二部分:面现象对象编程: 第三部分:Java SE 高级应用: 第四部分:JavaSE 新特性: 第五部分:MyS ...

  2. Java SE 学习记录06

    @学习记录 开始学习Java 遵从同学的指导,从Java se开始学习 黑马的JavaSE零基础入门 day06-01 面向对象 package day06;import java.util.Arra ...

  3. Java SE 学习记录——进阶版11

    @学习记录 开始学习Java 遵从同学的指导,从Java se开始学习 黑马的JavaSE零基础入门[网络编程] 第一章 网络编程入门 1.1 软件结构 22-02 软件结构 1.2 网络通信协议 2 ...

  4. 一个编程小白的Java SE学习日志 Ⅵ——继承【极客BOY-米奇】

    文章目录 前言(转载请说明作者!)3.25~3.29编写 自我问答 任务导引:电子宠物Beta 任务UML图 继承 什么是继承? 如何实现继承? 案例 子类可以继承父类所有的成员和方法? 继承的特点 ...

  5. Java SE 学习笔记5 Java阶段复习

    计算机.Java基础 一.计算机 1.硬件介绍 2.中央处理器 3.比特(bit)和字节(byte) 4.内存 5.存储设备 6.输入和输出设备 二.Java介绍 1.常用的dos命令 2.java语 ...

  6. JAVA SE学习笔记(七):终章:Java程序设计基础笔记(全10万字)

    Java程序设计入门 ​                                              copyright © 2020 by 宇智波Akali 目录 文章目录 第1章 J ...

  7. JAVA SE学习day_05: IO与流操作

    一.IO与流 以程序为主体,input(输入)是读.获取.使用输入流的过程,output(输出)是写.发送的过程. JAVA IO 标准的输入与输出 JAVA IO将读和写按照方向划分为: 输入:用于 ...

  8. JAVA SE学习day_02:StringBuilder、正则表达式、Object

    一.StringBuilder 1.1 java.lang.StringBuilder 由于字符串的特性决定他不适合做修改操纵,为了解决这个问题Java提供了便于修改字符串的API:StringBui ...

  9. Java SE学习之路

    我们知道Java有三个方向,JavaSE,JavaME,JavaEE(老程序员可能会叫J2EE等,不过SUN已经改名了).JavaME主要是嵌入式与游戏开发.那我们先看JavaSE,因为只有学好了Ja ...

最新文章

  1. OpenGL实践系列之开篇: NV21 vs NV12
  2. poj 1390(消除方块(blocks))
  3. Docker 安装 MySQL5.7
  4. C++——模板(超详细的模板解析)
  5. 【预测模型】趋势移动平均法预测发电量
  6. ArcGIS Pro脚本工具(10)——从图层生成.stylx样式符号
  7. 有源码如何搭建网站(从零开始搭建教程)
  8. mysql workbench 备份数据库
  9. 面向对象设计,ORM,NHIBERNATE杂谈(有感)
  10. GA-RPN:Region Proposal by Guided Anchoring
  11. web前端培训班有哪些
  12. Linux添加硬盘并挂载(超细致)
  13. 使用MPICH构建一个四节点的集群系统
  14. 电脑之间快速传输超大文件(100GB以上)的方法
  15. 阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
  16. Oracle DataGuard环境下使用TDE透明加密需要注意的点
  17. 假如今天是生命的最后一天
  18. Android中仿支付宝月账单view
  19. 银行ATM存取款系统(C语言实现)
  20. C语言练习:用户输入圆的半径,求圆的面积

热门文章

  1. Linux的概念与体系
  2. 新浪微博客户端(53)-记录用户最近点击表情
  3. [经典算法] 八枚硬币
  4. centos 6.3 安装reids
  5. 白领丽人减肥四大注意 - 生活至上,美容至尚!
  6. flutter_webview_plugin 无法加载网页的异常处理
  7. FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案
  8. 深度解析 H.265 视频解决方案
  9. Linux下安装mysql(2) 及常见问题解决(CentOS)
  10. AngularJS从子控制器访问父作用域