JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

简介: JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

文章目录


IO流简介

IO流原理

流的分类

IO 流体系

节点流和处理流

节点流操作


IO流简介


I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。


Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。


java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。


IO流原理


输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。


输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。


fc736e57659440788d1bdf865cc1ddb9.png


流的分类


①按操作数据单位不同分为:字节流(8 bit 一般用于非文本文件),字符流(16 bit 一般用于文本文件)


②按数据流的流向不同分为:输入流,输出流(相对的)


③按流的角色的不同分为:节点流(直接处理文件),处理流(处理被包含的流)


f4191bb406064c2a98ac7bea771357e5.png


IO 流体系


Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。

由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。


c381bb3de82a40b690b6caf18105c9ca.png59001466d96346babbd3459beb55d260.png


节点流和处理流


节点流:直接从数据源或目的地读写数据


d38b6944febe4012bc43488df707d3c9.png


处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。


e288f274aadb4700b8ed58599a24e9e3.png


节点流操作


读入以FileReader为例


import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileReader fileReader = null;
        try { //一定需要try-catch
            //1、实例化File对象,指明要操作的文件
            File file = new File("IO\\hello.txt");
            //2、提供具体的流
            fileReader = new FileReader(file);
            //3、读取操作
            int read = fileReader.read(); //空参为一位一位读取,末尾返回-1
            while (read != -1){
                System.out.print((char) read);
                read = fileReader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、关闭流
            try {
                if (fileReader != null) { //确保不会因具体流未创建而产生空指针异常
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


4947e84932dc4b809cb2cf7ff9afc634.png


import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileReader fileReader = null;
        try { //一定需要try-catch
            //1、实例化File对象,指明要操作的文件
            File file = new File("IO\\hello.txt");
            //2、提供具体的流
            fileReader = new FileReader(file);
            //3、读取操作
            char[] chars = new char[5];
            //char型数组为参数,该数组相当于一个容器,把读取放在里面,返回该次读取的个数,末尾返回-1
            // 最后若不够,容器后部分仍为上一次取的,前部分则被新的这次取到的覆盖了
            int length = fileReader.read(chars);
            while (length != -1){
                for (int i = 0; i < length; i++) {
                    System.out.print(chars[i]);
                }
                length = fileReader.read(chars);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、关闭流
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


写出以FileWriter为例


import java.io.*;
/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileWriter fw1 = null; //若硬盘中不存在file,创建之;若存在,内容覆盖之
        try {
            //1、实例化File对象,指明要写出的文件
            File file = new File("IO\\hi.txt");
            //2、创建具体的流
            fw1 = new FileWriter(file);
            //FileWriter fw2 = new FileWriter(file,false); //若硬盘中不存在file,创建之;若存在,内容覆盖之
            //FileWriter fw3 = new FileWriter(file,true); //若硬盘中不存在file,创建之;若存在,内容追加之
            //3、写出操作
            fw1.write("Hello World!\n",0,5); //写出“Hello”
            fw1.write("你好,世界!"); //写出“你好,世界!”
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、关闭流
            try {
                if (fw1 != null) fw1.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


实现一个图片复制(读入写出,使用字节流)


import java.io.*;
/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File inFile = new File("IO\\input.jpg");
            File outFile = new File("IO\\output.png");
            fis = new FileInputStream(inFile);
            fos = new FileOutputStream(outFile);
            byte[] bytes = new byte[1024]; //通常使用1024,2的10次方
            int length = fis.read(bytes);
            while (length != -1){
                fos.write(bytes,0,length);
                length = fis.read(bytes);
            }
        } 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月前
io流分类
按流向分类: 输入流:用于从数据源(如文件、键盘)读取数据。 输出流:用于向目标(如文件、屏幕)写入数据。 按操作类型分类: 字节流:以字节为单位进行操作,适用于所有类型的数据。 字符流:以字符为单位进行操作,更便于处理文本数据。
16 4
|
2月前
|
Java Linux 索引
IO的分类有哪些
IO的分类有哪些
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
66 0
|
7月前
|
设计模式 缓存 Java
【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南( 实现可伸缩IO专题)— 上
【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南( 实现可伸缩IO专题)— 上
81 0
|
6月前
|
存储 缓存 NoSQL
Redis为什么速度快:数据结构、存储及IO网络原理总结
Redis为什么速度快:数据结构、存储及IO网络原理总结
|
7月前
|
存储 Java API
【JAVA学习之路 | 进阶篇】IO流及流的分类
【JAVA学习之路 | 进阶篇】IO流及流的分类
|
7月前
|
缓存 Java 数据库
深入理解 Java IO 流:原理与应用
【4月更文挑战第4天】Java IO 浴是处理文件和数据输入输出的关键,涉及数据传输和处理。核心概念包括输入流(从源头读取)和输出流(写入目标),由InputStream和OutputStream接口定义基础操作。具体实现如FileInputStream和FileOutputStream用于文件操作,BufferedInputStream和BufferedOutputStream提升性能。IO流广泛应用于文件操作、网络通信、数据库交互和系统交互。其优点在于灵活性、可扩展性和高效性。使用时注意关闭流、处理异常及选择合适流实现。理解IO流原理和应用能提升编程效率和程序性能。
184 1
|
7月前
|
传感器 编解码 C语言
【软件设计师备考 专题 】IO设备、通信设备的性能,以及基本工作原理
【软件设计师备考 专题 】IO设备、通信设备的性能,以及基本工作原理
105 1
|
7月前
|
Java 大数据 数据库
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
|
7月前
|
NoSQL 架构师 网络协议
Redis系列-15.Redis的IO多路复用原理解析(上)
Redis系列-15.Redis的IO多路复用原理解析
315 1