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.rhkb.cn/news/370851.html

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

相关文章

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…

软件系统架构的一些常见专业术语

分层架构是逻辑上的,在物理部署上,三层结构可以部署在同一个物理机器上,但是随着网站业务的发展,必然需要对已经分层的模块分离部署,即三层结构分别部署在不同的服务器上,使网站拥有更多的计算资源以应对越…

前端Web开发HTML5+CSS3+移动web视频教程 Day4 CSS 第2天

P44 - P 四个知识点: 复合选择器 CSS特性 背景属性 显示模式 复合选择器 复合选择器仍然是选择器,只要是选择器,作用就是找标签。复合选择器就是把基础选择器进行组合使用。组合了之后就可以在大量的标签里面更快更精准地找标签了。找…

[附源码]基于Flask的演唱会购票系统

摘要 随着互联网技术的普及和发展,传统购票方式因其效率低下、流程繁琐等问题已难以满足现代社会的需求。本文设计并实现了一个基于Flask框架的演唱会购票系统,该系统集成了用户管理、演唱会信息管理、票务管理以及数据统计与分析等功能模块&#xff0c…

项目实战--Spring Boot + Minio文件切片上传下载

1.搭建环境 引入项目依赖 <!-- 操作minio的java客户端--> <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version> </dependency> <!-- jwt鉴权相应依赖--> &…

Python + OpenCV 开启图片、写入储存图片

这篇教学会介绍OpenCV 里imread()、imshow()、waitKey() 方法&#xff0c;透过这些方法&#xff0c;在电脑中使用不同的色彩模式开启图片并显示图片。 imread() 开启图片 使用imread() 方法&#xff0c;可以开启图片&#xff0c;imread() 有两个参数&#xff0c;第一个参数为档…

[c++] 可变参数模版

前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…

陶建辉当选 GDOS 全球数据库及开源峰会荣誉顾问

近日&#xff0c;第二十三届 GOPS 全球运维大会暨 XOps 技术创新峰会在北京正式召开。本次会议重点议题方向包括开源数据库落地思考、金融数据库自主可控、云原生时代下数据库、数据库智能运维、数据库安全与隐私、开源数据库与治理。大会深入探讨这些方向&#xff0c;促进了数…

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

服务器数据恢复—raid5阵列硬盘出现大量坏道的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台DELL EqualLogic PS 4000存储中有一组由12块磁盘组建的raid5阵列&#xff0c;存储空间划分3个同等大小的卷&#xff0c;采用的VMFS文件系统。 两块硬盘指示灯亮黄色&#xff0c;raid5阵列崩溃&#xff0c;存储变得不可用。 服…

代码随想录——划分字母区间(Leetcode763)

题目链接 贪心 class Solution {public List<Integer> partitionLabels(String s) {int[] count new int[27];Arrays.fill(count,0);// 统计元素最后一次出现的位置for(int i 0; i < s.length(); i){count[s.charAt(i) - a] i;}List<Integer> res new Ar…

mac怎么压缩pdf文件大小,mac压缩pdf文件大小不改变清晰度

在数字化时代&#xff0c;pdf格式因其良好的兼容性和稳定性&#xff0c;成为了文档分享和传输的首选。然而&#xff0c;随着文件内容的丰富&#xff0c;pdf文件的体积也越来越大&#xff0c;给存储和传输带来了不小的困扰。本文将揭秘几种简单有效的pdf文件压缩方法&#xff0c…

多粒度封锁-封锁粒度、多粒度封锁模式

一、引言 1、若采用封锁技术实现并发控制&#xff0c;事务在访问数据库对象前要在数据库对象上加锁&#xff0c;为提高事务的并发程度&#xff0c;商用DBMS会采用一种多粒度封锁方法 2、事务可访问的数据库对象可以是逻辑单元&#xff0c;包括关系、关系中的元组、关系的属性…

【C++】map和set详解

目录 1. 关联式容器 2. 键值对pair 3. 树形结构的关联式容器 4. set 4.1 set的介绍 4.2 set的构造 4.3 set的迭代器 4.4 set的容量 4.5 set的常用函数 5. multiset 6. map 6.1 map的介绍 6.2 map的构造 6.3 map的迭代器 6.4 map的容量 6.5 map的operator[] 6.6…

Python入门 2024/7/6

目录 元组的定义和操作 字符串的定义和操作 字符串 字符串的替换 字符串的分割 字符串的规整操作&#xff08;去除前后空格&#xff09; 字符串的规整操作&#xff08;去掉前后指定字符串&#xff09; 操作 字符串的替换 字符串的分割 字符串的规整操作 统计字符串的…

ESP32——物联网小项目汇总

商品级ESP32智能手表 [文章链接] 用ESP32&#xff0c;做了个siri&#xff1f;&#xff01;开源了&#xff01; [文章链接]

JSP WEB开发(一) JSP语言基础

目录 JSP JSP简介&#xff1a; JSP页面 JSP运行原理 JSP脚本元素 JAVA程序片 局部变量 全局变量和方法的声明 全局变量 方法的声明 程序片执行特点 synchronized关键字 表达式 JSP指令标记 page指令 include指令 JSP动作标记 JSP动作元素include和include指令的…

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装&#xff08;以window 64位为例&#xff09;1.3、配置环境变量&#xff08;非必须&#xff09; 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书&#xff0c;并且自签名 2.3、服务端证书生成2…

前端根据目录生成模块化路由routes

根据约定大于配置的逻辑&#xff0c;如果目录结构约定俗成&#xff0c;前端是可以根据目录结构动态生成路由所需要的 route 结构的&#xff0c;这个过程是要在编译时 进行&#xff0c;生成需要的代码&#xff0c;保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…

设计模式之状态机模式

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