Java中I/O输入输出的深入讲解
什么是I/O
I/O(Input/Output)指的是数据的输入和输出,是计算机与程序外部世界进行信息交互的方式之一。在Java中,I/O被视为一种Java API,提供了许多与文件、网络和其他I/O设备进行数据输入和输出的类和方法。
I/O的主要类型
字节流
字节流(Byte Stream)以字节为单位进行操作,可以读写任何类型的数据。在 Java 中主要是由 InputStream 和 OutputStream 两个抽象类派生出来的。
以读文件为例,以下为读文件的步骤:
- 打开文件;
FileInputStream fis = new FileInputStream(fileName);
- 开始读取数据;
int data = fis.read(); //读取文件字节,并转换成整数
while (data != -1) {
data = fis.read();
}
- 关闭文件。
fis.close();
字符流
字符流(Character Stream)以字符为单位进行操作,仅支持读取和写入纯文本信息。在 Java 中主要是由 Reader 和 Writer 两个抽象类派生出来的。
以读文件为例,以下为读文件的步骤:
- 打开文件,创建 Reader 对象;
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
- 开始读取数据;
String line = br.readLine();
while (line != null) {
line = br.readLine();
}
- 关闭文件。
br.close();
fr.close();
缓冲流
缓冲流(Buffer Stream)是为了增强字节流和字符流的效率而设计的。缓冲流通过在内存中创建一个缓冲区,使得数据读写时,先让数据暂时存储在缓冲区中,而不是通过物理设备(硬盘、网络等)直接读写。常用的缓冲流有 BufferedInputStream 和 BufferedOutputStream(字节流缓冲流)以及 BufferedReader 和 BufferedWriter(字符流缓冲流)。
以读文件为例,以下为读文件的步骤:
- 打开文件,创建 Input Stream 和 Buffered Input Stream 对象;
FileInputStream fis = new FileInputStream(fileName);
BufferedInputStream bis = new BufferedInputStream(fis);
- 开始读取数据;
int data = bis.read();
while (data != -1) {
data = bis.read();
}
- 关闭文件。
bis.close();
fis.close();
转换流
转换流(Conversion Stream)是字符流和字节流之间的桥梁,支持不同的字符集之间进行转换。常用的转换流是 InputStreamReader 和 OutputStreamWriter。
以读文件为例,以下为读文件的步骤:
- 打开文件,创建 InputStream 和 InputStreamReader 对象;
FileInputStream fis = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
- 开始读取数据;
int data = isr.read();
while (data != -1) {
data = isr.read();
}
- 关闭文件。
isr.close();
fis.close();
I/O的常用类和方法
File
File 类代表文件或目录(文件夹),常用的方法有:
File file = new File(fileName)
:创建 File 对象;file.exists()
:判断文件或目录是否存在;file.getAbsolutePath()
:获得文件或目录的绝对路径;file.isDirectory()
和file.isFile()
:判断是否是目录或文件;file.mkdirs()
:递归创建目录;file.delete()
:删除文件或目录。
FileInputStream/FileOutputStream
FileInputStream 和 FileOutputStream 类分别用于读取和写入文件,常用的方法有:
FileInputStream fis = new FileInputStream(fileName)
:创建 FileInputStream 对象;FileOutputStream fos = new FileOutputStream(fileName)
:创建 FileOutputStream 对象;fis.read()
和fos.write(byte[])
:读取或写入字节数据;fis.close()
和fos.close()
:关闭流。
FileReader/FileWriter
FileReader 和 FileWriter 类分别用于读取和写入文件中的字符数据,常用的方法有:
FileReader fr = new FileReader(fileName)
:创建 FileReader 对象;FileWriter fw = new FileWriter(fileName)
:创建 FileWriter 对象;fr.read()
和fw.write(char[])
:读取或写入字符数据;fr.close()
和fw.close()
:关闭流。
BufferedReader/BufferedWriter
BufferedReader 和 BufferedWriter 类分别用于对字符流进行缓冲,常用的方法有:
BufferedReader br = new BufferedReader(fr)
:创建 BufferedReader 对象;BufferedWriter bw = new BufferedWriter(fw)
:创建 BufferedWriter 对象;br.readLine()
和bw.write(String)
:读取或写入一行字符数据;br.close()
和bw.close()
:关闭缓冲流。
ByteArrayInputStream/ByteArrayOutputStream
ByteArrayInputStream 和 ByteArrayOutputStream 类分别用于读取和写入字节数组,常用的方法有:
ByteArrayInputStream bis = new ByteArrayInputStream(byteArray)
:创建 ByteArrayInputStream 对象;ByteArrayOutputStream bos = new ByteArrayOutputStream()
:创建 ByteArrayOutputStream 对象;bis.read(byte[])
和bos.write(byte[])
:读取或写入字节数据;bis.close()
和bos.close()
:关闭流。
示例
示例1:读取文件
以下示例是通过 BufferedReader 和 FileReader 读取一个文件并输出文件内容:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) {
String fileName = "C:/temp/test.txt";
try (FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr)) {
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例2:写入文件
以下示例是通过 BufferedWriter 和 FileWriter 向文件中写入一行字符串:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class WriteFile {
public static void main(String[] args) {
String fileName = "C:/temp/test.txt";
try (FileWriter fw = new FileWriter(fileName, true);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("Hello, World!\n");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上示例中 <String>
为省略的泛型参数,可以根据具体情况进行替换。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中I/O输入输出的深入讲解 - Python技术站