Java IO 面试题
1. Java中IO流分为哪两种?
Java中的IO流分为字节流和字符流。
2. 什么是字节流?
字节流是处理8位字节数据的流,主要用于处理二进制数据。
3. 什么是字符流?
字符流是处理16位Unicode字符数据的流,主要用于处理文本数据。
4. Java IO中哪些类是专门用来处理文件的?
FileInputStream
、FileOutputStream
、FileReader
和FileWriter
是专门用来处理文件的类。
5. 如何在Java中创建文件?
可以使用File
类的构造函数创建文件,或者使用Files.createFile
方法。
Files.createFile(Paths.get("path/to/file.txt"));
6. 如何在Java中删除文件?
可以使用File
类的delete()
方法,或者使用Files.delete
方法。
Files.delete(Paths.get("path/to/file.txt"));
7. 如何在Java中读取文件内容?
可以使用BufferedReader
、Scanner
或Files.readAllLines
方法读取文件内容。
List<String> lines = Files.readAllLines(Paths.get("path/to/file.txt"));
8. 如何在Java中写入文件内容?
可以使用BufferedWriter
或Files.write
方法写入文件内容。
Files.write(Paths.get("path/to/file.txt"), "Hello World".getBytes());
9. Java中如何实现随机访问文件?
可以使用RandomAccessFile
类实现随机访问文件。
RandomAccessFile file = new RandomAccessFile("path/to/file.txt", "rw");
10. 如何复制文件?
可以使用Files.copy
方法复制文件。
Files.copy(Paths.get("source.txt"), Paths.get("destination.txt"), StandardCopyOption.REPLACE_EXISTING);
11. 如何移动文件?
可以使用Files.move
方法移动文件。
Files.move(Paths.get("source.txt"), Paths.get("destination.txt"), StandardCopyOption.REPLACE_EXISTING);
12. Java中如何检查文件是否存在?
可以使用Files.exists
方法检查文件是否存在。
boolean exists = Files.exists(Paths.get("path/to/file.txt"), LinkOption.NOFOLLOW_LINKS);
13. Java中如何获取文件属性?
可以使用Files
类的getAttribute
方法获取文件属性。
Object attribute = Files.getAttribute(Paths.get("path/to/file.txt"), "posix:permissions");
14. Java中如何设置文件的读写权限?
可以使用Files.setPosixFilePermissions
方法设置文件的读写权限。
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r--r--");
Files.setPosixFilePermissions(Paths.get("path/to/file.txt"), perms);
15. Java中如何获取文件的大小?
可以使用Files.size
方法获取文件的大小。
long size = Files.size(Paths.get("path/to/file.txt"));
16. Java中如何列出目录内容?
可以使用Files.list
方法列出目录内容。
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("path/to/directory"))) {
for (Path path : stream) {
System.out.println(path.getFileName());
}
}
17. Java中如何创建临时文件?
可以使用Files.createTempFile
方法创建临时文件。
Path tempFile = Files.createTempFile("prefix", "suffix");
18. Java中如何实现序列化?
可以通过实现Serializable
接口实现对象的序列化。
public class MySerializableClass implements Serializable {
private static final long serialVersionUID = 1L;
// 类成员
}
19. Java中如何使用对象流进行对象的读写?
可以使用ObjectOutputStream
和ObjectInputStream
进行对象的读写。
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.data"));
oos.writeObject(myObject);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.data"));
MySerializableClass myObject = (MySerializableClass) ois.readObject();
ois.close();
20. Java中如何使用Properties类管理配置文件?
可以使用Properties
类的load
和store
方法管理配置文件。
Properties props = new Properties();
props.load(new FileInputStream("config.properties"));
// 修改属性
props.setProperty("key", "value");
// 保存属性
props.store(new FileOutputStream("config.properties"), "Description");
21. Java中如何实现缓冲区的输入输出?
可以使用BufferedInputStream
和BufferedOutputStream
实现缓冲区的输入输出。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.txt"));
22. Java中如何使用管道进行线程间通信?
可以使用PipedInputStream
和PipedOutputStream
进行线程间通信。
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
// 在一个线程中写入
new Thread(() -> {
try {
pos.write("Some data".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 在另一个线程中读取
new Thread(() -> {
try {
int data = pis.read();
System.out.println((char) data);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
23. Java中如何使用Zip文件进行压缩和解压缩?
可以使用ZipOutputStream
和ZipInputStream
进行Zip文件的压缩和解压缩。
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("archive.zip"));
zos.putNextEntry(new ZipEntry("file1.txt"));
zos.write("Some data".getBytes());
zos.closeEntry();
zos.close();
24. Java中如何复制整个目录?
可以使用Files.walk
方法配合Files.copy
复制整个目录。
Path source = Paths.get("sourceDirectory");
Path target = Paths.get("targetDirectory");
Files.walk(source)
.forEach(sourcePath -> {
Path targetPath = target.resolve(source.relativize(sourcePath).toString());
try {
if (Files.isDirectory(sourcePath)) {
Files.createDirectories(targetPath);
} else {
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
}
} catch (IOException e) {
e.printStackTrace();
}
});
25. Java中如何监控文件的变化?
可以使用WatchService
接口监控文件的变化。
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("path/to/directory");
dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey key;
while ((key = watcher.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path filename = ev.context();
System.out.println(kind.name() + ": " + filename);
}
key.reset();
}