IO流介绍

IO流

分类及结构

在这里插入图片描述
在这里插入图片描述

字节流

在这里插入图片描述

FileOutStream原理

创建流对象

通过 new FileOutputStream("C:\\a.txt") 建立程序与目标文件(C:\a.txt)的连接。

写出数据

调用 fos.write(97),将字节数据(97 对应 ASCII 码的字符a)写入文件。

关闭流资源

调用 fos.close(),释放程序与文件的连接资源。

:如果不关闭流资源,程序运行完毕之前此文件一直处于使用状态,无法在外部对此文件操作

FileOutputStream 书写细节

① 创建字节输出流对象

  • 细节 1:参数可以是字符串路径File 对象
  • 细节 2:文件不存在时会自动创建,但需保证父级路径已存在
  • 细节 3:文件已存在时,会清空原有内容

② 写数据

  • 细节:write方法接收整数参数,但实际写入的是该整数对应的ASCII 字符

③ 释放资源

  • 细节:每次使用完流后,必须手动释放资源
FileOutputStream 写数据的 3 种方式
方法名称说明
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据
样例
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo4 {//此处抛出的异常时编译时异常,是创建流,写入和关闭资源的异常的父类
    public static void main(String[] args) throws IOException {
        // 1. 创建FileOutputStream对象(路径为"myio\\a.txt")此处为相对路径
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");

        // 2. 写出数据
        // 写出字符串"kankelaoyezuishuai"
        String str = "kankelaoyezuishuai";
        byte[] bytes1 = str.getBytes();
        fos.write(bytes1);

        // 写出换行符(\r\n是Windows下的换行格式)
        String wrap = "\r\n";
        byte[] bytes2 = wrap.getBytes();
        fos.write(bytes2);

        // 写出字符串"666"
        String str2 = "666";
        byte[] bytes3 = str2.getBytes();
        fos.write(bytes3);

        // 3. 释放资源
        fos.close();
    }
}

不同系统的换行符

  • Linux:\n
  • Mac:\r

Windows 换行细节

在 Windows 系统中,Java 对回车换行做了优化:

  • 完整换行符是\r\n,但写\r\n其中一个,Java 底层会自动补全实现换行,其中\r代表光标来到此行的开头,\n为直接换行。
  • 建议:不要省略,写全\r\n

续写功能

  • 若要续写,需打开续写开关(创建对象时的第二个参数):
    • 默认false:关闭续写,创建对象时会清空文件原有内容。
    • 手动传true:打开续写,创建对象时不会清空文件,新内容会追加到文件末尾。
//1.创建对象
FileOutputStream fos = new FileOutputStream("myio\\a.txt",true)
//2.写出数据
String str = "kankelaoyezuishuai";
byte[] bytes1 = str.getBytes();
fos.write(bytes1);

FileOutStream原理

FileInputStream 的书写细节

① 创建字节输入流对象

  • 细节 :如果目标文件不存在,会直接抛出异常。

② 读取数据

  • 细节 1:一次读一个字节,返回的是该字节对应的ASCII 数值(比如读取字符a会返回 97)。
  • 细节 2:当读到文件末尾时,read方法会返回-1(以此作为读取结束的标志)。

③ 释放资源

  • 细节 :每次使用完流后,必须手动释放资源。
FileInputStream 一次读多个字节

在这里插入图片描述

FileInputStream 一次读多个字节

在这里插入图片描述

改善方法

在这里插入图片描述

方法列表
方法名称说明
public int read()一次读一个字节数据,返回值读取为对应字节
public int read(byte[] buffer)一次读一个字节数组数据,返回值读取为字节长度,字节存在byte中
注意事项
  • 使用read(byte[] buffer)时,每次读取会尽可能将字节数组装满。
  • 字节数组的常用大小建议:1024 的整数倍(例如1024*1024*5,即 5MB)。

字符集基础知识

计算机中任意数据都以二进制形式存储。

计算机最小存储单元是 1 个字节。

ASCII 字符集中,1 个英文字符占 1 个字节。

简体中文版 Windows 默认使用 GBK 字符集。

GBK 字符集完全兼容 ASCII 字符集:

  • 英文字符:占 1 个字节,二进制第一位是0
  • 中文字符:占 2 个字节,二进制高位字节的第一位是1

Unicode 字符集的 UTF-8 编码格式

  • 英文字符:占 1 个字节,二进制第一位是0,转成十进制为正数。
  • 中文字符:占 3 个字节,二进制第一位是1,第一个字节转成十进制为负数。

java中编码解码方式

操作类型方法声明说明
编码public byte[] getBytes()使用默认方式进行编码
编码public byte[] getBytes(String charsetName)使用指定方式进行编码
解码String(byte[] bytes)使用默认方式进行解码
解码String(byte[] bytes, String charsetName)使用指定方式进行解码

字符流

在这里插入图片描述

FileReader

① 创建字符输入流对象

  • 构造方法:

    构造方法说明
    public FileReader(File file)关联本地文件(参数为 File 对象)
    public FileReader(String pathname)关联本地文件(参数为字符串路径)
  • 细节:如果目标文件不存在,会直接抛出异常。

② 读取数据

  • 成员方法:

    成员方法说明
    public int read()读取数据,读到末尾返回 - 1,读入数据为返回的int
    public int read(char[] buffer)读取多个数据,读到末尾返回 - 1,读取数据存入字符数组中(十进制形式),返回读取字符长度
  • 细节:

    1. 按字节读取,遇到中文字符时会一次读多个字节,解码后返回对应整数(代表字符)。
    2. 读到文件末尾时,read方法返回-1

③ 释放资源

  • 成员方法:

    成员方法说明
    public int close()释放资源 / 关闭流
样例

无参

// 1. 创建FileReader对象(关联文件:myio\a.txt)
FileReader fr = new FileReader("myio\\a.txt");

// 2. 读取数据(read()方法)
int ch;
// 循环读取,直到返回-1(文件末尾)
while ((ch = fr.read()) != -1) {
    // 将十进制返回值强转为char,显示对应字符
    System.out.print((char) ch); 
}

// 3. 释放资源
fr.close();

有参

// 1. 创建FileReader对象(关联文件:myio\a.txt)
FileReader fr = new FileReader("myio\\a.txt");

// 2. 读取数据(字符数组缓冲)
char[] chars = new char[2]; // 定义长度为2的字符数组
int len;
// 循环读取,直到返回-1(文件末尾)
while ((len = fr.read(chars)) != -1) {
    // 将字符数组转为字符串(取实际读取的长度len)
    System.out.print(new String(chars, 0, len));//从零索引开始
}

// 3. 释放资源
fr.close();

FileWriter

FileWriter 的构造方法
构造方法说明
public FileWriter(File file)创建字符输出流关联本地文件
public FileWriter(String pathname)创建字符输出流关联本地文件
public FileWriter(File file, boolean append)创建字符输出流关联本地文件,支持续写
public FileWriter(String pathname, boolean append)创建字符输出流关联本地文件,支持续写
FileWriter 的书写细节

① 创建字符输出流对象

  • 细节 1:参数可以是字符串路径File 对象
  • 细节 2:文件不存在时会自动创建,但需保证父级路径已存在
  • 细节 3:文件已存在时会清空原有内容;若要保留内容,需打开续写开关(构造方法的append参数传true)。

② 写数据

  • 细节:write方法接收整数参数时,实际写入的是该整数在字符集中对应的字符(例如传入97会写入a)。

③ 释放资源

  • 细节:每次使用完流后,必须手动释放资源
方法声明说明
写数据void write(int c)写出一个字符
写数据void write(String str)写出一个字符串
写数据void write(String str, int off, int len)写出字符串的一部分
写数据void write(char[] cbuf)写出一个字符数组
写数据void write(char[] cbuf, int off, int len)写出字符数组的一部分
释放资源public void close()释放资源 / 关闭流
// 创建FileWriter对象(关联文件+开启续写)
FileWriter fw = new FileWriter("myio\\a.txt", true);
// 定义字符数组
char[] chars = {'a','b','c','我'};
// 写出字符数组
fw.write(chars);

// 释放资源
fw.close();

<think>好的,用户让我介绍一下Java中的IO。首先,我需要回忆Java IO的基本知识。Java IO主要分为字节和字符,对吧?字节处理二进制数据,比如InputStream和OutputStream,而字符处理文本数据,比如Reader和Writer。然后要分清楚各个具体的类,比如FileInputStream、BufferedInputStream这些常用的类有什么区别。 用户可能想知道IO的分类和用途,所以得先解释清楚结构。然后要提到输入和输出的区别,以及同步和异步的概念吗?可能不需要太深入,但需要基础部分。还要注意缓冲的作用,比如BufferedReader能提高读取效率,这点应该提一下。另外,Java7引入的NIO包可能也需要提到,因为它提供了更高效的IO操作,比如Channel和Buffer,还有Path等。但用户的问题可能更关注传统的IO,所以这部分可以作为补充。 可能用户是刚开始学习Java,或者在项目中遇到了IO的问题,需要基础知识的概述。他们可能需要知道什么时候用哪种,比如读写文件应该用FileReader还是InputStreamReader的区别。或者如何高效地处理大文件,这时候缓冲的重要性就体现出来了。 要确保回答结构清晰,先分大类,再讲常用类,最后可能提到NIO。示例代码是否需要呢?用户之前的例子有代码,但这次问题可能不需要具体代码,但可以举几个例子说明使用场景。比如用FileInputStream读取文件,用BufferedWriter写入文件等。 相关问题方面,应该考虑用户可能的后续疑问,比如字节和字符的区别,缓冲的作用,NIO与传统IO的不同,如何读写文件,以及异常处理。这些都是常见的问题,需要列出来供用户进一步参考。</think>Java中的IO用于处理输入/输出操作,主要通过`java.io`包实现。其核心思想是将数据源与程序之间的交互抽象为“”,按方向可分为输入(读取数据)和输出(写入数据)。以下是主要分类和特点: ### 核心分类 1. **字节**(以字节为单位读写) - 输入:`InputStream`(如`FileInputStream`) - 输出:`OutputStream`(如`FileOutputStream`) - 适用场景:二进制文件(如图片、视频) 2. **字符**(以字符为单位读写,基于字节封装) - 输入:`Reader`(如`FileReader`) - 输出:`Writer`(如`FileWriter`) - 适用场景:文本文件(自动处理字符编码转换) 3. **缓冲**(提高读写效率) - `BufferedInputStream`/`BufferedOutputStream` - `BufferedReader`/`BufferedWriter` - 通过内部缓冲区减少系统调用次数 4. **对象**(序列化/反序列化) - `ObjectInputStream`/`ObjectOutputStream` - 直接读写实现了`Serializable`接口的对象 ### 常用操作示例 ```java // 字节复制文件 try (InputStream in = new FileInputStream("source.txt"); OutputStream out = new FileOutputStream("dest.txt")) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } // 字符按行读取 try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } ``` ### NIO扩展(Java 1.4+) `java.nio`包提供更高效的IO方式,包含: - **Channel**(双向通道,如`FileChannel`) - **Buffer**(数据容器,如`ByteBuffer`) - **Selector**(多路复用,用于网络IO) - **Path**(替代`File`类的路径操作) ### 异常处理 需注意关闭资源,建议使用try-with-resources语法(Java 7+)自动关闭。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值