zl程序教程

您现在的位置是:首页 >  后端

当前栏目

『Java练习生的自我修养』java-se进阶⁵ • 常用IO流

JAVAIO 常用 进阶 自我 SE 修养
2023-09-11 14:20:00 时间

header

⛅⛅书接上回⛅⛅

IO之大,一篇文章放不下~ 前面我们已经对IO流有了一个大致的了解,在本文中我们先对上一篇文章中学到的内容做一个简单的总结,并将进一步学习各种IO流的使用方法。

🚀传送门🚀: 『Java练习生的自我修养』java-se进阶⁴ • IO流概览

💌💌 欢迎订阅专栏,Java进阶不迷路😘
☕☕ Java进阶攻坚克难,持续更新,一网打尽IO、注解、多线程…等java-se进阶内容。


🍍前情提要:

前情提要

🌵🌵任何程序都是有输入输出的,我们很难想象一个程序既不从用户那里得到点什么,也不向客户那里输出点什么东西。包括JavaWeb中的网络程序也需要接收客户端发来的请求,对请求内容进行一定的处理再发给客户端。任何一个程序都需要一种和外界打交道的方式,在Java语言中肯定也提供了处理输入输出的手段,我们叫它IO流。

🌴🌴前文中我们已经了解到Java中的IO流分为字节流与字符流,以及与之对应的四大抽象类InputStreamOutputStreamReaderWriter,它们是所有IO流的父类~

🌻🌻IO流可以分为节点流,它们直接直接从数据源读取数据,最为常用,阅读时请注意本文的所有常用流都属于节点流,它们直接与数据源打交道,下面我们一起来看看IO流中有哪些常用的实现类…

csdn

🍏工具类:File

上篇文章的末尾使用了File这个类,详细了解IO流之前我们有必要先来简单看看File工具类。Java的世界中,万事万物皆对象,一个File类对象可以表示具体的一个文件,IO流的构造方法中除了可以使用文件的路径作为参数,还可以File对象。

不听不听

File方法摘要:

常用方法描述
构造方法:File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
boolean exists()测试此抽象路径名表示的文件或目录是否存在
boolean mkdir()创建由此抽象路径名命名的目录
long length()返回由此抽象路径名表示的文件的长度
boolean delete()删除由此抽象路径名表示的文件或目录
boolean createNewFile()当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件

👉🏻学会了没?没学会…其实只需要知道File类的构造方法可以把文件变成对象,而且这个对象可以用来作为IO流构造方法的参数就行了…
(* ̄0 ̄)ノ


🍉文件字节流

FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本等)。FileOutputStream通过字节的方式写数据到文件中,同样适合所有类型的文件。

它的常用方法继承自抽象类InputStream与OutputStream,前面已经介绍过了,不再赘述,这里补充一个OutputStream下的flush()方法,在使用write()方法后数据不会立即写到磁盘中,而是将要写入的数据暂存到了内存,只有调用了flush()后,数据才会写进磁盘。

拷贝图片

🍦通过文件字节流实现一个拷贝图片的Demo~

public class Demo {

//    IO流要声明异常,这里先都直接抛出,正确的做法是使用try...catch
    public static void main(String[] args) throws IOException {
//        创建文件字节输入流对象
        FileInputStream fis = new FileInputStream("E:/a/a.jpeg");
//        创建文件字节输出流对象
        FileOutputStream fos = new FileOutputStream("E:/b/b.jpeg");
//        实现拷贝过程
        int temp = 0;
        while ((temp = fis.read()) != -1) {
            fos.write(temp);
        }
//        将数据从内存中写入到磁盘中
        fos.flush();
//        关闭流
        fis.close();
        fos.close();
    }
}

⭐看下效果(看来没翻车)

结果


🍋文件字符流

文件字符流以字符为单位进行操作,如果我们处理的是文本文件,可以使用文件字符流。

🍦实现一个拷贝.txt文件的Demo~

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo {

    public static void main(String[] args) {
//        字符流同字节流大同小异,步骤基本相同
//        代码规范,这次使用try...catch捕获异常
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("E:/a/a.txt");
            fw = new FileWriter("E:/b/b.txt");
            int temp = 0;
            while ((temp = fr.read()) != -1) {
                fw.write(temp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fr != null)
                    fr.close();
                if (fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

⭐看下效果:

运行结果


🥝字符输出流

在Java的IO流中专门提供了用于字符输出的流对象PrintWriter。该对象具有自动行刷新缓冲字符输出流(不需要再调用flush()方法),特点是可以按行写出字符串,并且可以通过println()方法实现自动换行。

🍦向test.txt中写入三行文字,每次直接写入一行~

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Demo {

    public static void main(String[] args) {
//        创建待写入字符串
        String str1 = "你好";
        String str2 = "Hello,World";
        String str3 = "世界!";
        PrintWriter pw = null;
        try {
//            创建PrintWrite对象
            pw = new PrintWriter("E:/test.txt");
//            写入字符,每次写入一行
            pw.println(str1);
            pw.println(str2);
            pw.println(str3);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
//            关闭IO流
            if (pw != null)
                pw.close();
        }
    }
}

⭐看下效果:

运行结果


🍓字节数组流

ByteArrayInputStream和ByteArrayOutputStream经常用在需要流和数组之间转化的情况。

字节数组输入流:

FileInputStream的数据源是文件,而ByteArrayInputStream是把内存中的“字节数组对象”当作数据源。

🍦从字符串数组中读取内容的Demo~

import java.io.ByteArrayInputStream;
import java.io.IOException;

public class Demo {

    public static void main(String[] args) {
        byte[] bytes = "Hello,World!".getBytes();
        ByteArrayInputStream bis = null;
//          使用StringBuilder接收读取的内容
        StringBuilder sb = new StringBuilder();
        try {
//            ByteArrayInputStream构造方法不需要声明异常
            bis = new ByteArrayInputStream(bytes);
            int temp = 0;
            while ((temp = bis.read()) != -1) {
                sb.append((char) temp);
            }
        } finally {
            if (bis != null) {
//                构造方法不需要声明异常,但是close()方法需要
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
//        打印StringBuilder
        System.out.println(sb);
    }
}

⭐运行结果:

运行结果

字节数组输出流:

将流中的数据写入到字节数组中。

🍦将'a''b''c' 三个字符写入到数组中的小Demo~

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class Demo {

    public static void main(String[] args) {
        ByteArrayOutputStream bos = null;
        byte[] bytes = null;
        try {
//            创建字节数组输出流对象
            bos = new ByteArrayOutputStream();
//            写入三个字符
//            write()方法参数为int型变量,直接使用字符Java可以自动转换
            bos.write('a');
            bos.write('b');
            bos.write('c');
//            写入的内容会缓存,使用toByteArray方法返回一个数组,将缓存内容输出
            bytes = bos.toByteArray();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
//        输出数组看一下结果
        System.out.println(Arrays.toString(bytes));
    }
}

⭐运行结果:

运行结果

💙🧡💙🧡💙🧡💙🧡💙
🤍💬下篇预告:IO流-缓冲流🤍
💛💚💛💚💛💚💛💚💛

🍍🍍🍍
创作不易,如果觉得本文对你有所帮助,欢迎点赞关注收藏。🙇🏻‍♀️
🍉🍉🍉
@作者:Mymel_晗,计算机专业练习时长两年半的Java练习生~🏃🏻‍♂️🏀

🔸🔹文末已至,咱们下篇再见🔹🔸

┊我欲穿花寻路,直入白云深处,浩气展虹霓。┊
﹥水调歌头·游览-黄庭坚﹤

footer