转自 开发者的天空
随机访问文件
允许我们不按照顺序的访问文件的内容,这
里的访问包括读和写。要随机的访问文件,我们就要打开文件,定位到指定的位置,然后读或写文件内容。在Javs SE
7中,SeekableByteChannel接口提供了这个功能。
SeekableByteChannel提供了一些简单易用的方法。依靠这些方法,我们能够设置或查询当前的位置,然后从当前位置读或者往当前位置写。该
接口提供的方法有:
* position – 查询通道当前的位置
* position(long) – 设置通道当前的位置
* read(ByteBuffer) – 从通道向缓冲区读字节内容
* write(ByteBffer) – 将缓冲区内的字节内容写入通道
* truncate(long) – 截断连接到通道的文件(或其他实体)
在实际的使用中,我们可以用Path
.newByteChannel获取一个
SeekableByteChannel实例。在缺省的文件系统上,我们可以直接使用该实例,或者将其转换成FileChannel。
FileChannel提供了一些更高级的特性,如将文件的一部分直接映射到内存中来提高访问速度、锁定文件的一部分、直接在指定的绝对位置读或写而不影
响通道的当前位置等。
下面的例子中,我们打开了一个文件,然后将返回的SeekableByteChannel转换成FileChannel,然后开始我们的文件操作
。首先我们从头开始读取12个字节,然后我们
重新定位到文件开头,从这里开始写如'I was here!\n'。然后我们定位到文件的尾部,再一次添加'I was
here!\n',然后将读取的文件的前12个字节添加到这里。
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
String s = "I was here!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);
ByteBuffer copy = ByteBuffer.allocate(12);
FileChannel fc = null;
Path file = Paths.get("c:\\testChannel.txt");
try {
fc = (FileChannel)file.newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE);
//Read the first 12 bytes of the file.
int nread;
do {
nread = fc.read(copy);
} while (nread != -1 && copy.hasRemaining());
//Write "I was here!" at the beginning of the file.
fc.position(0);
while (out.hasRemaining())
fc.write(out);
out.rewind();
/*Move to the end of the file, write "I was here!" again,then copy the first 12 bytes to the end of the file.*/
long length = fc.size();
fc.position(length);
while (out.hasRemaining())
fc.write(out);
copy.flip();
while (copy.hasRemaining())
fc.write(copy);
} catch (IOException x) {
System.out.println("I/O Exception: " + x);
} finally {
//Close the file.
if (fc != null) fc.close();
System.out.println(file + " has been modified!");
}
假设原来的文件内容为
123456789ABCDEF
那么程序执行之后,文件的内容变化为
I was here!
DEFI was here!
123456789ABC
需要注意的是,当定位到文件的末尾是,位置是fc.size(), 并没有减1。如果减了1,原来的文件中最后一个字节会被覆盖。
分享到:
相关推荐
8. Java I/O:掌握基本的输入输出(I/O)流编程,包括文件I/O、序列化和随机访问文件等操作。 9. Java的新日期和时间API:例如java.time包下的类,如LocalDate、LocalTime和ZonedDateTime等,这些API取代了旧的日期...
- **ArrayList与LinkedList**:ArrayList基于动态数组,适用于随机访问;LinkedList基于链表,适用于插入和删除操作。 - **HashSet与TreeSet**:HashSet快速查找,不保证元素顺序;TreeSet使用红黑树实现,保证...
Java API操作手册是Java开发人员的重要参考资料,涵盖了Java Standard Edition (SE) 1.8版本的核心库和API。这份手册提供了详细的类、接口和方法的描述,帮助开发者理解和使用Java编程语言。以下是一些关键的知识点...
- `RandomAccessFile` 允许以随机方式访问文件,支持读写操作。 **1.1.4 与时间有关的类** - **Date, DateFormat, Calendar** - `Date` 表示特定的时间点。 - `DateFormat` 用于格式化和解析日期。 - `...
- **RandomAccessFile**:允许对文件进行随机访问。 5. **Java线程**:Java提供了Thread类和Runnable接口来实现多线程编程,线程同步和通信主要通过synchronized关键字、wait/notify机制以及Lock接口实现。 6. **...
此外,`java.io.RandomAccessFile`类提供了一种随机访问文件数据的方式,允许读写文件的任意位置。在创建`RandomAccessFile`对象时,需要指定模式,如只读模式`"r"`或读写模式`"rw"`。`write(int)`方法用于写入单个...
2. 对于大文件,可以使用RandomAccessFile进行随机访问。 3. 使用FileChannel进行大文件的高效传输,如内存映射文件(MappedByteBuffer)。 六、网络IO Java IO也支持网络通信,如Socket和ServerSocket类,可用于...
- **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一次编写,到处运行”的...
- **1.3 读入和写出二进制数据**:探讨了如何使用Java处理二进制数据,例如通过随机访问文件进行操作。 - **1.4 ZIP文档**:介绍了如何使用Java处理ZIP格式的文件。 - **1.5 对象流与序列化**:序列化是将对象状态...
### Java SE复习知识点详解 #### Java 的优点 在学习 Java SE 之前,了解 Java 的优点是非常重要的,这有助于我们更好地理解为什么 Java 成为了一个广泛使用的编程语言。 1. **平台无关性**:Java 代码可以在任何...
- **ArrayList与LinkedList**:两种常用列表实现,ArrayList适合随机访问,LinkedList适合频繁插入和删除。 - **HashMap与TreeMap**:HashMap提供快速的查找,基于哈希表;TreeMap保持元素排序,基于红黑树。 - *...
- 对象流与随机存取文件流的特点。 - **GUI编程**: - Java Swing组件的基本介绍与使用。 - 事件处理机制的理解与实现。 - 2D图形的绘制方法。 - **数据库编程**: - JDBC(Java Database Connectivity)的...
20. **Java 8及以后的更新**:Java 8引入了Lambda表达式、函数式编程和Stream API等新特性,后续版本持续优化性能和添加新功能。 以上是对Java编程语言及其相关领域的概述,如果你的"JAVA--pdf3"文档包含了这些主题...
- RandomAccessFile类的特点:支持随机访问文件。 - RandomAccessFile类的方法:read()、write()等。 - **字节流与字符流** - 字节流:InputStream、OutputStream。 - 字符流:Reader、Writer。 - **字节-字符...
- **ArrayList**和**LinkedList**:两种常见的动态数组实现,分别提供随机访问和高效插入/删除操作。 - **HashMap**和**HashSet**:基于哈希表的数据结构,用于快速查找和存储元素。 - **TreeMap**和**TreeSet**...
多线程是Java的重要特性之一,它允许程序同时执行多个任务。Thread类代表一个独立的执行线程,Runnable接口定义了线程执行的代码。通过实现Runnable或继承Thread,可以创建并启动新线程。同步机制,如synchronized...
- **随机存取文件流**:支持随机访问文件内容的流。 - **ZIP文件流**:用于处理压缩文件。 ### 13. 图形用户界面设计 - **事件处理机制**:处理用户交互事件的方法。 - **AWT与Swing组件**:两种用于创建GUI的应用...
- **文件通道(File Channels)**:提供了高效地读写文件的能力,支持随机访问文件,以及传输大量数据时的直接内存到内存的复制。 - **多路复用器(Selectors)**:通过多路复用器,可以监控多个通道,当有事件发生...
### Java复习知识点详解 ... - `RandomAccessFile`类可以随机访问文件中的任意位置。 以上是对“Java复习题目”文件中的知识点进行了详细解读和补充。希望这些内容能够帮助您更好地理解和掌握Java的相关知识。