Java之IO流(字节流字符流)

目录

一、IO流概述

(一)、什么是IO流

 (二)、IO的分类

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

2、格局数据的类型分为:字节流和字符流。

3、按流操作的对象分为:节点流与处理流

(三)、IO流的顶级父类

二、字节流

(一)、 一切皆为字节

(二)、字节输出流【OutputStream】 

(三)、 FileOutputStream类

1、概述

2、构造方法:

3、写入数据的方法

4、写出换行

(四)、 字节输入流【InputStream】

(五)、 FileInputStream类

1、概述

2、构造方法

3、读取数据的方法

4、循环读取

三. 字符流 

(一)、字符输入流【Reader】

(二)、FileReader类 

1、概述

2、构造方法

3、读取字符数据的方法

(三)、字符输出流【Writer】 

(四)、FileWriter类

1、概述

2、构造方法

3、写出数据的方法

4、关闭和刷新

四. IO异常的处理

1、JDK7前处理

2、JDK7的处理(扩展知识点了解内容)

3、JDK9的改进(扩展知识点了解内容)


一、IO流概述

(一)、什么是IO流

O流是Java提供的一种用于读写数据的机制。IO流分为输入流和输出流两种。输入流用于从外部读取数据到程序中,输出流用于将程序中的数据输出到外部。

Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。

输入也叫做读取数据,输出也叫做作写出数据

 (二)、IO的分类

1、根据数据的流向分为:输入流输出流
  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存中写出到其他设备上的流。
2、格局数据的类型分为:字节流字符流
  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。
3、按流操作的对象分为:节点流处理流
  • 节点流:直接对文件操作的流 特点:这种流直接操作文件,一般用于文件读或者写
  • 处理流:操作其他流对象的流 特点:这种流不能直接操作文件 ,只能操作其他流对象,一般用于转换流的类型

(三)、IO流的顶级父类

  1. InputStream    ----->        字节输入流

  2. OutputStream ----->        字节输出流

  3. Reader             ----->        字符输入流

  4. Writer               ----->        字符输出流

二、字节流

(一)、 一切皆为字节

        一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

(二)、字节输出流【OutputStream】 

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

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • 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类

1、概述

        FileOutputStream类是Java中用于将数据写入文件的类。它属于Java IO库中的一部分,位于java.io包中。FileOutputStream类提供了多个构造方法,可以根据需要选择不同的构造方法来创建输出流。

2、构造方法:
  1. FileOutputStream(String name):根据文件名创建输出流。
  2. FileOutputStream(String name, boolean append):根据文件名创建输出流,并指定是否在文件末尾添加数据。
  3. FileOutputStream(File file):根据File对象创建输出流。
  4. FileOutputStream(File file, boolean append):根据File对象创建输出流,并指定是否在文件末尾添加数据。
3、写入数据的方法

4、写出换行
  • 回车符\r和换行符\n :
    • 回车符:回到一行的开头(return)。
    • 换行符:下一行(newline)。
  • 系统中的换行:
    • Windows系统里,每行结尾是 回车+换行 ,即\r\n
    • Unix系统里,每行结尾只有 换行 ,即\n
    • Mac系统里,每行结尾是 回车 ,即\r。从 Mac OS X开始与Linux统一。

(四)、 字节输入流【InputStream】

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

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read(): 从输入流读取数据的下一个字节。
  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

(五)、 FileInputStream类

1、概述

        FileInputStream类是Java中用于读取文件数据的类。它继承自InputStream类,并提供了一些额外的方法来读取文件中的字节数据。

2、构造方法
  • FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
3、读取数据的方法

4、循环读取
public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("StreamProgram\\a.txt");

    int b;
    while ((b = fis.read()) != -1) {
        System.out.println((char) b);
    }

    fis.close();
}

三. 字符流 

(一)、字符输入流【Reader】

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

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

(二)、FileReader类 

1、概述

java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

2、构造方法
  • FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。
3、读取字符数据的方法

(三)、字符输出流【Writer】 

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

  • void write(int c) 写入单个字符。
  • void write(char[] cbuf)写入字符数组。
  • abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
  • void write(String str)写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
  • void flush()刷新该流的缓冲。
  • void close() 关闭此流,但要先刷新它。

(四)、FileWriter类

1、概述

java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

2、构造方法
  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
3、写出数据的方法

4、关闭和刷新

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

  • flush:刷新缓冲区,流对象可以继续使用。
  • close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

四. IO异常的处理

1、JDK7前处理

public class HandleException1 { 
    public static void main(String[] args) { 
        // 声明变量 
        FileWriter fw = null; 

        try { 
            //创建流对象 
            fw = new FileWriter("fw.txt"); 
            // 写出数据 
            fw.write("IO中的异常"); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } finally { 
            try { 
                if (fw != null) { 
                    fw.close(); 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 

    } 
}

2、JDK7的处理(扩展知识点了解内容)

public class HandleException2 { 
    public static void main(String[] args) { 
        // 创建流对象 
        try ( FileWriter fw = new FileWriter("fw.txt"); ) { 
            // 写出数据 
            fw.write("IO中的异常");
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

3、JDK9的改进(扩展知识点了解内容)

public class TryDemo { 
    public static void main(String[] args) throws IOException { 
        // 创建流对象 
        FileReader fr = new FileReader("in.txt"); 
        FileWriter fw = new FileWriter("out.txt"); 

        // 引入到try中 
        try (fr; fw) { 
            // 定义变量 
            int b; 
            // 读取数据 
            while ((b = fr.read())!=-1) { 
                // 写出数据 
                fw.write(b); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04 LTS上安装Docker-ce

在Ubuntu 22.04 LTS上安装Docker-ce Docker是一个开源平台,用于自动化应用程序的部署、扩展和管理。它使用容器技术,使开发、测试和部署过程更加简化和可靠。本文将介绍在Ubuntu 22.04 LTS上安装Docker-ce的步骤。 步骤1:更新软件包列表 …

CanOpen协议栈从入门到精通资源全含STM32服务器、客户端Demo例程注释详尽

CANOpen从入门到精通 介绍 工作的原因,在STM32H743FreeRTOS上移植了CANOpen协议栈,使用的CANFestival框架 CANOpen协议栈网上的资源有点乱,没有一个完整的系统的教程,以至于初学者学起来非常的困难,被各种各样的术语…

Unity 3D定点数物理引擎实战系列1.1BEPUphysicsint 3D定点数物理引擎介绍

1.1BEPUphysicsint 3D定点数物理引擎介绍 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀 帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就…

揭秘车载测试:小白也能轻松学习

在现代汽车技术的发展中,车载测试起着至关重要的作用。但是,对于很多人来说,车载测试可能还是一个相对陌生的概念。不用担心!接下来将带你一起深入了解车载测试,并分享一些小白也能轻松学习的方法和技巧! 一…

C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区

1、存储区概念 欧姆龙PLC将整个数据存储器分为10个区:输入继电器区、输出继电器区、内部辅助继电器区、特殊继电器区、保持继电器区、暂存继电器区、定时/计数器区、数据存储区、辅助存储继电器区、链接继电器区。 输入输出继电器区 CP1E系列PLC输入继电器区有16…

【Java】深入理解i++、++i

先看两个例子 示例一 public class Test {public static void main(String[] args) {int i 0;int j i;System.out.println("i" i);System.out.println("j" j);} } 示例二 public class Test {public static void main(String[] args) {int i 0;i…

.Net Core webapi RestFul 统一接口数据返回格式

在RestFul风格盛行的年代,大部分接口都需要一套统一的数据返回格式,那么我们怎么才能保证使用统一的json数据格式返回呢,下面给大家简单介绍一下: 假如我们需要接口统一返回一下数据格式: {"statusCode": …

LEFT JOIN

通過中間表説明 biz_email_sent table1 biz_email table2 biz_email_sent_address 中間表 LEFT JOIN 是 JOIN 左邊的記錄(biz_email_sent id52)全部查出,比如52 的記錄全部查出。 即使中間表se.sa_email_id 在 table2中找不到&#xff0c…

Centos7配置静态ip地址

目录结构 Centos7配置静态ip地址查看网关进入存放ip地址的目录修改ip地址的文件重启网络检查ip地址 Centos7配置静态ip地址 查看网关 编辑–>虚拟网络编辑器–>NAT设置 记住这个网关地址 进入存放ip地址的目录 cd /etc/sysconfig/network-scripts/ 修改ip地址的文件 …

Windows下安装MongoDB实践总结

本文记录Windows环境下的MongoDB安装与使用总结。 【1】官网下载 官网下载地址:Download MongoDB Community Server | MongoDB 这里可以选择下载zip或者msi,zip是解压后自己配置,msi是傻瓜式一键安装。这里我们分别对比进行实践。 【2】ZI…

LeetCode 19 删除链表的倒数第 N 个结点

题目描述 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1…

什么是OEM分区?能不能删除OEM分区?

在某些电脑中,打开磁盘管理时会发现有一个OEM分区,那么这个OEM分区是什么意思呢?能不能删除呢?下面我们就来了解一下。 什么是OEM分区? OEM分区通常是品牌机厂商预装系统或软件以及一键还原的分区。OEM分区中的文件可…

在线更换Proxmox VE超融合集群Ceph OSD磁盘

因为资源紧张的原因,担心一旦关机,虚拟机因为没有空闲的资源而被冻结,以致于不能漂移,导致部分服务停止,只好让机房帮忙热插拔。 幸运的是,插上去能够被系统所识别(/dev/sdf就是新插入的硬盘&am…

【MYSQL】-表的操作

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

acwing-蓝桥杯C++ AB组辅导课Day2-递归习题+递推+二分

感谢梦翔老哥的蓝桥杯C AB组辅导课~ 递归习题: 1.递归实现组合型枚举 题意: 题目要求输出组合枚举,与排列不同,排列具有顺序之分,对于组合来说,是没有顺序之分的,所以[1,2,3]和[3,2,1]被看成同…

PyQt6 QTableWidget表格控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

神经网络:优化器和全连接层

SGD(随机梯度下降) 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子:梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低…

23年12月AI烟火识别系统应用案例-北京梅兰芳故居防火系统

AI烟火识别智能视频分析系统在文化遗产保护领域的应用,尤其是在梅兰芳故居防火系统的部署,是现代科技与传统文化保护结合的典范。这篇文章将详细介绍富维烟火识别系统的设计、实施及其在23年12月在北京梅兰芳故居中的应用。 背景介绍 ● 梅兰芳故居的重要…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发,一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序,在unbuntu的repo中有2.2.0版本可用,在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装,但感觉上2.2.0和2…

【实时绘画】comfyUI 实时绘画工作流 - 投屏

原理:(可用方案) 1:利用DesignDoll(人体控制模型)comfyUI实现 实时绘制人物对话场景 2:利用krita投影 实时绘制 场景人物 3:利用posemy.art进行实时绘画 设置有关模型。如果要开启lora&#xff…