`
AsWater
  • 浏览: 24758 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java SE 7新特性之文件操作(7) - 随机访问文件

阅读更多

转自 开发者的天空

 

随机访问文件 允许我们不按照顺序的访问文件的内容,这 里的访问包括读和写。要随机的访问文件,我们就要打开文件,定位到指定的位置,然后读或写文件内容。在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,原来的文件中最后一个字节会被覆盖。

分享到:
评论

相关推荐

    Java SE 8 Programmer Practice Tests

    8. Java I/O:掌握基本的输入输出(I/O)流编程,包括文件I/O、序列化和随机访问文件等操作。 9. Java的新日期和时间API:例如java.time包下的类,如LocalDate、LocalTime和ZonedDateTime等,这些API取代了旧的日期...

    JAVA SE应用详解

    - **ArrayList与LinkedList**:ArrayList基于动态数组,适用于随机访问;LinkedList基于链表,适用于插入和删除操作。 - **HashSet与TreeSet**:HashSet快速查找,不保证元素顺序;TreeSet使用红黑树实现,保证...

    java api 操作手册

    Java API操作手册是Java开发人员的重要参考资料,涵盖了Java Standard Edition (SE) 1.8版本的核心库和API。这份手册提供了详细的类、接口和方法的描述,帮助开发者理解和使用Java编程语言。以下是一些关键的知识点...

    (超赞)JAVA精华之--深入JAVA API

    - `RandomAccessFile` 允许以随机方式访问文件,支持读写操作。 **1.1.4 与时间有关的类** - **Date, DateFormat, Calendar** - `Date` 表示特定的时间点。 - `DateFormat` 用于格式化和解析日期。 - `...

    JAVA SE学习精华集锦

    - **RandomAccessFile**:允许对文件进行随机访问。 5. **Java线程**:Java提供了Thread类和Runnable接口来实现多线程编程,线程同步和通信主要通过synchronized关键字、wait/notify机制以及Lock接口实现。 6. **...

    3Java SE(下).doc

    此外,`java.io.RandomAccessFile`类提供了一种随机访问文件数据的方式,允许读写文件的任意位置。在创建`RandomAccessFile`对象时,需要指定模式,如只读模式`"r"`或读写模式`"rw"`。`write(int)`方法用于写入单个...

    java io 系列操作代码练习 Java学习资料

    2. 对于大文件,可以使用RandomAccessFile进行随机访问。 3. 使用FileChannel进行大文件的高效传输,如内存映射文件(MappedByteBuffer)。 六、网络IO Java IO也支持网络通信,如Socket和ServerSocket类,可用于...

    最新Java面试题

    - **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一次编写,到处运行”的...

    《java核心技术》这是学习java一本很好的书 这是下部 还有上部!

    - **1.3 读入和写出二进制数据**:探讨了如何使用Java处理二进制数据,例如通过随机访问文件进行操作。 - **1.4 ZIP文档**:介绍了如何使用Java处理ZIP格式的文件。 - **1.5 对象流与序列化**:序列化是将对象状态...

    Java SE复习

    ### Java SE复习知识点详解 #### Java 的优点 在学习 Java SE 之前,了解 Java 的优点是非常重要的,这有助于我们更好地理解为什么 Java 成为了一个广泛使用的编程语言。 1. **平台无关性**:Java 代码可以在任何...

    Java的详细介绍

    - **ArrayList与LinkedList**:两种常用列表实现,ArrayList适合随机访问,LinkedList适合频繁插入和删除。 - **HashMap与TreeMap**:HashMap提供快速的查找,基于哈希表;TreeMap保持元素排序,基于红黑树。 - *...

    Java软件开发实战 Java基础与案例开发详解 17-2 总体设计 共5页.pdf

    - 对象流与随机存取文件流的特点。 - **GUI编程**: - Java Swing组件的基本介绍与使用。 - 事件处理机制的理解与实现。 - 2D图形的绘制方法。 - **数据库编程**: - JDBC(Java Database Connectivity)的...

    JAVA--pdf3

    20. **Java 8及以后的更新**:Java 8引入了Lambda表达式、函数式编程和Stream API等新特性,后续版本持续优化性能和添加新功能。 以上是对Java编程语言及其相关领域的概述,如果你的"JAVA--pdf3"文档包含了这些主题...

    JAVA经典教材笔记

    - RandomAccessFile类的特点:支持随机访问文件。 - RandomAccessFile类的方法:read()、write()等。 - **字节流与字符流** - 字节流:InputStream、OutputStream。 - 字符流:Reader、Writer。 - **字节-字符...

    java官方学习文档

    - **ArrayList**和**LinkedList**:两种常见的动态数组实现,分别提供随机访问和高效插入/删除操作。 - **HashMap**和**HashSet**:基于哈希表的数据结构,用于快速查找和存储元素。 - **TreeMap**和**TreeSet**...

    b-javase.zip_java

    多线程是Java的重要特性之一,它允许程序同时执行多个任务。Thread类代表一个独立的执行线程,Runnable接口定义了线程执行的代码。通过实现Runnable或继承Thread,可以创建并启动新线程。同步机制,如synchronized...

    Java软件开发实战 Java基础与案例开发详解 4-5 增强for循环 共5页.pdf

    - **随机存取文件流**:支持随机访问文件内容的流。 - **ZIP文件流**:用于处理压缩文件。 ### 13. 图形用户界面设计 - **事件处理机制**:处理用户交互事件的方法。 - **AWT与Swing组件**:两种用于创建GUI的应用...

    java NIO 中文开发文档

    - **文件通道(File Channels)**:提供了高效地读写文件的能力,支持随机访问文件,以及传输大量数据时的直接内存到内存的复制。 - **多路复用器(Selectors)**:通过多路复用器,可以监控多个通道,当有事件发生...

    java复习题目

    ### Java复习知识点详解 ... - `RandomAccessFile`类可以随机访问文件中的任意位置。 以上是对“Java复习题目”文件中的知识点进行了详细解读和补充。希望这些内容能够帮助您更好地理解和掌握Java的相关知识。

Global site tag (gtag.js) - Google Analytics