Java I/O流详解

news2024/11/5 14:44:18

文章目录

      • I/O流概念
      • I/O流的分类
        • 字节流(Byte Streams)
          • 字节
          • 字节流概述
          • 方法
          • 主要类和继承关系
          • 示例代码
          • 字节流读取文件
        • 字符流
          • 字符流概述
          • 子类
          • Reader
            • 1.FileReader:
            • 2.CharArrayReader:
            • 3.StringReader:
            • 4.InputStreamReader:
            • 5.BufferedReader:
            • 7.LineNumberReader:
          • Writer 类
            • 1.FileWriter
            • 2.CharArrayWriter:
            • 4.OutputStreamWriter:
            • 5.BufferedWriter:
            • 6.PrintWriter:

I/O流概念

Java I/O(inputStream/outStream)流是Java标准库中用于处理输入和输出操作的一组类和接口。这些类和接口位于 java.io 包中,提供了丰富的功能来处理文件、网络连接、内存数据等。

I/O流的分类

Java I/O流根据传输数据的不同主要分为两大类:字节流和字符流。 下面我们将分别介绍字节流和字符流的区别和应用场景.

字节流(Byte Streams)

顾名思义,字节流主要处理的数据就是字节(Byte),但是很多小伙伴可能不是很清楚字节的概念,下面我们将简单概述一下什么是字节。

字节

字节(Byte)是计算机科学中一个基本的数据单位,用于表示和存储信息。理解字节的概念对于编程、数据传输和存储等方面都是非常重要的。

  • 字节是计算机中最小的地址单位,通常由8个比特(bit) 组成。 其中bit就是计算机存储中的0或者是1,一bit代表一位0或者1。
  • 一个字节可以用8位二进制数表示,例如:01001001。字节也可以用十六进制表示,例如:49(对应二进制 01001001)。
  • 计算机中的所有数据最终都会被表示为字节序列。
    一个字符在ASCII编码中占用1个字节,一个整数在大多数系统中占用4个字节
    在网络通信和文件传输中,数据通常以字节为单位进行传输。
    例如,HTTP协议中的数据传输是以字节为单位进行的。

了解了字节的概念以后我们接着去了解字节流相关的概念

字节流概述

定义:在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。
说明:
字节流是程序中最常用的流。
在JDK中,所有的字节输入流都继承自 InputStream,所有的字节输出流都继承自 OutputStream。

方法
  • 读取方法
    • int read():从输入流中读取一个字节或字符。
    • int read(byte[] b) / int read(char[] cbuf):从输入流中读取一定数量的字节或字符,并存储到数组中。
    • String readLine():从字符输入流中读取一行文本(BufferedReader 特有)。
  • 写入方法
    • void write(int b):将一个字节或字符写入输出流。
    • void write(byte[] b) / void write(char[] cbuf):将字节数组或字符数组写入输出流。
    • void write(String str):将字符串写入输出流(Writer 特有)。
  • 关闭方法
    • void close():关闭输入流或输出流,并释放与之关联的系统资源。
主要类和继承关系
  • InputStream:字节输入流的基类。

    • FileInputStream:从文件中读取字节。
    • ByteArrayInputStream:从字节数组中读取字节。
    • ObjectInputStream:从字节流中读取对象。
    • FilterInputStream:装饰器模式,用于添加额外功能的输入流。
      • BufferedInputStream:带缓冲的输入流,提高读取效率。
      • DataInputStream:从输入流中读取基本数据类型(如整数、浮点数等)。
  • OutputStream:字节输出流的基类。

    • FileOutputStream:将字节写入文件。
    • ByteArrayOutputStream:将字节写入字节数组。
    • ObjectOutputStream:将对象写入字节流。
    • FilterOutputStream:装饰器模式,用于添加额外功能的输出流。
      • BufferedOutputStream:带缓冲的输出流,提高写入效率。
      • DataOutputStream:将基本数据类型写入输出流。

在这里插入图片描述

示例代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
    public static void main(String[] args) {
        String inputFilePath = "input.txt";
        String outputFilePath = "output.txt";

        try (
            FileInputStream fis = new FileInputStream(inputFilePath);
            FileOutputStream fos = new FileOutputStream(outputFilePath)
        ) {
            int byteRead;
            while ((byteRead = fis.read()) != -1) {
                fos.write(byteRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意的是针对FileInputStream和FileoutputStream这种类需要加入try-catch进行捕获IO异常。

字节流读取文件

说明:

  • 针对文件的读写操作,JDK专门提供了两个类,分别是 FileInputStream 和 FileOutputStream。
  • FileInputStream 是 InputStream 的子类,它是操作文件的字节输入流,专门用于读取文件中的数据。
  • 从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取。
字符流

字符流(Character Streams)是Java I/O库中用于处理文本数据的一组类。字符流以字符为单位进行读写操作,通常用于处理文本文件。与字节流相比,字符流具有更好的可读性和易用性,因为它们直接处理字符而不是字节,并且支持多种字符编码。

字符流概述

相较于字节流处理所有的文件,文件流只能用与处理文本数据,也就是我们所说的txt文件,其中也和字节流的形式差不多,都是拥有输入流和输出流,但是他们的基类有差距,分别是Reader 类和Write类.

子类
Reader

Reader 是所有字符输入流的基类,提供了一些基本的方法来读取字符数据。主要子类包括:

1.FileReader:
  • 从文件中读取字符。
  • 示例:
import java.io.FileReader;
import java.io.IOException;

public class FileReaderExample {
    public static void main(String[] args) {
        String filePath = "input.txt";  // 文件路径

        try (FileReader fr = new FileReader(filePath)) {
            int charRead;
            while ((charRead = fr.read()) != -1) {
                System.out.print((char) charRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.CharArrayReader:
  • 从字符数组中读取字符。
  • 示例:
import java.io.CharArrayReader;
import java.io.IOException;

public class CharArrayReaderExample {
    public static void main(String[] args) {
        char[] data = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'};

        try (CharArrayReader car = new CharArrayReader(data)) {
            int charRead;
            while ((charRead = car.read()) != -1) {
                System.out.print((char) charRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3.StringReader:
  • 从字符串中读取字符。
  • 示例:

import java.io.StringReader;
import java.io.IOException;

public class StringReaderExample {
    public static void main(String[] args) {
        String data = "Hello, World!";

        try (StringReader sr = new StringReader(data)) {
            int charRead;
            while ((charRead = sr.read()) != -1) {
                System.out.print((char) charRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4.InputStreamReader:
  • 将字节输入流转换为字符输入流,支持多种字符编码。
  • 示例:
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;

public class InputStreamReaderExample {
    public static void main(String[] args) {
        String filePath = "input.txt";  // 文件路径

        try (FileInputStream fis = new FileInputStream(filePath);
             InputStreamReader isr = new InputStreamReader(fis, "UTF-8")) {
            int charRead;
            while ((charRead = isr.read()) != -1) {
                System.out.print((char) charRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.BufferedReader:
  • 带缓冲的字符输入流,提高读取效率,支持按行读取。
  • 示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        String filePath = "input.txt";  // 文件路径

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
7.LineNumberReader:
  • 带行号的字符输入流,继承自 BufferedReader,支持按行读取并记录行号。
  • 示例:
import java.io.LineNumberReader;
import java.io.FileReader;
import java.io.IOException;

public class LineNumberReaderExample {
    public static void main(String[] args) {
        String filePath = "input.txt";  // 文件路径

        try (LineNumberReader lnr = new LineNumberReader(new FileReader(filePath))) {
            String line;
            while ((line = lnr.readLine()) != null) {
                System.out.println("Line " + lnr.getLineNumber() + ": " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Writer 类

Writer 是所有字符输出流的基类,提供了一些基本的方法来写入字符数据。主要子类包括:

1.FileWriter
  • 将字符写入文件。
  • 示例:

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

public class FileWriterExample {
    public static void main(String[] args) {
        String filePath = "output.txt";  // 文件路径
        String content = "Hello, World!";

        try (FileWriter fw = new FileWriter(filePath)) {
            fw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.CharArrayWriter:
  • 将字符写入字符数组。
  • 示例:
import java.io.CharArrayWriter;
import java.io.IOException;

public class CharArrayWriterExample {
    public static void main(String[] args) {
        String content = "Hello, World!";

        try (CharArrayWriter caw = new CharArrayWriter()) {
            caw.write(content);
            System.out.println(caw.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 3.StringWriter:
  • 将字符写入字符串。
  • 示例:
import java.io.StringWriter;
import java.io.IOException;

public class StringWriterExample {
    public static void main(String[] args) {
        String content = "Hello, World!";

        try (StringWriter sw = new StringWriter()) {
            sw.write(content);
            System.out.println(sw.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4.OutputStreamWriter:
  • 将字符输出流转换为字节输出流,支持多种字符编码。
  • 示例:
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class OutputStreamWriterExample {
    public static void main(String[] args) {
        String filePath = "output.txt";  // 文件路径
        String content = "Hello, World!";

        try (FileOutputStream fos = new FileOutputStream(filePath);
             OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")) {
            osw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.BufferedWriter:
  • 带缓冲的字符输出流,提高写入效率,支持按行写入。
  • 示例:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        String filePath = "output.txt";  // 文件路径
        String content = "Hello, World!";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
            bw.write(content);
            bw.newLine();  // 写入换行符
            bw.write("This is another line.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
6.PrintWriter:
  • 格式化输出流,支持打印操作,常用于日志记录等。
  • 示例:
深色版本
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;

public class PrintWriterExample {
    public static void main(String[] args) {
        String filePath = "output.txt";  // 文件路径

        try (PrintWriter pw = new PrintWriter(new FileWriter(filePath))) {
            pw.println("Hello, World!");
            pw.println("This is another line.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结
字符流:用于处理文本数据,以字符为单位进行读写操作。
Reader 类:提供字符输入流的功能,主要子类包括 FileReader、CharArrayReader、StringReader、InputStreamReader、BufferedReader 和 LineNumberReader。
Writer 类:提供字符输出流的功能,主要子类包括 FileWriter、CharArrayWriter、StringWriter、OutputStreamWriter、BufferedWriter 和 PrintWriter。
通过理解和使用这些类和方法,可以灵活地处理各种文本数据的读写操作,满足不同的应用场景需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Multisim数字频率计频率范围0-9999HZ电路(含仿真和报告)

【全套资料.zip】数字频率计仿真电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.采用纯数字电路,非单片机。 2.频率计测量的频率范围0-9999HZ。 3.使用数码管进行频…

Python画笔案例-095 绘制鼠标画笔

1、绘制 鼠标画笔 通过 python 的turtle 库绘制 鼠标画笔,如下图: 2、实现代码 绘制 鼠标画笔,以下为实现代码: """鼠标画笔.py本程序可以用鼠标指针在屏幕上画画儿。 """ import turtlescreen = turtle.getscreen() screen.setup(

【温酒笔记】SPI

1. SPI基础 物理层 片选线 :选中拉低SCK: 时钟线MOSI:主出从入MISO:主入从出 协议层 CPOL:时钟极性:空闲电平高低 CPHA:时钟相位:第一个还是第二个边沿采样 2. 示例SPI-W25Q16 (见模组分类下文章)

mac电脑设置crontab定时任务,以及遇到的问题解决办法

crontab常用命令 crontab -u user:用来设定某个用户的crontab服务; crontab file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入&#xf…

MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 2.1 详细解释 3. 定位到的慢SQL如何分析? 3.1 详细说明 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 介绍一下当时产生问题…

大数据新视界 -- 大数据大厂之提升 Impala 查询效率:索引优化的秘籍大揭秘(上)(3/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico,一个基于纯 adb 命令实现的安卓自动化测试框》(https://testerhome.com/topics/37042), 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…

小样本语义分割(HDMNet网络)

小样本语义分割(HDMNet网络) 摘要HDMNet 解决的问题本文贡献HDMNet 模型1. 特征提取2. 解耦下采样和匹配模块(分层匹配结构)2.1. 粗粒度到细粒度解码器2.2 . 自注意力模块2.3. 相关性模块 3. 损失函数 总结 摘要 小样本语义分割&…

layui 自定义验证单选框必填

对于输入框类型必填验证,只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢?layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…

植物神经紊乱别担心,这些运动让你重拾健康与平衡✨

在这个快节奏、高压力的时代,植物神经紊乱似乎已经成为现代人的“隐形杀手”。焦虑、失眠、心跳过速、呼吸不规律……这些症状不仅影响了我们的日常生活,更在无声中侵蚀着我们的身心健康。但别担心,通过科学合理的运动,我们可以有…

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC,即生成式人工智能(Artificial Intelligence Generated Content),是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说:过去,写文章、画张图、唱首歌、弄个…

2. 从服务器的主接口入手

Webserver 的主函数 main.cpp,完成了哪些功能? #include "config.h"int main(int argc, char *argv[]) {string user "";string passwd "";string databasename "";Config config;config.parse_arg(argc, a…

向量数据库 PieCloudVector 进阶系列丨打造音乐推荐系统

在上一篇内容中,我们介绍了 PieCloudVector 如何助力构建基于图片数据的商品推荐系统,详细描述从数据集的准备到数据向量化处理,再到向量数据的存储和相似性搜索的完整流程。本文将进一步探讨如何将 PieCloudVector 应用于音频数据&#xff0…

python之数据结构与算法(数据结构篇)-- 栈

一、栈的概念 这里我们不去了解教科书上面的“教条概念”,其实“栈”的概念和古代的时候的“客栈”是有异曲同工之妙的。 在这里我们把客栈看成“栈”,旅客看作“栈元素” 1.当旅客进来住店时,叫做“入栈”; 2.当旅客退房时&#…

Java调用chatgpt

目前openai的chatgpt在国内使用有一定难度,不过国内的大模型在大部分情况下已经不弱于chatgpt,而且还更便宜,又能解决国内最敏感的内容安全问题。本文后续以spring ai调用国内chatgpt厂商实现为例,讲解怎么构建一个java调用chatgp…

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置

多媒体标签运用 在HTML中有以下常见多媒体标签&#xff1a; <img> &#xff08;图像标签&#xff09; - 作用&#xff1a;用于在网页中嵌入图像。 - 示例&#xff1a; <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…

安卓开发之数据库的创建与删除

目录 前言&#xff1a;基础夯实&#xff1a;数据库的创建数据库的删除注意事项 效果展示&#xff1a;遇到问题&#xff1a;如何在虚拟机里面找到这个文件首先&#xff0c;找到虚拟机文件的位置其次&#xff0c;找到数据库文件的位置 核心代码&#xff1a; 前言&#xff1a; 安…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>