Java 基础--File - IO流(2)

I/O流

定义

数据从硬盘流向内存为输入流,数据从内存流向硬盘为输出流。输入也叫读取数据,输出也叫写出数据。

IO分类

1.按照数据的流向分为:输入流和输出流

①输入流:把数据从其他设备上读取到内存中的流

②输出流:把数据从内存中写出到其他设备上的流

2.按照功能类型分为:字节流和字符流

①字节流:以字节为单位,读写数据的流

②字符流:以字符为单位,读写数据的流

字节流和字符流的顶级父类

字节流:①字节输入流:InputStream

②字节输出流:OutputStream

字符流:①字符输入流:Reader

②字符输出流:Writer

注:这些都是抽象父类,不能直接使用,要使用他们的子实现类

字节输出流(OutputStream)

一切皆为字节,我们存储的数据,文件,图片等都是以二进制数字的形式保存,都是一个一个的字节,传输的时候也是一样。java.io.OutputStream抽象类是表示字节输出流的所有类的父类,将指定的字节信息写出到目的地。

1.字节输出流的基本共性功能方法:

①public void close():关闭此输出流并释放与此流相关联的任何系统资源当完成流的操作时,必须调用此方法,释放系统资源。

②public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。

③public void write(byte[] b, int off, int len)` :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。

④public abstract void write(int b):将指定的字节输出。

FileOutputStream类(文件字节输出流)

OutputStream的子类,用于将数据写出到文件

构造方法

1.public FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件

        // 使用File对象创建流对象File file = new File("a.txt");FileOutputStream fos = new FileOutputStream(file);

2.public FileOutputStream(String name):创建文件输出流以指定的名称写入文件

        // 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("b.txt");

注:如果目标文件不存在,则创建,若存在,则覆盖。

常用方法:

1.写出字节:write(int b) 方法,每次可以写出一个字节数据

        FileOutputStream fos = new FileOutputStream(“D:/test/test.txt”);fos.write(97);fos.close();//文件中会写出a

注:虽然参数为int类型四个字节,但是只会保留一个字节的信息写出,因为这是字节输出流,一个字节一个字节输出,只会保留我们输出的那个字节。

2.写出字节数组:write(byte[] b),每次可以写出数组中的数据

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file);//写出一个字节数组大小的数据byte[] b={97,98,99,100};fos.write(b);byte[] b1="今天真好看".getBytes();fos.write(b1);fos.close();//写入abcd今天真好看

3.写出指定长度字节数组:write(byte[] b, int off, int len),每次写出从off索引开始,len个字节

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file);//写出数组中指定长度的字节数据byte[] b={97,98,99,100};fos.write(b,1,2);fos.close();//写入bc

4.数据追加续写

public FileOutputStream(File file/String name,boolean append):这个构造方法,参数中需要传入一个boolean类型的值,true表示追加数据,false表示清空原有数据,不写的话默认是false

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file,true);//追加数据byte[] b={97,98,99,100};fos.write(b,1,2);fos.close();//写入bcbc

5.写出换行

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file,true);//换行\r\nbyte[] b={97,98,99,100};for(int i:b){fos.write(i);fos.write("\r\n".getBytes());}fos.close();

注:①回车符(\r):回到一行的开头,如果在abcde中的c前回车后不做任何操作,再写数据的时候光标是在c前面

       ②换行符(\n):另起一行,如果在abcde中的c前换行后不做任何操作,再写数据的时候光标是在e后面

字节输入流(InputStream)

java.io.InputStream 抽象类是表示字节输入流的所有类的父类,可以读取字节信息到内存中。定义了字节输入流的基本共性功能方法。

1.基本共性功能方法:

①public void close():关闭此输入流并释放与此流相关联的任何系统资源。

②public abstract int read(): 从输入流读取数据的下一个字节。

③public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

FileInputStream类(文件字节输入流)

构造方法:

1.FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

        // 使用File对象创建流对象File file = new File("a.txt");FileInputStream fos = new FileInputStream(file);

2.public FileInputStream(String name):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

        // 使用文件名称创建流对象FileInputStream fos = new FileInputStream("b.txt");

常用方法:

1.读取字节数据:read方法,从输入流中读取数据的下一个字节,自动提升为int类型,读取到文件末尾,返回-1。

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);int r;while ((r=fis.read())!=-1){System.out.println((char)r);//遍历文件中的全部字节}fis.close();}

2.使用字节数组读取:read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1。

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);//每次读一个字节数组的数据byte[] b=new byte[3];int read =fis.read(b);//返回的int值是读取的有效字节个数System.out.println(read);//3System.out.println(new String(b));//bcafis.close();}

注:

读取到的数据赋值给字节数组b,每一次读取会覆盖前一次的数据如果字符的长度不是字节数组的整数倍,比如字节数组长度为3,但是读取到最后只剩2个字符,那么这两个字符会覆盖字符数组前两位,而第三位则还是上一次读取的字符,

改进如下:

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);byte[] b=new byte[3];//定义有效字节数int len;while ((len=fis.read(b))!=-1){String s=new String(b,0,len);System.out.println(s);}fis.close();}

字符输入流(Reader)

java.io.Reader抽象类是表示用于读取字符流的所有类的父类,可以读取字符信息到内存中。

1.基本共性功能方法:

①public void close():关闭此流并释放与此流相关联的任何系统资源

②public int read(): 从输入流读取一个字符

③public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类

java.io.FileReader `类是读取字符文件的便捷类

构造方法:

①FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象

        // 使用File对象创建流对象File file = new File("a.txt");FileReader fr = new FileReader(file);

②FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称

        // 使用文件名称创建流对象FileReader fr = new FileReader("b.txt");

常用方法:

1.读取字符:read方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1,循环读取

public static void main(String[] args) throws IOException {//字符输入流FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));int r ;while ((r=fr.read())!=-1){System.out.println((char)r);}fr.close();}

2.使用字符数组读取:read(char[] cbuf),每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

public static void main(String[] args) throws IOException {//字符输入流FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));char[] c=new char[3];int l;while ((l=fr.read(c))!=-1){String s=new String(c,0,l);System.out.println(s);}fr.close();}

字符输出流(Writer)

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地

1.基本共性功能方法

①public abstract void close():关闭此输出流并释放与此流相关联的任何系统资源

②public abstract void flush():刷新此输出流并强制任何缓冲的输出字符被写出

③public void write(int b):写出一个字符

④public void write(char[] cbuf):将 cbuf.length字符从指定的字符数组写出此输出流

⑤public abstract void write(char[] b, int off, int len):从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流

⑥public void write(String str):写出一个字符串

FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用默认字节缓冲区(之前输出流是从内存直接就写到硬盘中了,现在这个字符输出流是有一个缓冲区存在的,在向外界磁盘写数据的时候会先把数据写到缓冲区中,只有调用刷新或者关闭方法的时候,才会把当前缓冲区内的数据输出到指定文件中

构造方法:

1.FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象

        // 使用File对象创建流对象File file = new File("a.txt");FileWriter fw = new FileWriter(file);

2.FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称

        // 使用文件名称创建流对象FileWriter fw = new FileWriter("b.txt");

常用方法:

1.写出字符:write(int b) 方法,每次可以写出一个字符数据

public static void main(String[] args) throws IOException {//文件字符输出流//FileWriter fw= new FileWriter("F:\\test\\aaa.txt");FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));fw.write("我");fw.write(30000);//写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。fw.close();}

关闭和刷新的区别

1.flush:刷新缓冲区,流对象可以继续使用

2.close:关闭流,释放系统资源,关闭前会刷新缓冲区,但流对象不可以继续使用。

public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter("F:\\test\\aaa.txt");// 写出数据,通过flushfw.write('刷'); // 写出第1个字符fw.flush();//写出成功fw.write('新'); // 继续写出第2个字符fw.flush();//写出成功// 写出数据,通过closefw.write('关'); // 写出第1个字符fw.close();fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closedfw.close();}

2.写出其他数据

①写出字符数组 :write(char[] cbuf) 和 write(char[] cbuf, int off, int len),每次可以写出字符数组中的数据,同FileOutputStream的用法一样。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));char[] c="今天适合吹风".toCharArray();fw.write(c);fw.write(c,3,2);//写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。fw.close();

②写出字符串:write(String str) 和 write(String str, int off, int len),每次可以写出字符串中的数据。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));String s="今天太阳好大";fw.write(s);fw.write(s,2,3);//写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。fw.close();

③续写和换行:操作类似于FileOutputStream

   FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"),true);fw.write("今天太阳好大");fw.write("\r\n");fw.write("今天");//写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。fw.close();

总结

凡是自己能写出来的用字符流,字符写不出来的比如图片,视频等用字节流。

IO流的异常处理

第一种方式:

public static void main(String[] args){FileInputStream fis=null;FileOutputStream fos=null;try{fis=new FileInputStream("C:\\test\\完整的页面效果图.jpg");fos=new FileOutputStream("C:\\test\\1.jpg");byte[] b=new byte[1024];int l=0;while((l=fis.read(b))!=-1){fos.write(b,0,l);}}catch(IOException e){e.printStackTrace();}finally {try {if(fos!=null){fos.close();}} catch (IOException e) {e.printStackTrace();}try {if(fis!=null){fis.close();}} catch (IOException e) {e.printStackTrace();}}}

第二种方式:1.7之后流的简化版处理异常的方式.不再需要自己关流,这种方式会自动关流

public static void main(String[] args) throws IOException {//第二种方式try(FileInputStream fis=new FileInputStream("C:\\test\\完整的页面效果图.jpg");FileOutputStream fos=new FileOutputStream("C:\\test\\1.jpg")){byte[] b=new byte[1024];int l=0;while((l=fis.read(b))!=-1){fos.write(b,0,l);}}catch (Exception e){e.printStackTrace();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 基础组件速学 事件过滤器

学习目标:理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

工控人最爱的PLC触摸屏一体机,有多香

PLC触摸屏一体机是什么 PLC触摸屏一体机,听起来可能有点技术化,但简单来说,它就是一个集成了可编程逻辑控制器(PLC)和触摸屏的智能设备。这种设备不仅能够执行自动化控制任务,还能实时显示和操作设备状态&a…

JVM原理(十九):JVM虚拟机内存模型

1. 硬件的效率与一致性 数据不安全的原因:缓存一致性的问题 共享内存多核系统:在多路处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存。 线程先后执行结果不一致问题:除了增加高速缓存之外&#…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK(Natural Language Toolkit)时&#xff0c…

CentOS 7安装Elasticsearch7.7.0和Kibana

一. 准备安装包 elasticsearch和kibana:官网历史版本找到并下载(https://www.elastic.co/cn/downloads/past-releases#elasticsearch)ik分词器:GitHub下载(https://github.com/infinilabs/analysis-ik/releases/tag/v…

设计模式之状态机模式

一、状态机模式介绍 状态机模式(State Machine Pattern)是一种用于描述对象行为的软件设计模式,属于行为型设计模式。在状态机模式中,对象的行为取决于其内部状态,并且在不同的状态下,对象可能会有不同的行…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址: 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下,其实订单服务是api服务&a…

Java 使用sql查询mongodb

在现代应用开发中,关系型数据库和NoSQL数据库各有千秋。MongoDB作为一种流行的NoSQL数据库,以其灵活的文档模型和强大的扩展能力,受到广泛欢迎。然而,有时开发者可能更熟悉SQL查询语法,或者需要在现有系统中复用SQL查询…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用: 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失败,已经没有子进程了 >0 : 回收子进程对应的…

一种非凸全变差正则化的信号降噪方法(以模拟信号和轴承振动信号为例,MATLAB)

以旋转机械振动信号为例,由于旋转机械运行中背景噪声较强,振动信号需要进行降噪处理。常用的小波阈值降噪会在信号的不连续处产生虚假的波峰和伪吉布森震荡,而奇异值分解SVD去噪容易产生虚假分量,全变差去噪则不会出现这样的情况&…

深入理解JS逆向代理与环境监测

博客文章:深入理解JS逆向代理与环境监测 1. 引言 首先要明确JavaScript(JS)在真实网页浏览器环境和Node.js环境中有很多使用特性的区别。尤其是在环境监测和对象原型链的检测方面。本文将探讨如何使用JS的代理(Proxy&#xff09…

STM32-USART

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 串口通信协议1.1 通信接口1.2 串口通信1.3 硬件电路1.4 电平标准1.5 串口参数及时序1.6 串口时序 2. USART串口通信2.1 USART简介2.2 USART框图2.3 USART基本结构2.4 数据帧2.5 数据帧-配置停止位2.6 起始位侦测2.…

【Python】一文向您详细介绍 argparse中 action=‘store_true’ 的作用

【Python】一文向您详细介绍 argparse中 action‘store_true’ 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:98…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代,pdf文件转换成图片格式是一种常见的操作,无论是在工作还是日常生活中,我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么,如何高效地将pdf转换成图片呢?本文…

图神经网络实战(16)——经典图生成算法

图神经网络实战(16)——经典图生成算法 0. 前言1. 图生成技术2. Erdős–Rnyi模型3. 小世界模型小结系列链接 0. 前言 图生成算法是指用于创建模拟图或网络结构的算法,这些算法可以根据特定的规则和概率分布生成具有特定属性的图&#xff0c…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接: https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中,多智能体合作问题因原始感官观察、高昂…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 📒1. 引言📙2. 机器学习基础与广告营销的结合🧩机器学习在广告营销中的核心应用领域🌹用…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1:useReducer不带初始化函数案例2:useReducer带初始化函数注意事项1:dispatch函数不会改变正在运行的代码的状态注意事项2:获取dispatch函数触发后 JavaScript 变量的值注意事项3:触发了reducer&am…