Java

Java 知识量:11 - 45 - 220

10.2 现代的Java I/O><

Files类- 10.2.1 -

ava.nio.file包中的Files类是Java 7引入的一种新类,用于处理文件I/O。它提供了许多静态方法,可以用来读取、写入、复制、移动、删除和创建文件。以下是一些主要的功能:

1、读取文件:Files类提供了诸如readAllLines、readAllBytes和lines等方法来读取文件的内容。

Path filePath = Paths.get("path_to_file");  
List<String> lines = Files.readAllLines(filePath);

2、写入文件:Files类提供了诸如write、append和createFile等方法来写入文件。

Path filePath = Paths.get("path_to_file");  
List<String> linesToWrite = Arrays.asList("Line 1", "Line 2");  
Files.write(filePath, linesToWrite);

3、复制和移动文件:Files类提供了copy和move方法来复制或移动文件。

Path sourcePath = Paths.get("source_file_path");  
Path destinationPath = Paths.get("destination_file_path");  
Files.copy(sourcePath, destinationPath);

4、删除文件:Files类提供了delete和deleteIfExists方法来删除文件。

Path filePath = Paths.get("file_to_delete");  
Files.delete(filePath);

5、创建文件:Files类提供了createFile方法来创建文件。

Path filePath = Paths.get("file_to_create");  
Files.createFile(filePath);

6、其他功能:此外,Files类还提供了诸如isRegularFile、isDirectory、exists等方法来检查文件或目录是否存在,是否是常规文件,是否是目录等。

注意:在使用这些方法时,如果涉及的文件很大,或者文件的路径很长,最好使用缓冲区,以减少内存的使用。同时,对于可能发生的异常(如NoSuchFileException,IOException等),需要进行适当的异常处理。

Path类- 10.2.2 -

Java的java.nio.file.Path类表示文件系统的路径。这个类在Java的NIO(New I/O)库中,是文件I/O操作中使用的基本类型。

Path对象从文件系统的根目录开始,通过一系列的目录名和文件名来描述文件的完整路径。例如,在Windows系统上,路径可能是C:\Users\username\Documents\file.txt,而在类Unix系统(如Linux或Mac OS)上,路径可能是/home/username/Documents/file.txt。

Path对象可以表示一个文件或一个目录。可以使用Path对象来进行很多文件系统的操作,例如创建新的文件或目录,删除文件或目录,查找文件或目录,以及获取或修改文件或目录的属性等。

以下是使用Path对象的一些示例:

import java.nio.file.*;  
  
// 获取当前路径  
Path currentPath = Paths.get("");  
System.out.println("Current path: " + currentPath);  
  
// 创建新的文件  
Path newFile = currentPath.resolve("newFile.txt");  
Files.createFile(newFile);  
  
// 创建新的目录  
Path newDirectory = currentPath.resolve("newDirectory");  
Files.createDirectories(newDirectory);  
  
// 删除文件或目录  
Files.delete(newFile);  
Files.delete(newDirectory);

这些操作可能会抛出IOException,因此还需要进一步处理这些异常。

ByteBuffer对象- 10.2.3 -

ByteBuffer是Java NIO(新输入/输出)API中的一个关键类,用于处理I/O操作。它提供了一种缓冲区,用于临时存储字节,为对I/O操作的大量数据处理提供了有效的方法。

主要特点:

  • 直接缓冲区:ByteBuffer是一个直接ByteBuffer,它可以用于从内存操作数据,例如读写字节、short、int、long、char和float、double等数据类型。

  • 堆缓冲区:与普通的Java数组不同,ByteBuffer可以在内存中创建和操作数据,这称为堆缓冲区。

  • 池缓冲区:ByteBuffer可以用于创建和操作数据池,这是一种在内存中保存大量数据的机制。

基本应用示例:

// 创建ByteBuffer对象  
ByteBuffer buffer = ByteBuffer.allocate(1024);  
  
// 向缓冲区中添加数据  
buffer.put((byte)1);  
buffer.put((byte)2);  
buffer.put((byte)3);  
  
// 重置缓冲区position为0,以便从头开始读取数据  
buffer.flip();  
  
// 从缓冲区中读取数据  
while(buffer.hasRemaining()){  
  byte b = buffer.get();  
  System.out.println(b);  
}  
  
// 清空缓冲区,重置position为0,以便再次写入数据  
buffer.clear();

在上述代码中:

  • allocate(1024)方法用于创建一个新的ByteBuffer,它有1024个字节的空间。

  • put(byte)方法将一个字节添加到缓冲区的尾部。

  • flip()方法重置缓冲区的position为0,使得数据的读取从缓冲区的开始位置开始。在写入和读取数据之间调用flip()是很常见的。

  • hasRemaining()和get()方法检查是否还有剩余的数据可以读取,并从缓冲区中读取一个字节。

  • clear()方法清空缓冲区,将position设置为0,使得新的数据可以添加到缓冲区的开始位置。

注意:当使用put()方法添加数据到缓冲区时,数据被添加到缓冲区的尾部。当使用get()方法读取数据时,数据从缓冲区的当前位置读取。使用flip()和clear()方法可以重置position的值。如果不注意管理position的值,可能会读取或写入错误的数据。

异步I/O- 10.2.4 -

Java的异步I/O(输入/输出)是一种在执行读写操作时不阻塞线程或进程的技术。这意味着在进行I/O操作时,程序可以继续执行其他任务,而不需要等待I/O操作完成。这种方式可以提高程序的效率和响应性。

Java的NIO库提供了对异步I/O的支持。以下是Java NIO中与异步I/O相关的一些关键特性:

  • 选择器:Java NIO引入了选择器的概念,允许一个线程管理多个通道。这意味着一个线程可以管理多个连接和I/O操作,而不需要为每个操作创建单独的线程。

  • 通道和缓冲区:Java NIO使用通道和缓冲区来处理I/O操作。通道是一个可以异步读写数据的抽象接口,而缓冲区则是一个用于存储数据的内存区域。

  • 非阻塞I/O:Java NIO支持非阻塞I/O操作。这意味着通道可以在不必等待底层I/O操作完成的情况下继续执行。非阻塞I/O可以提高程序的效率和响应性。

  • Reactor模式:Java NIO中的Reactor模式允许一个线程处理多个I/O事件,而无需为每个事件创建单独的线程。这使得应用程序能够更有效地利用系统资源,并提高整体性能。

  • AsynchronousFileChannel:Java NIO库提供了AsynchronousFileChannel类,用于异步读写文件。这个类允许一个线程同时处理多个文件I/O操作。

  • CompletionHandler:Java NIO提供了一种基于回调的机制,称为CompletionHandler。这种机制允许开发人员定义在I/O操作完成时执行的操作。