简介
- 在计算机编程中,IO(Input/Output)流是一种用于处理输入和输出操作的机制,它是与外部设备(如文件、网络连接等)交换数据的重要手段。Java提供了丰富的IO流类库,使得数据的读取和写入变得高效、灵活而且可靠。本文将深入探讨Java IO流的基本概念、不同类型的IO流以及一些常见的用例。
基本概念
- IO流可以看作是数据从源到目标的一条流水线,其中数据可以是字节或字符。Java中的IO流主要分为两大类:字节流和字符流。字节流适合处理二进制数据,而字符流则更适合处理文本数据。
字节流
- 字节流以字节为单位进行数据传输,是数据传输的基本形式。在Java中,字节流由两个抽象类InputStream和OutputStream衍生而来。常见的字节流有FileInputStream和FileOutputStream,它们用于读取和写入字节数据。
字节输出流:OutputStream(抽象类)
字节输出流(OutputStream)用于将字节数据写入到数据源中。它是处理数据输出的基本工具,以下是其主要方法:
close(): 关闭输出流,释放资源。
flush(): 刷新输出流,将缓冲区中的数据写入目标。
write(int b):写入一个字节数据。
write(byte b[]): 写入字节数组数据。
write(byte b[], int off, int len): 写入字节数组的一部分数据。
字节输出流的子类:FileOutputStream
FileOutputStream 是 OutputStream 的子类,用于将字节数据写入文件。它提供了许多方法来实现字节数据的输出操作:
构造方法:通过文件路径或文件对象创建 FileOutputStream 对象。
FileOutputStream(String name)
FileOutputStream(File file)
写出数据:通过 write 方法写出数据。
write(int b) 一次写一个字节数据
write(byte b[]) 保存一个字节数组的数据 (重点)
write(byte b[],int off, int len) byte数组 保存开始位置 保存个数
数据追加:通过构造方法的参数指定是否追加写入数据到已存在的文件。
FileOutputStream(String name, boolean append)
FileOutputStream(Filefile, boolean append)
append:true-----追加;false-----清空原文件中的内容
写出换行:通过写出 “\r\n”(Windows 换行)实现换行操作。
示例:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class FileWriteExample { public static void main(String[] args) { // 创建一个名为 "b.txt" 的文件 File file = new File("b.txt"); try { // 打开文件的输出流,并设置为追加模式 FileOutputStream fileOutputStream = new FileOutputStream(file, true); // 定义要写入文件的内容 byte[] contentBytes = {97, 98, 99, 100, 101}; // 字节内容 String newLine = "\r\n"; // 换行符 // 写入换行符和字节内容到文件 fileOutputStream.write(newLine.getBytes()); // 写入换行 fileOutputStream.write(contentBytes); // 写入字节内容 // 关闭输出流 fileOutputStream.close(); System.out.println("文件写入完成。"); } catch (IOException e) { System.out.println("出现IO异常:" + e.getMessage()); } } }
字节输入流:InputStream (抽象类)
字节输入流(InputStream)用于从数据源读取字节数据。它是处理数据输入的基本工具,以下是其主要方法:
int read(): 读取一个字节数据>
int read(byte b[]): 读取一定数量的字节数据
int read(byte b[], int off, int len): 从字节数组的指定位置 off 开始读取 len 个字节数据,并存储在数组 b 中。
void close(): 关闭输入流,释放资源。
字节输入流的子类:FileInputStream
FileInputStream 是 InputStream 的子类,用于从文件中读取字节数据。以下是其主要特点:
构造方法:通过文件路径创建 FileInputStream 对象。
FileInputStream(String name)
FileInputStream(File file)
读出数据:通过read方法读出数据。
int read(): 读取一个字节数据,并返回其对应的整数值(0-255)。若达到流的末尾,返回 -1。
int read(byte b[]): 读取一定数量的字节数据,并存储在字节数组 b 中。返回实际读取的字节数,若无数据可读则返回 -1。
int read(byte b[], int off, int len): 从字节数组的指定位置 off 开始读取 len 个字节数据,并存储在数组 b 中。返回实际读取的字节数,若无数据可读则返回 -1。(重点)
示例:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileReadExample { public static void main(String[] args) { // 创建一个文件对象,指向 "D:\\a\\b.txt" File file = new File("D:\\a\\b.txt"); try { // 创建文件输入流 FileInputStream fis = new FileInputStream(file); // 定义一个字节数组,用于存储读取的数据 byte[] buffer = new byte[2]; int bytesRead; // 用于记录实际读取的字节数 // 循环读取数据 while ((bytesRead = fis.read(buffer)) != -1) { // 将字节数组中的数据转换为字符串,并指定有效的数据长度 String content = new String(buffer, 0, bytesRead); // 输出读取到的内容 System.out.println(content); } // 关闭文件输入流 fis.close(); } catch (IOException e) { System.out.println("出现IO异常:" + e.getMessage()); } } }
字符流
- 字符流以字符为单位进行数据传输,能够处理字符编码和解码。在Java中,字符流由两个抽象类Reader和Writer衍生而来。常见的字符流有FileReader和FileWriter,它们用于读取和写入字符数据。
字符输出流:Writer
字符输出流(Writer)用于以字符为单位将数据写入到数据源中。以下是其主要方法:
void write(int c): 写入一个字符。
void write(char cbuf[]): 写入字符数组中的所有字符。
void write(char cbuf[], int off, int len): 写入字符数组的一部分字符。
void write(String str): 写入字符串。
void write(String str, int off, int len): 写入字符串的一部分。
void flush(): 刷新输出流,将缓冲区的数据写入目标。
void close(): 关闭输出流,释放资源。
字符输出流的实现类:FileWriter
FileWriter 是 Writer 的子类,用于将字符数据写入到文件中。以下是其主要特点:
构造方法
FileWriter(String fileName): 通过文件路径创建 FileWriter 对象。 FileWriter(File
file): 通过文件对象创建 FileWriter 对象。
写出功能
void write(int c): 写入一个字符。
void write(char cbuf[]): 写入字符数组中的所有字符。
void write(String str): 写入字符串。(重点)
示例:
import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class FileWriterExample { public static void main(String[] args) { // 创建一个 FileWriter 对象,用于向 "info.txt" 文件中追加内容 try (FileWriter fileWriter = new FileWriter("info.txt", true)) { Scanner scanner = new Scanner(System.in); System.out.println("输入信息:"); String str = null; // 无限循环读取用户输入,直到输入 "886" 为止 while (true) { str = scanner.next(); if ("886".equals(str)) { break; } // 换行符和用户输入的内容写入文件 String str1 = "\r\n"; // 换行 fileWriter.write(str1); fileWriter.write(str); } } catch (IOException e) { System.out.println("写入文件时发生异常:" + e.getMessage()); } } }
字符输入流:Reader
字符输入流(Reader)用于以字符为单位从数据源中读取数据。以下是其主要方法:
int read(): 读取一个字符。
int read(char[] c): 读取一定数量的字符,并存储在字符数组 c 中。
read(char[] cbuf, int off, int len): 从字符数组的指定位置 off 开始读取 len个字符,并存储在数组 c 中。
void close(): 关闭输入流,释放资源。
字符输入流的实现类:FileReader
FileReader 是 Reader 的子类,用于从文件中以字符为单位读取数据。以下是其主要特点:
构造方法
FileReader(String fileName): 通过文件路径创建 FileReader 对象。 FileReader(File
file): 通过文件对象创建 FileReader 对象。
读取功能
int read(): 从流中读取一个字符,并返回其整数值。若到达文件末尾,返回 -1。
int read(char[] c):从流中读取一定数量的字符,并存储在字符数组 cbuf 中。返回实际读取的字符数,若无数据可读则返回 -1。
int read(char[] c, int off, int len): 从流中读取 len 个字符,从字符数组的指定位置 off开始存储。返回实际读取的字符数,若无数据可读则返回 -1。
示例:
import java.io.FileReader; import java.io.IOException; import java.util.Arrays; public class FileReaderExample { public static void main(String[] args) { try { // 创建 FileReader 对象以读取名为 "a.txt" 的文件 FileReader fileReader = new FileReader("info.txt"); char[] c = new char[2]; // 缓冲区,用于存储读取的字符 int read; // 用于存储读取的字符数 // 循环读取文件中的数据,直到读取到文件末尾 while ((read = fileReader.read(c)) != -1) { // 将读取到的字符数组转换为字符串并输出 String s = new String(c, 0, read); System.out.print(s); } // 关闭 FileReader 资源 fileReader.close(); } catch (IOException e) { System.out.println("读取文件时发生异常:" + e.getMessage()); } } }
后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹