Java各种IO流

前言

不知道大家有没有疑惑过一个问题,在我们打电话的时候为什么对着电话说话,声音就会出现在电话的另一头。原理就是声音转变成数字信号,再通过一个一个基站,传递到对方手机,再将数字信号转成声音。那我们文件又是怎么从我们本地上传到服务器,别人又是怎么从服务器将文件下载下来的呢。

其实这就要多亏我们的"流",正如他的名字一样,当上传或下载文件时,文件会成"流",最后流又组成了完整的文件。而流又分为输入流和输出流,即Input/Output(IO)流。

什么是IO流

IO流是Java中用于程序和外部源进行文件传输的一种中间形态,分为输入流(Input Stream)和输出流(Output Stream),分别用于读取文件和写入文件。

以前老是分不清什么时候用输入流,什么��候用输出流,后来找到一个技巧, 我们把自己想象成程序,输入流就是有流进来,我们获取到流自然就是读取它了; 输出流,就是我们把流输出到文件,也就是写入文件了,哈哈😀😀。

IO流的类型

Java中有关IO的类一共都有40多个,但所有类都是基于以下4个类

InputStream/OutputStream: 分别为字节流中输入流和输出流的基类。

Reader/Writer: 分别为字符流中读取器和输入器的基类。

字节流

字节流中常用的主要有以下:

  • FileInputStream:用于从文件读取数据。
  • FileOutputStream:用于向文件写入数据。
  • BufferedInputStream:提供了缓冲功能,可以提高读取性能。
  • BufferedOutputStream:提供了缓冲功能,可以提高写入性能。
  • DataInputStream:用于从输入流中读取基本数据类型。
  • DataOutputStream:用于将基本数据类型写入输出流。

例如使用DataInputStream读取文件:

ini 复制代码
public static void main(String[] args) throws IOException {
        String path = "C:/Users/kubayaxi/Desktop/test.txt"; //文件路径
        FileInputStream fis = new FileInputStream(path); //文件输入流
        DataInputStream dis = new DataInputStream(fis); //基本数据类型输入流
        int readInt = dis.readInt();
        System.out.println(readInt);
        String s = dis.readUTF();
        System.out.println("s"+s);
    }

输出:

复制代码
595
Black

输入DataInputStream读取文件时,文件内容最好是使用的DataOutputStream写入的文件,不然可能会遇到文件数据类型不一致,或者乱码的问题。

字符流

有了字节流,我们为什么还需要字符流呢?字节流主要处理文件类型以二进制方式存储的文件,如图片,视频等就只能用字节流来处理,而字符流主要用于以Unicode字符存储的数据流。如果文件是以字符存在的话我们使用字符流就会比字节流方便,比如如果一个文件以中文的形式保存的,我们使用字节流就会出现乱码问题,还需要手动指定编码格式。

字符流中常用的主要有以下:

  • FileReader:用于从文件读取字符数据。
  • FileWriter:用于向文件写入字符数据。
  • BufferedReader:提供了缓冲功能,可以提高读取性能。
  • BufferedWriter:提供了缓冲功能,可以提高写入性能。
  • InputStreamReader:将字节流转换为字符流。
  • OutputStreamWriter:将字符流转换为字节流。

例如使用FileWriter和FileRead操作文件:

java 复制代码
public static void main(String[] args) throws IOException {
    String path = "C:/Users/kubayaxi/Desktop/test.txt";
    FileWriter writer = new FileWriter(path); //写入文件
    writer.write("595");
    writer.write("\n");
    writer.write("Black");
    writer.close();
    FileReader reader = new FileReader(path);
    int content;
    // 每次读取一个字符,如果不等于-1则表示没有读取完
    while((content = reader.read()) != -1){
        System.out.print((char)content);
    }
    reader.close();
}
相关推荐
程序员岳焱4 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*5 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅5 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头5 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
IT_10246 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9656 小时前
动态规划
后端
stark张宇6 小时前
VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)
linux·后端
亚力山大抵7 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask
超级小忍7 小时前
Spring Boot 中常用的工具类库及其使用示例(完整版)
spring boot·后端
CHENWENFEIc8 小时前
SpringBoot论坛系统安全测试实战报告
spring boot·后端·程序人生·spring·系统安全·安全测试