Java NIO文件操作--相关类

简介: Buffer类 CharBuffer charBuffer = CharBuffer.allocate(8); charBuffer.capacity(); charBuffer.limit(); charBuffer.position(); 通过allocate()方法创建的Buffer对象是普通Buffer,ByteBuffer还提供了一个allocateDirect()方法类创建直接Buffer。

Buffer类

     CharBuffer charBuffer = CharBuffer.allocate(8);
        charBuffer.capacity();
        charBuffer.limit();
        charBuffer.position(); 
  • 通过allocate()方法创建的Buffer对象是普通Buffer,ByteBuffer还提供了一个allocateDirect()方法类创建直接Buffer。直接Buffer的创建成本比普通Buffer的创建成本高,但直接Buffer的读取效率高!
  • 也就是说直接Buffer适用于长期生存期的Buffer,而不适用于短生存期的Buffer.并且只有ByteBuffer才提供了allocateDirect()方法。

FileChannel类

    FileChannel fileChannelIn = fileInputStream.getChannel();
        FileChannel fileChannelOut = fileOutputStream.getChannel();
        MappedByteBuffer mappedByteBuffer = fileChannelIn.map(MapMode.READ_ONLY, 0, filein.length());
        fileChannelOut.write(mappedByteBuffer);

文件锁FileLock

    fileChannel = new FileOutputStream("a.txt").getChannel();
            FileLock fileLock = fileChannel.tryLock();
            Thread.sleep(10000);//文件处理
            fileLock.release();
  • 文件锁:可以有效的阻止多个进程并发修改同一个文件。
  • lock()试图锁定某个文件,如果无法得到文件锁,程序一直阻塞。
  • tryLock()尝试锁定某个文件,它将直接返回而不是阻塞,如果获得了文件锁,该方法则返回该文件锁,否则返回null。
  • lock(long postion, long size, boolean shared)对文件从postion开始,长度为size的内容加锁,该方法是阻塞式的。
  • tryLock(long postion, long size,boolean shared) 非阻塞式的加锁方法,参数同上。
  • 当参数shared为true时,寿命该锁是一个共享锁,他将允许多个进程来读取文件,但阻止其他进程获得对该文件的排他锁。
  • 当参数为false时,表明该锁是一个排他锁,他将锁住对该文件的读写。程序可以调用FileLock的isShared来判断它获得的锁是否是共享锁。

FileVisitor

public static void main(String[] args) throws IOException {
        Files.walkFileTree(Paths.get("D:\\"),new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                    BasicFileAttributes attrs) throws IOException {
                System.out.println("正在访问的路径="+dir);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                    BasicFileAttributes attrs) throws IOException {
                if (file.endsWith("FileVisitorTest.java")) {
                    System.out.println("找到目标文件");
                    return FileVisitResult.TERMINATE;
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                return super.visitFileFailed(file, exc);
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc)
                    throws IOException {
                System.out.println("访问结束");
                return super.postVisitDirectory(dir, exc);
            }

        });
    }

如示例,可以使用FileVisitor 进行磁盘文件查找。

WatchService

public static void main(String[] args) {
        try {
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Paths.get("D:\\").register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
            while(true){
                WatchKey key = watchService.take();
                for (WatchEvent<?> event : key.pollEvents()) {
                    System.out.println(event.context()+ "发生了"+event.kind()+"事件");
                }
                boolean vaild = key.reset();//重设WatchKey
                if (!vaild) {//如果重设失败,退出监听
                    break;
                }
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }
  • 使用的是D盘目录进行监听,这个监控文件变化的监听器可以做到对D盘和它的第一级子目录的变化进行监听,对它的子目录内部的变化无法做到监听。
  • WatchService有3个方法来获取舰艇目录的文件变化事件。
  • poll():获取下一个WatchKey,如果没有WatchKey发生就立即返回null。
  • poll(long timeout, TimeUnit unit):尝试等待timeout时间去获取下一个WatchKey。
  • take() : 获取下一个WatchKey,如果没有WatchKey发生就移植等待。
    如果程序需要一直监控,则选择take()方法。如果程序需要监听指定时间,使用poll()方法。

访问文件属性BasicFileAttributeView

public static void main(String[] args) {
        Path testPath = Paths.get(".\\src\\com\\yin\\nio\\AttributeViewTest.java");
        BasicFileAttributeView basicView = Files.getFileAttributeView(testPath,
                BasicFileAttributeView.class);
        try {
            BasicFileAttributes basicFileAttributes = basicView.readAttributes();
            PrintStr("创建时间:"+new Date(basicFileAttributes.creationTime().toMillis()).toLocaleString());
            PrintStr("最后访问时间:"+new Date(basicFileAttributes.lastAccessTime().toMillis()).toLocaleString());
            PrintStr("最后修改时间:"+new Date(basicFileAttributes.lastModifiedTime().toMillis()).toLocaleString());
            PrintStr("文件大小:"+basicFileAttributes.size());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }   
    private static void PrintStr(String str){
        System.out.println(str);
    }




Java NIO2(AIO)

JDK1.7 NIO2主要改进了Classic I/O中java.io.File类对文件操作的局限性
NIO2还带来了真正意义上的Asynchronous I/O(异步I/O),具体实现分为文件Asynchronous I/O与网络传输Asynchronous I/O。因此NIO2也称为AIO。

NIO2 在 File 操作方面的升级
  • Path介绍:URI,FileSystems
  • Paths、Files工具类介绍
  • WatchService接口:提供了通过应用程序监听操作系统文件变更事件的能力
文件读写 Asynchronous I/O

NIO2通过AsynchronousFileChannel提供了异步读写文件的功能。通过AsynchronousFileChannel异步读写文件有CompletionHandler与Future两种方式。

Java 异步 I/O 网络通信实现

NIO2通过引入AsynchronousSocketChannel与AsynchronousServerSocketChannel实现了异步I/O网络通信模型。

目录
相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
166 57
|
21天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
21天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
30 3
|
28天前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
39 5
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
70 8
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
145 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
90 2
|
2月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
32 0