返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA IO流知识点全总结
  • 861
分享到

JAVA IO流知识点全总结

javaintellij-idea 2023-08-16 20:08:56 861人浏览 薄情痞子
摘要

文件的创建方式 首先查看File类的构造器,得出有三种常见的创建方式 直接传入构建的文件路径,通过构造器 File(String pathname),直接传入文件路径,以下为演示代码(在io流的操作中总是伴随着编译时异常,可使用Alt+E

文件的创建方式

首先查看File类的构造器,得出有三种常见的创建方式
在这里插入图片描述

直接传入构建的文件路径,通过构造器 File(String pathname),直接传入文件路径,以下为演示代码(在io流的操作中总是伴随着编译时异常,可使用Alt+Enter快捷键进行异常捕获或者抛出)

public void create01()  {    String filePath = "d:\\IOTest\\test1.txt";    File file = new File(filePath);    try {        file.createNewFile();        System.out.println("文件创建成功");    } catch (IOException e) {        e.printStackTrace();    }}

指定父目录文件,即指定文件夹文件+子路径文件,通过构造器File(File parent,String child)进行创建文件

public void create02() {    File parentFile = new File("d:\\IOTest");    String fileName = "test2.txt";    File file = new File(parentFile, fileName);    try {        file.createNewFile();        System.out.println("创建成功");    } catch (IOException e) {        e.printStackTrace();    }}

直接指定父目录和文件名称,通过构造器 File(String parent,String child)

public void create03() {    String parentPath = "d:\\IOTest";    String fileName = "test3.txt";    File file = new File(parentPath, fileName);    try {        file.createNewFile();        System.out.println("创建成功");    } catch (IOException e) {        e.printStackTrace();    }}

常用的文件操作

查看文件信息

File 文件类的api文档,从中我们可以看到File类提供了许多api供我们查看文件信息,无需死记硬背,需要查阅api文档即可

在这里插入图片描述

以下是获取文件常用信息的api示例

public void info(){    File file = new File("d:\\IOTest\\test1.txt");    System.out.println("文件名字="+file.getName());    System.out.println("文件的绝对路径="+file.getAbsolutePath());    System.out.println("文件父级目录="+file.getParent());    System.out.println("文件大小(字节)="+file.length());    System.out.println("文件是否存在="+file.exists());    System.out.println("是不是一个文件="+file.isFile());    System.out.println("是不是一个目录="+file.isDirectory());}

在这里插入图片描述

文件删除

只要指定文件路径,创建File对象,调用delete方法即可完成删除,删除目录时,需要保证目录为空目录,否则会删除失败,但不会抛出异常

String filePath = "d:\\IOTest\\test2.txt";File file = new File(filePath);if(file.exists()){    if(file.delete()){        System.out.println(filePath+"删除成功");    }else{        System.out.println(filePath+"删除失败");    }}else{    System.out.println("该文件不存在...");}

创建目录

创建一级目录可以直接调用mkdir(),即可成功创建,但如果是创建多级目录,就需要采用mkdirs,否则会创建目录失败,但不会抛出异常

public void m3(){    String directoryPath = "D:\\demo\\a\\b\\c";    File file = new File(directoryPath);    if(file.exists()){        System.out.println(directoryPath+"存在...");    }else{        if(file.mkdirs()){            System.out.println(directoryPath+"创建成功...");        }else{            System.out.println(directoryPath+"创建失败");        }    }}

IO 流原理及流的分类

IO概念

I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输、网络通信、读写文件,java.io包中提供了各种流的接口的类和接口,用以处理不同的数据,并通过api输入或输出数据

输入 Input:指的是数据从磁盘中输入到内存中来

输出 Output:指的是数据从内存输出到磁盘中去

IO流的分类

按操作数据类型分类:分为字节流(处理二进制文件如音频、图片、视频等)和字符流(处理文本)

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

按流的角色不同分类:节点流,处理流/包装流(装饰器模式)

抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

文件与流

文件与流就相当于商品与包裹之间的关系,商品需要包装成包裹才能运输,而文件中的信息也需要转化为流才能在磁盘与内存之间传输而包裹里面已经包含了商品,如果复制商品的话,只需要复制一份一模一样的包裹即可,这也是为什么在复制文件时,只需要复制文件相应的输入流到输出流中,原因就是输入流已经有文件的全部信息,才能进行拷贝文件

IO流常用类

字节输入流 InputStream

InputStream作为抽象父类主要有以下子类

在这里插入图片描述

FileInputStream输入流

d盘提前准备好写有hello world的hello.txt文件,此时读入的整数均为每个字符的ASCII值,read方法在读取到文件末尾会返回-1表示已无字节可读

 String filePath = "d:\\hello.txt";        int readDate = 0;        //提升作用域,用于在finally关闭输入流        FileInputStream fileInputStream = null;        try {            fileInputStream = new FileInputStream(filePath);            //一次读入一个字节,读到最后返回-1,表示无数据            while ((readDate = fileInputStream.read()) != -1) {                //每次将读入的字节数据转化为字符并输出                System.out.print((char) readDate);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                //关闭流                fileInputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }

在这里插入图片描述

上述方式带来了一个问题,就是每次从内存访问磁盘,只能读取一个字节,11个字节就要访问11次磁盘,学过操作系统的同学都知道,从内存访问磁盘本身这一行为就十分耗费时间,所以java的设计者为了解决这一问题,在FileInputStream的read()方法提供了一个缓冲区的方法重载,即可指定缓冲区的大小来决定一次访问磁盘能够读入的字节数量,从而减少了访问磁盘次数,优化性能。

  String filePath = "d:\\hello.txt";        int readDate = 0;//        指定一个8字节的字节数组作为缓冲区        byte[] buf = new byte[8];        FileInputStream fileInputStream = null;        int readLen = 0;        try {            fileInputStream = new FileInputStream(filePath);            while ((readLen = fileInputStream.read(buf)) != -1) {//                每次将读取到的字节数据转为字符串输出                System.out.print(new String (buf,0,readLen));            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                fileInputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }

我们可以看到,在缓冲区字节数组中直接读入了8个字符的ASCII

在这里插入图片描述

而没有缓冲区的每次只能读入一个,性能差距较大
在这里插入图片描述

字节输出流OutputStream

FileOutputStream

在这里插入图片描述

FileOutputStream的写入方式默认为覆盖原文件的内容,如果要采用追加写入的方式要在创建对象时将append赋值为true开启追加写入模式,同时在文件不存在时,会自动创建文件,但要保证目录是存在的

在这里插入图片描述

String filePath = "d:\\IOTest\\outTest.txt";FileOutputStream fileOutputStream = null;try {    fileOutputStream = new FileOutputStream(filePath,true);    String str = "hello,world";    fileOutputStream.write(str.getBytes());} catch (IOException e) {    e.printStackTrace();} finally {    try {        fileOutputStream.close();    } catch (IOException e) {        e.printStackTrace();    }

利用FileOutputStream和FileInputStream实现文件拷贝

总体步骤分为两步

  1. 创建文件的输入流 , 将文件读入到程序
  2. 创建文件的输出流, 将读取到的文件数据,写入到指定的文件
 //文件路径        String srcFilePath = "D:\\IOTest\\3e405d5c5b640f81caac8b4e551f7f33841232cd_raw.jpg";        //拷贝的文件路径        String destFilePath = "D:\\IOTest\\kakaxi.jpg";        //输出流        FileOutputStream fileOutputStream = null;        //输入流        FileInputStream fileInputStream = null;        try {            fileInputStream = new FileInputStream(srcFilePath);            fileOutputStream = new FileOutputStream(destFilePath);            //开辟1024个字节的缓冲区            byte[] buf = new byte[1024];            int readLen = 0;            while ((readLen = fileInputStream.read(buf)) != -1){                //将读到的文件信息写入新文件                fileOutputStream.write(buf,0,readLen);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                //判断非空,防止出现空指针异常            if(fileInputStream!=null){                    fileInputStream.close();                }            if(fileOutputStream!=null){                fileOutputStream.close();            }}catch (IOException e) {                e.printStackTrace();            }        }

文件正常拷贝

在这里插入图片描述

字符输入流 FileReader

相关API

在这里插入图片描述

代码示例

String filePath = "d:\\IOTest\\story.txt";FileReader fileReader = null;int date = 0;try {    fileReader= new FileReader(filePath);    while((date = fileReader.read())!=-1){        System.out.print((char)date);    }} catch (IOException e) {    e.printStackTrace();}finally {    try {        fileReader.close();    } catch (IOException e) {        e.printStackTrace();    }}

字符流就是专门为了处理文本文件,我们可以看到经过FileReader读取的字符,中文字符叶没有出现乱码,注意read方法返回的是字符的ASCII值,FileReader也能指定缓冲区,这里不重复说明

在这里插入图片描述

字符输出流FileWriter

相关API

在这里插入图片描述

代码示例

 String filePath = "d:\\IOTest\\note.txt";        FileWriter fileWriter = null;        char[] chars = {'a', 'b', 'c'};        try {            fileWriter = new FileWriter(filePath);            fileWriter.write('H');            fileWriter.write("学java狠狠赚一笔");            fileWriter.write(chars);        } catch (IOException e) {            e.printStackTrace();        } finally {            try {//                对于FileWriter,一定要关闭流,或者flush才能真正将数据写入到文件中                fileWriter.close();            } catch (IOException e) {                e.printStackTrace();            }        }

在这里插入图片描述

为什么要一定关闭流或者执行flush,才会真正写入数据

原因是在执行close之后,FileWriter才会真正调用底层接口进行数据写入

在这里插入图片描述

节点流和处理流

概念

节点流:可以从一个特定的数据源(文件)读写数据,如前面的FileInputStream,FileWriter

处理流:建立在已存在的流的基础上,为程序提供更为强大的读写功能,即利用修饰器设计模式,拓展了原始流的功能,使其更加强大,如BufferedReader,BufferedWriter

处理流原理

处理流为什么能封装原始的节点流以BufferedWriter为例

FileWriter继承了Writer类,BufferedWriter也继承了Writer类

在这里插入图片描述

而BufferedWriter的成员属性out的数据类型是Writer可以接收FilerWriter的对象,这正是多态的体现。这说明了,我们可以封装任意一个节点流,只要该节点流对象是Writer的子类即可,BufferedReader同理。

在这里插入图片描述

处理流作用

处理流的功能主要体现在以下两个方面:

  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,比如自带缓冲区,提高读取性能,使用更加灵活方便。

BufferedReader

相关API

在这里插入图片描述

代码示例

在创建BufferedReader对象时,需要传入相应的节点流对象,关闭外层流即可,调用BufferedReader的close方法底层也会调用节点流的close方法进行流的关闭

String filePath = "d:\\IOTest\\note.txt";BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));String line = "";//按行读取效率高,返回null时表示读取完成while((line=bufferedReader.readLine())!=null){    System.out.println(line);}//关闭外层流即可bufferedReader.close();

BufferedWriter

相关API

在这里插入图片描述

代码示例

String filePath = "d:\\IOTest\\ok.txt";BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));bufferedWriter.write("hello,你好世界~");bufferedWriter.newLine();//系统换行bufferedWriter.write("hello,你好~");bufferedWriter.newLine();bufferedWriter.write("hello,你好世界~");bufferedWriter.newLine();bufferedWriter.close();

在这里插入图片描述

BufferedOutputStream与BufferedInputStream

BufferedInputStream:字节流,在创建BufferedInputStream时会自动创建一个缓冲区数组也就是不用我们手动创建缓冲区

BufferedOutputStream:字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统

对象处理流

用途

当我们在保存数据的时候需要保存其类型,又要在文件中恢复对象或者该数据类型时,即要能够将基本数据类型或者对象进行序列化和反序列化操作,此时要用对象处理流进行数据操作

序列化和反序列化

序列化:序列化就是在保存数据时,保存数据的值和数据类型

反序列化:反序列化就是在恢复数据时,恢复数据的值和数据类型

实现序列化的条件

类要实现序列化,要实现Serializable接口,java的基本数据类型的包装类都实现了Serializable接口。

ObjectOutputStream

相关API

提供了一系列api,方便我们输出基本数据类型和自定义类

在这里插入图片描述

代码示例
 public static void main(String[] args) throws Exception{        String filePath = "d:\\IOTest\\data.dat";        ObjectOutputStream oos =                new ObjectOutputStream(new FileOutputStream(filePath));        oos.writeInt(100);        oos.writeBoolean(true);        oos.writeChar('a');        oos.writeDouble(9.5);        oos.writeUTF("jack");        oos.writeObject(new Dog("旺财",10));        oos.close();        System.out.println("数据保存完毕(序列化形式)");    }}class Dog implements Serializable {    private String name;    private int age;    public Dog(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Dog{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

由于是字节流,未转化编码故为乱码,但我们仍可以看到类型为Dog

在这里插入图片描述

ObjectInputStream

相关API

在这里插入图片描述

代码示例

String filePath = "d:\\IOTest\\data.dat";ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));System.out.println(ois.readInt());System.out.println(ois.readBoolean());System.out.println(ois.readChar());System.out.println(ois.readDouble());System.out.println(ois.readUTF());Object dog = ois.readObject();System.out.println("运行类型为:"+dog.getClass());System.out.println(dog);ois.close();System.out.println();

在这里插入图片描述

转化流

必要性

当我们通过FileInputStream读取文件时,读到中文时,会出现乱码,如图中的狠狠赚一笔就变成乱码,所以需要转化流来指定编码格式

在这里插入图片描述

InputStreamReader

InputStreamReader作为Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)

构造方法和API

最大的特点即是我们可以指定流的编码格式

在这里插入图片描述

代码示例

String filePath = "d:\\IOTest\\note.txt";//创建输入转化流InputStreamReader对象,同时指定编码为utf-8InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filePath), "utf-8");//包装成BufferedReader对象进行字符读取操作BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String s = bufferedReader.readLine();System.out.println("读取内容="+s);bufferedReader.close();

我们又可以看到狠狠赚一笔了

在这里插入图片描述

OutputStreamWriter

OutputStreamWriter:Writer的子类,实现将OutputStream(字节流包装成Writer

构造方法和相关API

在这里插入图片描述

代码示例

String filePath = "d:\\IOTest\\hello.txt";//指定编码String charSet="utf8";//包装流OutputStreamWriter outputStreamWriter =        new OutputStreamWriter(new FileOutputStream(filePath), charSet);outputStreamWriter.write("hello world 你好世界");outputStreamWriter.close();System.out.println("按照 "+charSet+" 保存文件成功~");

在这里插入图片描述

打印流

PrintStream与PrintWriter

相关API

PrintStream默认打印内容到显示器上,但我们可以通过构造器指定输出的位置,比如将内容输出到文件中

在这里插入图片描述

代码示例

PrintStream out = System.out;out.print("john,hello");out.write(" 你好".getBytes());out.close();//修改输出位置System.setOut(new PrintStream("d:\\f1.txt"));System.out.println("hello,你好世界");

来源地址:https://blog.csdn.net/weixin_64133130/article/details/132125747

--结束END--

本文标题: JAVA IO流知识点全总结

本文链接: https://lsjlt.com/news/372081.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JAVA IO流知识点全总结
    文件的创建方式 首先查看File类的构造器,得出有三种常见的创建方式 直接传入构建的文件路径,通过构造器 File(String pathname),直接传入文件路径,以下为演示代码(在IO流的操作中总是伴随着编译时异常,可使用Alt+E...
    99+
    2023-08-16
    java intellij-idea
  • Java IO流之节点流与字符流的相关知识总结
    一、File file是文件和目录路径名的抽象表示 1.1 File的用法 用法: File file = new File("路径名"); //如 File file =...
    99+
    2024-04-02
  • Java知识点--IO流(下)
    Java知识点--IO流(下) 🎈 一、节点流和处理流1️⃣基本介绍2️⃣节点流和处理流一览图3️⃣节点流和处理流的区别和联系4️⃣处理流的功能主要体现在以下两个方面: ...
    99+
    2023-09-11
    java 开发语言 jvm
  • Java IO知识点
    1:file:文件的创建和删除;File file=new File("D:word.txt");绝对路径 File file=new File("word.txt");相对路径 if(!file.exists()) { file.crea...
    99+
    2015-11-04
    java教程 Java
  • Java多线程知识点全面总结
    目录Java多线程知识点总结(1)什么是进程什么是线程?(2)多线程的运行状态(3)线程的创建和使用(4)Runnable 接口实现多线程(5)Callable接口实现多线程多线程常...
    99+
    2024-04-02
  • Java线程池全面知识点总结
    本篇内容介绍了“Java线程池全面知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原理线程池的原理非常简单,这里用处理流程来概括:线...
    99+
    2023-06-25
  • java中Supplier知识点总结
    1、说明 这个接口是提供者的意思,只有一个抽象的get,没有默认的方法和静态的方法,导入一个泛T,get方法,返回一个泛T。 supplier也用于创建对象,但与传统的创建对象语法不...
    99+
    2024-04-02
  • JAVA基础知识点总结
    文章目录 前言一、JAVA简介二、基础语法面向对象StringIntegerObject异常IO序列化Java 泛型注解反射 前言 一、JAVA简介 Java 是一门面向对象的编程语言。 语言特点:面向对象,平台无关性,支持多...
    99+
    2023-08-18
    java jvm 开发语言
  • Java全面解析IO流相关知识
    目录前言一、File1.File类的概述和构造方法2.File类创建功能3.File类判断和获取功能4.File类删除功能二、字节流1.IO流的概述和分类2.字节流写数据3.字节流写...
    99+
    2024-04-02
  • Java运算符知识点总结
    本篇内容介绍了“Java运算符知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 运算符计算机的最基本用途之一就是执行数学运算...
    99+
    2023-06-02
  • JAVA的IO流相关知识点有哪些
    今天小编给大家分享一下JAVA的IO流相关知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.Input和Outp...
    99+
    2023-06-03
  • Java泛型最全知识总结
    目录一、泛型简介1.1 泛型的概念 1.2 泛型的引入背景1.3 引入泛型的目的二、泛型在集合中的应用2.1 在集合中没有使用泛型的例子2.2 在集合中使用泛型的例子12.3 在集合...
    99+
    2024-04-02
  • MySQL知识点总结
    MySQL知识点总结 一、      MySQL常用命令 启动MySQL服务:service mysqld start 或 systemctl start mysqld.service 停止MySQL服务:service mys...
    99+
    2019-07-01
    MySQL知识点总结
  • MongoDB知识点总结
    一:MongoDB 概述    一、NoSQL 简介        1. 概念:NoSQL(Not Only SQL的缩写),指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。用于超大规模数据的存储,数据存...
    99+
    2019-04-03
    MongoDB知识点总结
  • Python知识点总结
    本篇内容介绍了“Python知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 为什么要使用描述符?假想你正在给学校写一个成绩管理...
    99+
    2023-06-16
  • 详解Java泛型(知识点总结)
    概念来源:Java在设计开始之前不是通用的,直到它在JDK 1.5中被引入。Java泛型是通过擦除实现的。你知道什么是擦除吗?往下看。概念:常规类和方法只能使用特定类型;基本类型或自定义类。如果要编写可应用于多种类型代码的代码,这种严格的限...
    99+
    2021-05-06
    java入门 Java 泛型
  • Java面试问题知识点总结
    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结(阅读本文需要有一定的Java基础;若您初涉Java,可以通过这些问题建立起对Java初步的印象,待有了一定基础后再后过头来看收获会更大),喜欢的朋友可以参考下。1. Java中的原...
    99+
    2023-05-31
    java 面试 ava
  • Java中的引用知识点总结
    本篇内容介绍了“Java中的引用知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!强引用:默认情况下,对象采用的均为强引用(这个对象的...
    99+
    2023-06-05
  • 总结DOM的知识点
    这篇文章主要介绍“总结DOM的知识点”,在日常操作中,相信很多人在总结DOM的知识点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”总结DOM的知识点”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • Java线程池必知必会知识点总结
    目录1、线程数使用开发规约2、 ThreadPoolExecutor源码1. 构造函数2.核心参数3.execute()方法3、线程池的工作流程4、Executors创建返回Thre...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作