Java开发——32.I/O流_处理流(RandomAccessFile流)

简介: 操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...

I/O流:主要操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...


处理流:

处理流就相当于外衣,每件衣服的作用不同,每个处理流的作用也不同,处理流可以实现多嵌套,即可以有多个处理流,每个处理流的功能不同!


学习大纲:

今天就可以撒花了,I/O流的学习,你有没有很愉快?!

image.png


RandomAccessFile流(不写它的名字是因为太广义,我们后面浅称它为:随机读取文件流),步骤还是类似的步骤,但是RandomAccessFile流是有别与之前学习的6种流,随机通道文件流他是直接继承自Object类,并没有实现四大流基类的任意一种类型!!!

image.png


随机读取文件流的构造器:


RandomAccessFile(Filefile, Stringmode) 
创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。RandomAccessFile(Stringname, Stringmode) 
创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。它提供了四中访问模式(mode):rrwrwdrws,常用前两种。r访问模式:只能读取文件内容,文件只读;rw访问模式:可读取/可写出,但是不能实现写出后直接使用该对象读取。


随机读取文件流案例:


publicstaticvoidrandomAccessFileTest(Stringpath){
RandomAccessFileout=null;
RandomAccessFileinput=null;
try {
out=newRandomAccessFile(path,"rw");
input=newRandomAccessFile(path,"r");
out.writeUTF("小红");
out.writeInt(28);
out.writeBoolean(true);
Stringname=input.readUTF();
System.out.println(name);
        } catch (IOExceptione) {
e.printStackTrace();
        } finally {
if(out!=null) {
try {
out.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
if (input!=null) {
try {
input.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
        }
    }


使用指针并实现插入不覆盖效果:


RandomAccessFile随机读取文件流1.包含了一个自由指针,可以读取任意位置的内容;2.它写入文件是从文件开头写出的,所以会出现对源文件的覆盖,要是实现插入不覆盖需要引入前面所学的内容seek(longpos) 
设置文件指针偏移,从该文件的开头测量,发生下一次读取或写入。pos-从文件开头测量的偏移位置,用于设置文件指针。



/*** 使用指针并实现插入不覆盖效果*    思路:*      1.引入自由指针,但注意会实现原文件的覆盖*      2.将指定位置后面的内容保存起来,使用数组(麻烦且不确定内容多少) -> 字符串缓冲区!可以是实现内容的动态扩容*      3.指定内容插入后,将缓冲区的内容写入*/publicstaticvoidrandomAccessFileTest02(Stringpath){
RandomAccessFileraf=null;
try {
raf=newRandomAccessFile(path,"rw");
raf.seek(3);//1.通过指针指定插入位置,保存后续内容//2.设置缓冲区大小,不论后续内容有多少,都不会超过文件的长度StringBuildersb=newStringBuilder((int) raf.length());
//3.将内容读取到缓冲区中bytebuffer[] =newbyte[10];
intlen;
while ((len=raf.read(buffer)) !=-1){
for (inti=0; i<len; i++){
sb.append((char) buffer[i]);
                }
            }
raf.seek(3);//4.回调指针,写出内容raf.writeChars("TOM");
raf.write(sb.toString().getBytes());//5.将字符缓冲区中的内容转换为字节存储到原文件中        } catch (IOExceptione) {
e.printStackTrace();
        } finally {
if (raf!=null) {
try {
raf.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
        }
    }/*** 使用指针并实现插入不覆盖效果*    思路:*      1.引入自由指针,但注意会实现原文件的覆盖*      2.将指定位置后面的内容保存起来,使用数组(麻烦且不确定内容多少) -> 字符串缓冲区!可以是实现内容的动态扩容*      3.指定内容插入后,将缓冲区的内容写入*/publicstaticvoidrandomAccessFileTest02(Stringpath){
RandomAccessFileraf=null;
try {
raf=newRandomAccessFile(path,"rw");
raf.seek(3);//1.通过指针指定插入位置,保存后续内容//2.设置缓冲区大小,不论后续内容有多少,都不会超过文件的长度StringBuildersb=newStringBuilder((int) raf.length());
//3.将内容读取到缓冲区中bytebuffer[] =newbyte[10];
intlen;
while ((len=raf.read(buffer)) !=-1){
for (inti=0; i<len; i++){
sb.append((char) buffer[i]);
                }
            }
raf.seek(3);//4.回调指针,写出内容raf.writeChars("TOM");
raf.write(sb.toString().getBytes());//5.将字符缓冲区中的内容转换为字节存储到原文件中        } catch (IOExceptione) {
e.printStackTrace();
        } finally {
if (raf!=null) {
try {
raf.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
        }
    }


后续RandomAccessFile,随机读取文件流,可以应用在具有断点下载,并保存断点位置,如果后续再下载的话保证按照上次断点的位置。

我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能, 下载工具就有类似的应用,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上 一次的地方下载,从而实现断点下载或上传的功能。

相关文章
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
116 0
|
3月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
206 2
|
3月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
223 3
|
3月前
|
移动开发 Cloud Native 安全
Java:跨平台之魂,企业级开发的磐石
Java:跨平台之魂,企业级开发的磐石
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
下一篇
oss云网关配置