Java IO 面试题

1. Java中IO流分为哪两种?

Java中的IO流分为字节流和字符流。

2. 什么是字节流?

字节流是处理8位字节数据的流,主要用于处理二进制数据。

3. 什么是字符流?

字符流是处理16位Unicode字符数据的流,主要用于处理文本数据。

4. Java IO中哪些类是专门用来处理文件的?

FileInputStreamFileOutputStreamFileReaderFileWriter是专门用来处理文件的类。

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中读取文件内容?

可以使用BufferedReaderScannerFiles.readAllLines方法读取文件内容。

List<String> lines = Files.readAllLines(Paths.get("path/to/file.txt"));

8. 如何在Java中写入文件内容?

可以使用BufferedWriterFiles.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中如何使用对象流进行对象的读写?

可以使用ObjectOutputStreamObjectInputStream进行对象的读写。

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类的loadstore方法管理配置文件。

Properties props = new Properties();
props.load(new FileInputStream("config.properties"));

// 修改属性
props.setProperty("key", "value");

// 保存属性
props.store(new FileOutputStream("config.properties"), "Description");

21. Java中如何实现缓冲区的输入输出?

可以使用BufferedInputStreamBufferedOutputStream实现缓冲区的输入输出。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.txt"));

22. Java中如何使用管道进行线程间通信?

可以使用PipedInputStreamPipedOutputStream进行线程间通信。

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文件进行压缩和解压缩?

可以使用ZipOutputStreamZipInputStream进行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();
}