IO流介绍和异常处理

2023-11-19

IO流

1.1IO的分类

根据数据的流向分为:输入流和输出流

  • 输入流:把数据从其他设备上读取到内存中的流
  • 输出流:把数据从内存中写到其他设备上的流
    根据功能类型分为:字节流和字符流
  • 字节流:以字节为单位,读写数据的流
  • 字符流:以字符为单位,读写数据的流

1.2字节输出流【OutputStream】

  • 一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
  • java.io.OutputStream `抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
  • 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)` :将指定的字节输出。

1.3FileOutputSream类

java.io.FileOutputStream类是文件输出流,用于将数据写出到文件

构造方法
  • public FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件。
  File file = new File("a.txt");
  FileOutputStream fos = new FileOutputStream(file);
  • public FileOutputStream(String name):创建文件输出流以指定的名称介入文件。
 FileOutputStream fos = new FileOutputStream("b.txt");

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件数据,也就是覆盖。

1.4字节输入流【InputStream】

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

  • public void close():关闭此输入流并释放与此流相关联的任何资源。
  • public abstract int read():从输入流读取数据的下一个字节。
  • public int read(byte[] b):从输入流中读取一些字节数,并将它们存储到字节数组b中。
    小贴士:
    close方法,当完成流的操作时,必须调用此方法,释放该系统的资源。

1.5FileInputSream类

java.io.FileInputStream类是文件输入流,从文件中读取字节。

构造方法
  • FileInputStream(File file):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名。
    File file = new File(“a.txt”);
    FileInputStream fos = new FileInputStream(file);
  • FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件有文件系统中的路径名name命名。
    FileInputStream fos = new FileInputStream(“b.txt”)

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException。

读取字节数据
  1. 读取字节:read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,
public class FISRead {
    public static void main(String[] args) throws IOException{
      	// 使用文件名称创建流对象
       	FileInputStream fis = new FileInputStream("read.txt");
      	// 读取数据,返回一个字节
        int read = fis.read();
        System.out.println((char) read);
        read = fis.read();
        System.out.println((char) read);
        read = fis.read();
        System.out.println((char) read);
        read = fis.read();
        System.out.println((char) read);
        read = fis.read();
        System.out.println((char) read);
      	// 读取到末尾,返回-1
       	read = fis.read();
        System.out.println( read);
		// 关闭资源
        fis.close();
    }
}
输出结果:
a
b
c
d
e
-1

循环改进读取方式:

public class FISRead {
    public static void main(String[] args) throws IOException{
      	// 使用文件名称创建流对象
       	FileInputStream fis = new FileInputStream("read.txt");
      	// 定义变量,保存数据
        int b ;
        // 循环读取
        while ((b = fis.read())!=-1) {
            System.out.println((char)b);
        }
		// 关闭资源
        fis.close();
    }
}
输出结果:
a
b
c
d
e

小贴士:

  1. 虽然读取了一个字节,但是会自动提升为int类型。
  2. 流操作完毕后,必须释放该系统资源,调用close方法。
  1. 使用字节数组读取:read(byte[] b),每次读取b的长度字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1.

由于最后一次读取时,只读取一个字节e,数组中,上次读取的数据没有被完全替换,所以要通过len获取有效的字节。

public class FISRead {
    public static void main(String[] args) throws IOException{
      	// 使用文件名称创建流对象.
       	FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde
      	// 定义变量,作为有效个数
        int len ;
        // 定义字节数组,作为装字节数据的容器 ,缓冲区  
        byte[] b = new byte[2];
        // 循环读取
        while (( len= fis.read(b))!=-1) {
           	// 每次读取后,把数组的有效字节部分,变成字符串打印
            System.out.println(new String(b,0,len));//  len 每次读取的有效字节个数
        }
		// 关闭资源
        fis.close();
    }
}

输出结果:
ab
cd
e

1.6字符输入流【Reader】

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

  • public voidclose():关闭此流并释放与此流相关联的任何系统资源。
  • public int read():从输入流读取一个字符。
  • public int read(char[] chuf):从输入流中读取一些字符,并将它们存储到字符数组cbuf中。

1.7FileReader类

java.io.FileRead类是读取字符文件的便利类。

构造方法
  • FileRead(File flie):创建一个新的FileRead,给定要读取的文件名称。
File file =new File("a.txt");
Filereader fr = newFileReader(file);
  • FileRead(String fileName):创建一个新的FileReader,给定要读取的文件的名称。
FileReader fr = new FileReader("b.txt");

当你创建一个流对象时,必须传入一个文件的路径。

读取字符数据
  1. 读取字符:read方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1循环读取。
public class FRRead {
    public static void main(String[] args) throws IOException {
      	// 使用文件名称创建流对象
       	FileReader fr = new FileReader("read.txt");
      	// 定义变量,保存数据
        int b ;
        // 循环读取
        while ((b = fr.read())!=-1) {
            System.out.println((char)b);
        }
		// 关闭资源
        fr.close();
    }
}

获取有效的字符改进:

public class FISRead {
    public static void main(String[] args) throws IOException {
      	// 使用文件名称创建流对象
       	FileReader fr = new FileReader("read.txt");
      	// 定义变量,保存有效字符个数
        int len ;
        // 定义字符数组,作为装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr.read(cbuf))!=-1) {
            System.out.println(new String(cbuf,0,len));
        }
    	// 关闭资源
        fr.close();
    }
}

1.8字符输出流【writer】

java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出的目的地。它定义了字节输出流的基本共性功能方法。

  • public abstract void close():关闭输出流并释放与此流相关联的任何系统资源。
  • public abstract void flush():刷新此输出流并强制任何缓冲的输出字符被写出。
  • public void write(int b):写出一个字符。
  • public void writechar[] cbuf):将b.length字符从指定的字符数组写出此输出流。
  • public abstract void write(char [] b,int off,int len):从指定的字符数组写出len字符,从偏移量off开始输出到此输出流。
  • public void write(String str):写出一个字符串。

1.9FileWriter类

java.io.FileWriter类是写出字符到文件的便利类。构造时使用默认字节缓冲区。
写出的数据会自动存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。
在这里插入图片描述

构造方法
  • FileWriter(File file):创建一个新的FileWriter,给定要读取的File对象。
File file = new File("a.txt");
FileWriter fw =new FileWriter(file);
  • FileWriter(String fileName):创建一个新的FileWriter,给定要读取的文件的名称。
FileWriter fw = new FileWriter("a.txt")
  • 当创建一个流对象时,必须传入一个文件路径。
基本写出数据

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

public class FWWrite {    
public static void main(String[] args) throws IOException {        
// 使用文件名称创建流对象        
FileWriter fw = new FileWriter("fw.txt");             
// 写出数据        
fw.write(97); // 写出第1个字符        
fw.write('b'); // 写出第2个字符        
fw.write('C'); // 写出第3个字符        
fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。              
/*【注意】关闭资源时,与FileOutputStream不同。
如果不关闭,数据只是保存到缓冲区,并未保存到文件。
*/        
// fw.close();    
	}
}
输出结果:
abC田

小贴士:

  1. 未调用close方法,数据只是保存到了缓存区,并未写出到文件中。
关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush方法了。

  • flush:刷新缓冲区,流对象可以继续使用
  • close:关闭流,释放系统资源。关闭前会刷新缓冲区。
写出其他数据
  1. 写出字符数组:write(char [] cbuf)和write(char [] cbuf,int off,int len),每次可以写出字符数组中的数据。
public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");     
      	// 字符串转换为字节数组
      	char[] chars = "中公优就业".toCharArray();
      
      	// 写出字符数组
      	fw.write(chars); // 中公优就业
        
		// 写出从索引2开始,2个字节。索引2是'优',两个字节,也就是'优就'。
        fw.write(chars,2,2); // 优就
      
      	// 关闭资源
        fos.close();
    }
}
  1. 写出字符串:write(String str)和write(string str,int off,int len),每次可以写出字符串中的数据,更为方便。
public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");     
      	// 字符串
      	String msg = "中公优就业";
      
      	// 写出字符数组
      	fw.write(msg); //中公优就业
      
		// 写出从索引2开始,2个字节。索引2是'优',两个字节,也就是'优就'。
        fw.write(msg,2,2);	// 优就
      	
        // 关闭资源
        fos.close();
    }
}
  1. 续写和换行:操作类似于FileOutputStream。
public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象,可以续写数据
        FileWriter fw = new FileWriter("fw.txt"true);     
      	// 写出字符串
        fw.write("中公");
      	// 写出换行
      	fw.write("\r\n");
      	// 写出字符串
  		fw.write("优就业");
      	// 关闭资源
        fw.close();
    }
}

小贴士:字符流,只能操作文本文件(自己能写出来的),不能操作图片,视频等非文本文件(自己写不出来的用字节流)。

2.1IO异常处理

JDK7前处理

  1. 将流对象的创建使用与流对象的关闭分离开,分别放在try和finally中(流对象的创建和使用的异常,不会影响流对象的关闭的执行)
  2. 为了让try和finally中都可以使用流对象的引用,所以将两个引用在外面声明,扩大访问范围,在try和finally中使用。
  3. 为了保证两个引用有初始化值,所以给两个引用分别赋值null。
  4. 为了避免两个流对象在关闭的时候出现空指针异常,所以在关流之前判断是否为null。
  5. 为了让第一个流的关闭失败,不要影响第二个流关闭的机会,所以将两个流的关闭,分为放在了嵌套的try…finally中。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo08_jdk7之前的关流方式 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream("a.txt");
			fos = new FileOutputStream("a_copy.txt");
			int b;
			while((b = fis.read()) != -1) {
				fos.write(b);
			}
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
			} finally {
				if (fos != null) {
					fos.close();
				}
			}
		}
	}
}

JDK7的处理

  1. 可以使用JDK优化后的try-catch语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。

格式:

try (创建流对象语句,如果多个,使用';'隔开) {
	// 读写数据
} catch (IOException e) {
	e.printStackTrace();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO流介绍和异常处理 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 嵌入式基础常识

    一 基本概念 linux ubuntu 用户名 类型 普通用户 系统名称 家目录 root 管理员用户 pwd 显示当前工作路径 绝对路径 home linux 家目录 根目录下 代表根目录 ls 列出文件状态 选项 l i h 1 rwx
  • BUUCTF-千层套路(python脚本)

    zip层层压缩 写脚本爆破 import zipfile import os current path r C Users SoberJoker Downloads attachment if name main pwd ls os lis
  • 【经典】IDEA+DevTools热部署

    IDEA DevTools实现热部署功能 热部署 大家都知道在项目开发过程中 常常会改动页面数据或者修改数据结构 为了显示改动效果 往往需要重启应用查看改变效果 其实就是重新编译生成了新的Class文件 这个文件里记录着和代码等对应的各种信
  • 电脑浏览器换IP怎么换?四种浏览器教程一起看看吧。【芝麻http】

    浏览器设置代理IP上网是代理IP最基础的使用方法 不同的浏览器设置代理IP的方法略有不同 下面就几种常用的浏览器如何设置代理IP进行说明 一 IE浏览器设置代理IP IE浏览器无疑是最常用的浏览器 而像360浏览器 搜狗浏览器 QQ浏览器这
  • C++中的.和->

    C 中的 和 gt 1 C 中的点 的应用 如果是一个对象或者引用去调用成员变量或者成员函数函数的话 会使用到点 include
  • vue-cli webpack配置cdn路径 以及 上线之后的字体文件跨域处理

    昨天搞了一下vue项目打包之后静态资源走阿里云cdn 配置了半天 终于找到了设置的地方 config index js 里面设置build 下的 assetsPublicPath 打包的时候便可以添加公共前缀路径 assetsSubDire
  • c++ 封装

    目录 封装的意义一 封装的意义二 struct和class区别 成员属性设置为私有 封装的意义一 封装是c 面向对象的三大特征之一 1 将属性和行为作为一个整体 表现生活中的事物
  • 阿里云在线扩展云盘记录-ubuntu系统

    fdisk l 查看真实磁盘大小 apt get update 更新库 apt get install y cloud guest utils 安装命令 growpart dev vda 1 扩容命令在线扩展磁盘 若报错 执行以下操作 LA
  • C语言动态内存开辟,malloc,calloc,free,realloc函数使用

    目录 一 内存的动态分配 1 函数malloc 2 函数calloc 3 函数realloc 4 函数free 关于动态内存错误的操作案例 一 内存的动态分配 1 函数malloc 函数原型 void malloc size t size
  • 为什么抖音总显示连不上服务器,抖音登录不上怎么回事

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 以抖音v12 5 0为例 抖音登录不上 一般来说都是由于网速过慢 无法连接抖音的服务器 网速过慢一般都是由于手机的信号过低 或者是处于在人群较多的地方 造成了手机的网速变慢
  • Euromap 63协议认识

    Euromap 63协议认识 一 用途 Euromap 63是欧洲塑料和橡胶机械制造商协会颁布的专用于注塑机和上位计算机进行数据交互的协议 全称 Euromap 63 SPI SPI 塑料工业协会 Euromap 63的目标是为不同制造商的
  • Arduino String.h库函数详解

    此库中包含 1 charAT 2 compareTo 3 concat 4 endsWith 5 equals 6 equalslgnoreCase 7 getBytes 8 indexOf 9 lastlndexOf 10 length
  • 控制理论个人学习笔记-非线性系统理论

    文章目录 非线性系统理论 非线性系统的一般概念 相平面基础 非线性系统的相平面分析 描述函数法基础 非线性系统的描述函数法分析 非线性系统理论 非线性系统的一般概念 典型非线性 死区 饱和 间隙 摩擦 继电特性 继电特性使得系统产生振荡 死
  • 利用Java访问WEB Service

    最近在学习Web Service 发现了一个国内的Web Service提供站点 其中最简单的是查询QQ在线状态服务 我通过Java直接发送SOAP请求文件访问Web Service成功 这种方式实现比较简单 不需要第三方的软件包 impo
  • STEP_7计数器相关

    计数器的使用
  • 阿里云服务器租用费用清单表(CPU内存带宽磁盘)

    阿里云服务器租用费用包括CPU内存 公网带宽和系统盘三部分 云服务器购买可以选择活动机型也可以选择自定义购买 活动机型配置固定选择不自由 自定义购买配置自由选择但是费用贵的一批 阿里云百科来详细说下云服务器1核2G 2核4G 4核8G 8核
  • VMware vSphere 6.7先睹为快

    vSphere是老朋友了 还用再多介绍吗 最新的好消息是 VMware vSphere推出了最新版本6 7 相较两年前推出的VMware vSphere 6 5版本 新增了很多强大的功能 作为业内领先的虚拟化和云平台 vSphere的一举一
  • nginx root&alias文件路径配置

    nginx指定文件路径有两种方式root和alias 这两者的用法区别 使用方法总结了下 方便大家在应用过程中 快速响应 root与alias主要区别在于nginx如何解释location后面的uri 这会使两者分别以不同的方式将请求映射到
  • 第4章 用GPT-2生成文本

    BERT 是基于双向 Transformer 结构构建 而 GPT 2 是基于单向 Transformer 这里的双向与单向 是指在进行注意力计算时 BERT会同时考虑被遮蔽词左右的词对其的影响 融合了双向上下文信息 它比较适合于文本生成类
  • IO流介绍和异常处理

    IO流 1 1IO的分类 根据数据的流向分为 输入流和输出流 输入流 把数据从其他设备上读取到内存中的流 输出流 把数据从内存中写到其他设备上的流 根据功能类型分为 字节流和字符流 字节流 以字节为单位 读写数据的流 字符流 以字符为单位