文章目录
🎈个人主页:程序员 小侯
🎐CSDN新晋作者
🎉欢迎 👍点赞✍评论⭐收藏
✨收录专栏:Java知识介绍
✨适用于:Java初学者
🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗
简介
- 在计算机编程中,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());
}
}
}
后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹