Java IO流之原理分类与节点流文件操作详解

 更新时间:2021年10月06日 13:28:28   作者:叶绿体不忘呼吸  
流(Stream)是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道,数据源发送的数据经过这个通道到达目的地,按流向区分为输入流和输出流

IO流简介

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

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

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

IO流原理

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

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

在这里插入图片描述

流的分类

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

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

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

在这里插入图片描述

IO 流体系

Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

在这里插入图片描述

在这里插入图片描述

节点流和处理流

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

在这里插入图片描述

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

在这里插入图片描述

节点流操作

读入以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();
            }
        }
    }
}

在这里插入图片描述

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.jpg");

            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();
            }
        }
    }
}

到此这篇关于Java IO流之原理分类与节点流文件操作详解的文章就介绍到这了,更多相关Java IO流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Config使用本地仓库及map注入

    SpringCloud Config使用本地仓库及map注入

    这篇文章主要介绍了SpringCloud Config使用本地仓库及map注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • JavaWeb中web.xml初始化加载顺序详解

    JavaWeb中web.xml初始化加载顺序详解

    本篇文章主要介绍了JavaWeb中web.xml初始化加载顺序详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java JDK动态代理的基本原理详细介绍

    Java JDK动态代理的基本原理详细介绍

    这篇文章主要介绍了Java JDK动态代理的基本原理详细介绍的相关资料,这里对动态代理进行了详解并附简单实例代码,需要的朋友可以参考下
    2017-01-01
  • JVM常用垃圾收集器及GC算法解读

    JVM常用垃圾收集器及GC算法解读

    这篇文章主要介绍了JVM常用垃圾收集器及GC算法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java中的集合工具类Collections详解

    Java中的集合工具类Collections详解

    这篇文章主要介绍了Java中的集合工具类Collections详解,java.utils.Collections是集合工具类,用来对集合进行操作,不是Collection集合的根接口,这个要区分开来,需要的朋友可以参考下
    2024-01-01
  • SpringSecurity+JWT实现前后端分离的使用详解

    SpringSecurity+JWT实现前后端分离的使用详解

    这篇文章主要介绍了SpringSecurity+JWT实现前后端分离的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Jenkins之Log Parse使用方法详解

    Jenkins之Log Parse使用方法详解

    这篇文章主要为大家详细介绍了Jenkins插件Log Parse使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Spring Boot中的过滤器拦截器监听器使用技巧汇总

    Spring Boot中的过滤器拦截器监听器使用技巧汇总

    本文将介绍在Spring Boot应用程序中使用过滤器、拦截器和监听器的使用技巧,我们将讨论它们之间的区别,以及何时使用它们,我们还将提供代码示例,以帮助您在自己的应用程序中使用它们
    2023-12-12
  • java通过复选框控件数组实现添加多个复选框控件示例分享

    java通过复选框控件数组实现添加多个复选框控件示例分享

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节
    2014-02-02
  • Java微信支付之关闭订单

    Java微信支付之关闭订单

    这篇文章主要为大家详细介绍了Java微信支付之关闭订单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论