Java 中的 IO 和 NIO

emir分析RC corner如何选择 power analysis阶段 RC corner的选择 阅读详情

Java IO 介绍

Java IO(Input/Output)流是用于处理输入和输出数据的机制。它提供了一种标准化的方式来读取和写入数据,可以与文件、网络、标准输入输出等进行交互。

Java IO流主要分为两个流模型:字节流(Byte Stream)和字符流(Character Stream)。

字节流(Byte Stream)

  • InputStream:字节输入流的抽象基类,用于从源中读取字节数据。
  • OutputStream:字节输出流的抽象基类,用于向目标中写入字节数据。

常见的字节流实现类包括:

  • FileInputStream:从文件中读取字节数据。
  • FileOutputStream:将字节数据写入文件。
  • BufferedInputStream/BufferedOutputStream:带有缓冲区的字节流,提高读写效率。

字符流(Character Stream)

  • Reader:字符输入流的抽象基类,用于从源中读取字符数据。
  • Writer:字符输出流的抽象基类,用于向目标中写入字符数据。

常见的字符流实现类包括:

  • FileReader:从文件中读取字符数据。
  • FileWriter:向文件中写入字符数据。
  • BufferedReader/BufferedWriter:带有缓冲区的字符流,提高读写效率。

使用Java IO流的一般步骤如下:

  • 打开流:通过实例化相应的流对象,与输入或输出源建立连接。
  • 读取或写入数据:通过流对象提供的方法进行数据的读取或写入操作。
  • 关闭流:使用完流后,需要显式地关闭流,释放资源。

示例

// 需要注意的是,在使用流操作完成后,我们应该及时关闭流以释放资源,以上述代码为例,使用了try-with-resources语句来实现自动关闭流。
try (FileInputStream fis = new FileInputStream("input.txt");
     BufferedInputStream bis = new BufferedInputStream(fis);
     FileOutputStream fos = new FileOutputStream("output.txt");
     BufferedOutputStream bos = new BufferedOutputStream(fos)) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Java NIO(New IO)介绍

Java NIO(New IO)是Java 1.4版本引入的一套新的IO API,提供了更高效、更灵活的IO操作方式。

相比于传统的Java IO(InputStream/OutputStream),Java NIO主要有以下几个特点:

  • 通道(Channel)和缓冲区(Buffer):Java NIO使用通道来进行数据的读写,而不再依赖于流。通道可以双向传输数据,并且与底层操作系统交互的能力更强。数据通过缓冲区进行传输,可以提高IO操作的效率。
  • 非阻塞IO:Java NIO支持非阻塞IO操作,可以实现一个线程处理多个连接(例如网络连接),提高系统的并发性能。
  • 选择器(Selector):选择器是Java NIO提供的一种多路复用机制,可以用于监控多个通道的事件(如连接建立、数据到达等),从而实现高效的事件驱动编程模型。
  • 字符集编解码器:Java NIO提供了字符集编解码器,可以方便地进行字符集转换,支持Unicode、UTF-8等多种字符集。

使用Java NIO进行IO操作的一般步骤如下:

  • 打开通道(Channel):通过调用特定的通道类的open()方法打开一个通道。
  • 创建缓冲区(Buffer):创建适当大小的缓冲区,用于在通道和应用程序之间传输数据。
  • 读写数据:通过通道和缓冲区进行数据的读取和写入操作。
  • 关闭通道:使用完通道后,需要显式关闭通道以释放资源。

示例

try (RandomAccessFile file = new RandomAccessFile("file.txt", "rw");
    FileChannel channel = file.getChannel()) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    int bytesRead = channel.read(buffer);
    while (bytesRead != -1) {
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print((char) buffer.get());
        }
        buffer.clear();
        bytesRead = channel.read(buffer);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Java NIO提供了更高效、更灵活的IO处理方式,适用于需要处理大量连接或需要高性能和低延迟的场景。相比于传统的Java IO,它可以更好地满足现代应用对IO操作的需求。但需要注意的是,Java NIO的API较为复杂,使用时需要仔细理解和学习。

windows 安装 ffmpeg

choco install ffmpeg
choco install ffmpeg-full

完整示例

package java_io_nio;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FileUtils {

    /**
     * 拷贝文件 FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream 应用
     * @param intputFilePath 输入文件
     * @param outputFilePath 输出文件
     */
    public static void copyFileByPath(String intputFilePath, String outputFilePath){
        try(FileInputStream fis = new FileInputStream(intputFilePath);
            BufferedInputStream bis = new BufferedInputStream(fis);
            FileOutputStream fos = new FileOutputStream(outputFilePath, false);
            BufferedOutputStream bos = new BufferedOutputStream(fos)){
          byte[] buffer = new byte[1024];
          int bytesRead;
          while ((bytesRead = bis.read(buffer)) != -1){
            bos.write(buffer, 0, bytesRead);
          }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 读取文件内容 BufferedReader 应用
     * @param filePath 文件路径
     * @return
     */
    public static String readFromFile(String filePath){
        StringBuffer result = new StringBuffer();
        try (FileInputStream fr = new FileInputStream(filePath);
            InputStreamReader isr = new InputStreamReader(fr, StandardCharsets.UTF_8);
            BufferedReader br = new BufferedReader(isr)) {
          String line;
          while((line = br.readLine()) != null){
            result.append(line);
          }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result.toString();
    }

    /**
     * 写入文件 BufferedWriter 应用
     * @param filePath 文件路径
     * @param content 文件内容
     */
    public static void writeToFile(String filePath, String content){
        try (FileOutputStream fos = new FileOutputStream(filePath);
            OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw)) {
          bw.write(content);
          bw.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件拷贝 NIO 应用
     * @param sourcePath 源文件
     * @param targetPath 目标文件
     */
    public static void transferFile(String sourcePath, String targetPath){
        Path sPath = Paths.get(sourcePath);
        Path tPath = Paths.get(targetPath);

        try {
            Files.copy(sPath, tPath, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 视频格式转换 NIO 应用
     * @param inputPath 源格式
     * @param outputPath 目标格式
     */
    public static void videoFormatConversion(String inputPath, String outputPath){
        try {
            // 输入视频文件路径
            Path iPath = Paths.get(inputPath);

            // 输出转换后的视频文件路径
            Path oPath = Paths.get(outputPath);

            // 构建 FFmpeg 命令
            String ffmpegCommand = "ffmpeg -i " + iPath.toString() + " -c:v copy -c:a copy " + oPath.toString();

            // 执行 FFmpeg 命令
            Process process = Runtime.getRuntime().exec(ffmpegCommand);
            process.waitFor();

            // 检查转换后的文件是否存在
            if (Files.exists(oPath)) {
                System.out.println("视频格式转换成功!");
            } else {
                System.out.println("视频格式转换失败!");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 读取数据 NIO 应用
     * @param socketChannel
     */
    private static void handleClientRequest(SocketChannel socketChannel) {
        try {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            int bytesRead = socketChannel.read(buffer);

            while (bytesRead != -1) {
                buffer.flip();

                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                buffer.clear();
                bytesRead = socketChannel.read(buffer);
            }

            socketChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        copyFileByPath("D:\\project\\uploadPath\\file_0.png", "D:\\project\\uploadPath\\file_1.png");

        String fileContent = readFromFile("D:\\project\\uploadPath\\test.txt");
        System.out.println("文件内容:" + fileContent);

        writeToFile("D:\\project\\uploadPath\\test.txt", "测试内容");

        transferFile("D:\\project\\uploadPath\\file_0.png", "D:\\project\\uploadPath\\file_2.png");

        videoFormatConversion("D:\\project\\uploadPath\\file_0.mp4", "D:\\project\\uploadPath\\file_0.mov");

        // NIO 网络编程
        try {
            // 创建 ServerSocketChannel
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.socket().bind(new InetSocketAddress(8080));
            serverSocketChannel.configureBlocking(false);

            System.out.println("服务器已启动,监听端口 8080...");

            // 创建线程池
            ExecutorService executorService = Executors.newFixedThreadPool(10);

            while (true) {
                // 监听客户端连接
                SocketChannel socketChannel = serverSocketChannel.accept();

                if (socketChannel != null) {
                    System.out.println("客户端连接成功!");

                    // 处理客户端请求的任务提交给线程池执行
                    executorService.submit(() -> handleClientRequest(socketChannel));
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考文献

ffmpeg 下载

华为校招&实习&留学生机试真题目录+算法分类+在线OJ+通过率+视频讲解 全网最新最全华为校招&实习&留学生机试真题题库 阅读详情

相关推荐

Ansys Zemax | 多模光纤耦合效率优化与IMAE操作数实战解析

本文详细解析了在Ansys Zemax(OpticStudio)中优化多模光纤耦合效率的实战流程。通过几何图像分析诊断初始效率,并重点介绍了如何利用IMAE操作数将分析工具转化为自动化优化引擎,实现从2%到54%的几何效率飞跃。文章还探讨了引入菲涅尔损耗与偏振计算以逼近真实效率,并分享了关键的避坑指南与高阶技巧。

xk7n92h3p5m的博客 747

java基础:IO、NIO

Java NIO、IO https://lrh1993.gitbooks.io/android_interview_guide/content/java/basis/java-nio.html 轻松理解java中的IO与NIO https://zhuanlan.zhihu.com/p/27204492 BIO,AIO,NIO理解: https://baijiahao.baidu.com/s?id=1666632547627347318&wfr=spider&for=pc..

王温暖的博客 1524

ChatGPT Windows桌面版:从安全下载到高效配置的全流程指南

WebView封装技术是将网页应用转化为独立桌面程序的核心方法,它通过嵌入浏览器内核实现跨平台功能复用。其原理在于利用Electron或Tauri等框架,将Web内容打包进原生应用外壳,同时注入系统级API调用能力。这项技术的工程价值在于显著提升了Web应用的系统集成度和用户体验,使其能够支持全局快捷键、独立进程和本地数据存储等原生特性。在AI助手深度集成工作流的应用场景中,这种封装模式解决了浏览器多标签页切换繁琐、会话管理不便等痛点。本文以ChatGPT桌面客户端为例,详细解析了基于开源项目的安全下载路径

weixin_30437847的博客 480

Java IO 与 NIO

Java IO 与 NIO。

专注分享编程开发与技术进阶干货! 1232

模型优化系列——模型剪枝/量化概述

模型优化目的:通过减少模型大小,提高推理速度等使模型成功部署在各个硬件中并实时有效运作。

qq_61210574的博客 1293

新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值

本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。

weixin_29231027的博客 571

Java中IO和NIO的区别

一、概念   NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。 二、NIO和IO的主要区别 下表总结了Java IO和NIO之间的主要区别: 1、面向流与面向缓冲    Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字

weixin_42100694的博客 7345

激光测距仪DIY指南:从元器件选型到精度优化(附避坑清单)

本文提供了一份详尽的激光测距仪DIY实战指南,涵盖从核心元器件选型到系统集成的全过程。重点解析了相位法测距原理,并分享了激光发射器与APD探测器选型、信号链路设计、低成本改造方案以及精度校准等关键环节的避坑经验,帮助电子爱好者与开发者深入理解并成功搭建高精度测距系统。

h6i7j8的博客 943

Java | IO 模式之 JavaNIO 应用

Java | IO 模式之 JavaNIO 应用

为了远大的理想,冲锋! 1624

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 离线蒸馏(附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv8的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了!欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 4318

本地搭建 GitLab 14.1.0版本CI/CD

GitLab 镜像版本 gitlab/gitlab-ce:14.1.0-ce.0 GitLab Runner 镜像版本 gitlab/gitlab-runner:v14.1.0 搭建此套环境是在一台32G的windows电脑上安装的。 使用dokcer安装。 此外还涉及的软件Docker Desktop,WSL 安装GitLab 首先启动 dockcer,打开WSL 打开后 首先定义GitLab的持久化目录 export GITLAB_HOME=/srv/gitlab 然后运行安装GitLab的命令

知无涯 4489

Java 中的IO/NIO详解

一:Java IO 模型 兄弟们,什么是Java的IO呢?首先我们看看这两个单词的全拼,不就是Input 和Output嘛?那么到底是什么的输入和输出呢?本质上在互联网的世界中,不就是数据的输入输出吗?而我们java 中对于数据的这个输入和输出都是基于线程来说的,那么线程在接收这个数据的输入和输出的时候线程的状态是怎么样的呢,在一直等待还是说先干自己的事,等数据来了再去接收这个数据呢?所以这个就涉及到了我们的这个IO模型了。它分为下面几种

weixin_41188932的博客 580

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2498

Java IO和NIO

转载请注明链接: Java提供了哪些IO方式? NIO如何实现多路复用? Java IO和NIO 版本号:2018/9/12-1(18:24) Java IO和NIO 基本概念 同步和异步 阻塞和非阻塞 IO/BIO NIO NIO2 问题汇总 参考资料 基本概念 1、Java IO方式有哪些? 传统java.io包:文件...

feather(猎羽) 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java IO 和 NIO的区别

主要区别 IO NIO 面向字节流 面向缓冲区 阻塞 基于Selector的非阻塞 Java IO 和 NIO的主要区别体现在以上两个方面,以下详细说明这些区别的具体含义。面向流和面向缓冲区这个概念和编程方法中的面向过程、面向对象类似。Java IO 是面向流的而Java NIO是面向缓冲区的。在Java IO中读取数据和写入数据是面向流(Stream)的,这表示当我们从流中读

riskLoveHe的博客 8763

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java中IO和NIO的本质和区别

终于要写到java中最最让人激动的部分了IO和NIO。IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。 IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢? 别急,看完这篇文章一切都有答案。

程序那些事 9543

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java传统的io和nio区别_Java中IO和NIO的本质和区别

简介终于要写到java中最最让人激动的部分了IO和NIO。IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢?别急,看完这篇文章一切都有答案。IO的本质IO的作用就是从...

weixin_34243541的博客 375

Java IO 和 NIO

在 Java 编程中,输入输出(IO)是不可或缺的部分,随着技术的发展,Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。

四楼没电梯的专栏 1284

Java 中 NIO 和IO 的区别

在Java 中,IO(input/output)和 NIO(new Input/output) 是两种不同的输入输出处理机制。它们各自有不同的设计理念和使用场景,理解这两者的区别对于优化性能、提高应用的响应速度非常重要。

weixin_44979389的博客 965

Java中的NIO和IO的对比分析

总的来说,java中的IO和NIO主要有三点区别: IO                  NIO 面向流     面向缓冲 阻塞IO                   非阻塞IO  无   选择器(Selectors) 1.面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,N

cruise技术博客 1158

JAVA中的IO和NIO以及Netty

一、基础知识 (一)IO和NIO的概念 IO Java IO 也称为IO流,IO = 流,它的核心就是对文件的操作,对于字节、字符类型的输入和输出流。IO是指对数据流的输入和输出,也称为IO流,IO流主要分为两大类,字节流和字符流。字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据。IO流的本质是数据传输,并且流是单向的。 NIO JAVA NIO有两种解释:一种叫非阻塞IO(Non-blocking I/O),另一种也叫新的IO(New I/O),其实是同一个...

dedsec0x的博客 716

java nio和io区别_Java NIO和IO的区别

IO NIO面向流 面向缓冲阻塞IO 非阻塞IO无 选择器面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需...

weixin_33905037的博客 241

Java IO模型之BIO和NIO分析

根据不同情况选择合适的IO模型

771

java io和nio_Java中的NIO和IO的对比分析

总的来说,java中的IO和NIO主要有三点区别:IONIO面向流面向缓冲阻塞IO非阻塞IO无选择器(Selectors)1.面向流与面向缓冲JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将...

weixin_29227425的博客 115

Java NIO和传统的IO的区别

Java NIO和IO的区别。

终生学习践行者 1138

java io 与nio_Java中IO和NIO的本质和区别

简介终于要写到java中最最让人激动的部分了IO和NIO。IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢?别急,看完这篇文章一切都有答案。IO的本质IO的作用就是从...

weixin_39819327的博客 121
上一篇: JDK 8 新特性总结
下一篇: Spring Security OAuth2.0 实现分布式系统的认证和授权
高建伟-joe
博客等级 码龄6年 155粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高建伟-joe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值