Java I/O(输入/输出)是指Java程序与外部世界进行通信的过程。这通常涉及从文件、网络连接、控制台等读取数据以及向这些源写入数据。
1.File
File类是 java.io包中的一个重要类,它表示文件或目录路径名的抽象表示。File类提供了多种方法来操作文件和目录,包括创建、删除、重命名、检查文件属性等,但不直接提供文件内容的读写操作。
1. 文件和目录路径名的表示
File类可以表示一个实际的文件路径或一个目录路径。以下是创建 File对象的方式:
File file = new File("//文件路径");
在Java中,可以使用斜杠 / 或反斜杠 \ 作为路径分隔符,但在字符串中反斜杠需要转义。
File类提供了一系列方法来操作文件和目录, 还提供了检查文件属性的方法:
- createNewFile():在文件系统中创建一个新的空文件。
- mkdir():创建一个新的单级目录。
- delete():删除文件或目录。
- exists():检查文件或目录是否存在。
- isFile():检查是否是一个文件。
- isDirectory():检查是否是一个目录。
- getName():返回文件的名称。
- getPath():返回文件的路径。
示例:
这个例子展示了如何遍历指定目录下的所有文件和子目录,并打印它们的详细信息。
2.字节流
字节流是一种基本的 I/O 流,用于以字节为单位读取和写入数据。字节流是最基础的流类型,其他更高级的流(如字符流、对象流等)都是在字节流的基础上构建的。字节流不包含任何格式化的信息,它只是简单地按照字节顺序传输数据。
读写文件
字节流主要由两个抽象类InputStream和OutputStream来表示,它们分别用于读取和写入数据。
InputStream是一个抽象类,用于表示所有输入字节流的基础。
常用的子类有FileInputStream,它用于从文件系统中的文件读取数据。
读取文件时,可以逐字节读取,也可以将字节放入缓冲区中批量读取。
OutputStream同样是一个抽象类,用于表示所有输出字节流的基础。
常用的子类有FileOutputStream,它用于将数据写入文件系统中的文件。
写入文件时,可以逐字节写入,也可以使用缓冲区进行批量写入。
*普通的文件复制效率低下,可以将多个字符暂时装在一块(这被称为缓冲区),当运行时一起读取。
read():读操作
write():写操作
定义读取和写入:
FileInputStream in = new FileInputStream("//文件");
FileOutputStream out = new FileOutputStream("//文件");
以下是读取和写入的示例:
public class ByteStreamExample {
public static void main(String[] args) throws IOException {
// 读取文件
FileInputStream in = new FileInputStream("//文件");
int b;
//读取到-1就退出while循环,也就是字符读完了
while ((b = in.read()) != -1) {
System.out.println(b);
}
in.close();
// 写入文件
FileOutputStream out = new FileOutputStream("//文件");
String str = "Hello, World!";
byte[] bArray = str.getBytes();
out.write(bArray);
out.close();
}
}
*注意,读写操作需要抛出IOException,否则会报错。
字符流
字符流是基于字符的数据流,它处理的是16位的Unicode字符。与字节流不同,字符流能够自动处理字符编码和解码,这使得它在处理文本数据时更为方便和高效。字符流的核心是java.io.Reader和java.io.Writer两个抽象类。所有的字符流类都是这两个类的子类。
输入流
FileReader:用于从文件中读取字符数据。
BufferedReader:提供缓冲功能,可以一次读取一行数据,提高读取效率。
InputStreamReader:将字节流转换为字符流,可以指定字符编码。
输出流
FileWriter:用于向文件中写入字符数据。
BufferedWriter:提供缓冲功能,可以方便地写入一行数据,提高写入效率。
OutputStreamWriter:将字符流转换为字节流,可以指定字符编码。
特性:
字符编码:字符流能够处理字符编码问题,这使得在不同字符编码之间转换变得简单。
缓冲:使用BufferedReader和BufferedWriter可以提供缓冲功能,提高读写效率。
行处理:BufferedReader提供了readLine()方法,可以方便地按行读取文本数据,直接读取一排,例如下文。
BufferedReader读取文件的示例:
BufferedWriter writer = new BufferedWriter(new FileWriter("//文件"));
writer.write("第一行文本");
writer.newLine();
writer.write("第二行文本");
writer.close();
字符流是Java中处理文本数据的重要工具,提供了丰富的类和方法来方便地读取和写入字符数据。合理使用字符流可以有效地提高程序处理文本数据的效率。
持续更新中