本文将从两个方面来阐述Java中的文件操作,可以使用java.nio.file
包中的类来处理文件的元信息和路径操作以及用InputStream等类来进行文件读写操作。
文件的元信息和路径的处理
获取文件的元信息
以下是具体示范:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.io.IOException;
public class FileInfoExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("File creation time: " + attr.creationTime());
System.out.println("File last modified time: " + attr.lastModifiedTime());
System.out.println("Is directory? " + attr.isDirectory());
System.out.println("Is regular file? " + attr.isRegularFile());
System.out.println("File size: " + attr.size());
} catch (IOException e) {
System.err.println("Unable to read file attributes: " + e.getMessage());
}
}
}
路径操作:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExample {
public static void main(String[] args) {
Path path = Paths.get("C:/Users/Username/Documents/example.txt");
// 获取文件名
System.out.println("File name: " + path.getFileName());
// 获取父目录
System.out.println("Parent directory: " + path.getParent());
// 获取绝对路径
System.out.println("Absolute path: " + path.toAbsolutePath());
// 转换为字符串
String pathString = path.toString();
System.out.println("Path as string: " + pathString);
// 检查路径是否是绝对路径
System.out.println("Is absolute path? " + path.isAbsolute());
}
}
文件读写
在Java中,流(Stream)是一种用于在程序之间传输数据的抽象概念。流可以是输入流(Input Stream)用于读取数据,也可以是输出流(Output Stream)用于写入数据。流可以从不同的数据源(如文件、网络连接、内存等)读取数据,也可以将数据写入到不同的目的地。
Java中的流可以分为两种主要类型:字节流和字符流。
字节流(Byte Streams):
字节流以字节为单位进行读写操作,适用于处理二进制数据或无格式的文本数据。主要的字节流类有:
InputStream
:所有字节输入流的基类。OutputStream
:所有字节输出流的基类。FileInputStream
:用于从文件中读取数据的输入流。FileOutputStream
:用于向文件中写入数据的输出流。ByteArrayInputStream
:从字节数组中读取数据的输入流。ByteArrayOutputStream
:向字节数组中写入数据的输出流。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try {
// 写入文件
FileOutputStream outputStream = new FileOutputStream("example.txt");
String data = "Hello, World!";
byte[] bytes = data.getBytes();
outputStream.write(bytes);
outputStream.close();
System.out.println("Data written to file successfully.");
// 读取文件
FileInputStream inputStream = new FileInputStream("example.txt");
int byteData;
while ((byteData = inputStream.read()) != -1) {
System.out.print((char) byteData);
}
inputStream.close();
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
字符流(Character Streams):
字符流以字符为单位进行读写操作,适用于处理文本数据。字符流会自动处理字符编码和解码,因此更适合处理文本数据,特别是涉及到国际化的情况。主要的字符流类有:
Reader
:所有字符输入流的基类。Writer
:所有字符输出流的基类。FileReader
:用于从文件中读取字符数据的输入流。FileWriter
:用于向文件中写入字符数据的输出流。BufferedReader
:提供缓冲功能,用于高效读取字符数据。BufferedWriter
:提供缓冲功能,用于高效写入字符数据。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
try {
// 写入文件
BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));
writer.write("Hello, World!");
writer.close();
System.out.println("Data written to file successfully.");
// 读取文件
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
区别:
- 处理数据单位:字节流以字节为单位进行读写操作,而字符流以字符为单位进行读写操作。
- 适用数据类型:字节流适用于处理二进制数据或无格式的文本数据,而字符流适用于处理文本数据。
- 处理文本编码:字符流会自动处理字符编码和解码,而字节流不会,需要手动进行处理。
在选择流类型时,需要根据所处理的数据类型以及需求来决定使用字节流还是字符流。通常情况下,如果处理的是文本数据,推荐使用字符流;如果处理的是二进制数据或无格式的文本数据,可以使用字节流。