(每日持续更新)jdk api之FileDescriptor基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.18 FileDescriptor

FileDescriptor 类是一个抽象类,代表了与平台无关的文件描述符。它主要用于在Java程序中表示底层文件或其他I/O资源的句柄。以下是关于 FileDescriptor 类的主要信息:

FileDescriptor 类介绍:
  • 包路径: java.io

FileDescriptor 类所有字段:

FileDescriptor 类没有公共字段。

FileDescriptor 类构造方法:
  • FileDescriptor()

    • 无参构造方法,用于创建一个新的 FileDescriptor 实例。

FileDescriptor 类方法摘要:

以下是 FileDescriptor 类中一些主要的方法:

  1. 获取标准文件描述符:

    • static FileDescriptor in 标准输入流的文件描述符。

    • static FileDescriptor out 标准输出流的文件描述符。

    • static FileDescriptor err 标准错误流的文件描述符。

  2. 文件描述符的有效性检查:

    • boolean valid() 检查文件描述符是否有效。

    • void sync() 将文件描述符的数据同步到存储设备中。

  3. 文件描述符的创建:

    • static FileDescriptor from(int fd) 根据给定的整数文件描述符创建一个新的 FileDescriptor 实例。

简单使用例子:

以下是一个简单的例子,演示了如何使用 FileDescriptor 打开和关闭系统的标准输出流:

javaCopy code
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
​
public class FileDescriptorExample {
​
    public static void main(String[] args) {
        try {
            // 使用 FileDescriptor 获取标准输出流的文件描述符
            FileDescriptor outDescriptor = FileDescriptor.out;
​
            // 使用文件描述符创建文件输出流
            FileOutputStream fileOutputStream = new FileOutputStream(outDescriptor);
​
            // 写入数据到标准输出流
            fileOutputStream.write("Hello, FileDescriptor!".getBytes());
​
            // 刷新并关闭输出流
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们使用 FileDescriptor.out 获取标准输出流的文件描述符,然后使用这个文件描述符创建了一个 FileOutputStream 对象。接着,我们向输出流写入数据,并最后刷新和关闭输出流。请注意,这个例子主要是为了演示 FileDescriptor 的使用,并不是一种通常的文件操作方式,因为通常我们直接使用高级的I/O类,而不直接使用文件描述符。

应用场景

FileDescriptor 类主要用于底层 I/O 操作,而且在通常情况下,直接使用高级的 I/O 类(如 FileInputStreamFileOutputStream)更为常见。然而,有一些场景下可能会用到 FileDescriptor,主要涉及以下几个方面的应用场景:

  1. 底层文件描述符操作:

    • 当需要进行底层文件描述符的操作时,可以使用 FileDescriptor。例如,通过 FileDescriptor 对象可以获取标准输入、标准输出、标准错误流的文件描述符,以及创建一个具有指定文件描述符的 FileInputStreamFileOutputStream

  2. 文件描述符的传递:

    • 在一些特殊的场景下,可能需要在不同的进程之间传递文件描述符。这在涉及到进程间通信的情况下可能会用到,例如在 UNIX 系统中的进程间通信机制。

  3. 文件描述符的同步:

    • 使用 sync() 方法可以将文件描述符的数据同步到存储设备中。这在确保数据写入磁盘的场景下可能会用到,虽然在一般情况下,应用程序不需要显式调用 sync(),因为高级的 I/O 操作通常会自动处理同步。

  4. 底层文件系统操作:

    • 一些底层的文件系统操作,特别是在需要直接控制文件描述符的情况下,可能会用到 FileDescriptor。例如,可以使用 FileDescriptor 打开、关闭、操作文件。

  5. JNI(Java Native Interface)调用:

    • 在使用 JNI 调用本地方法的情况下,可能需要将文件描述符传递给本地方法。FileDescriptor 类可以用于在 Java 代码和本地代码之间传递文件描述符。

虽然 FileDescriptor 可以在一些底层的场景中使用,但在一般的应用程序中,通常不需要直接使用它,而是使用更高级的 I/O 类。直接使用高级的 I/O 类会更简便、安全,并且更符合 Java 编程的最佳实践。

实战例子

实战例子中,我们将使用 FileDescriptor 打开一个文件,然后使用底层文件描述符进行读写操作。请注意,这是一个较为底层的操作,一般情况下更推荐使用高级的 I/O 类。

javaCopy code
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
​
public class FileDescriptorExample {
​
    public static void main(String[] args) {
        // 指定文件路径
        String filePath = "example.txt";
​
        // 写入数据到文件
        writeFile(filePath, "Hello, FileDescriptor!");
​
        // 读取文件内容
        String content = readFile(filePath);
        System.out.println("File content: " + content);
    }
​
    private static void writeFile(String filePath, String data) {
        try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {
            // 获取文件描述符
            FileDescriptor fileDescriptor = fileOutputStream.getFD();
​
            // 写入数据到文件
            fileOutputStream.write(data.getBytes());
​
            // 刷新并关闭输出流
            fileOutputStream.flush();
            fileOutputStream.close();
​
            // 同步文件描述符到磁盘
            fileDescriptor.sync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static String readFile(String filePath) {
        StringBuilder content = new StringBuilder();
​
        try (FileInputStream fileInputStream = new FileInputStream(filePath)) {
            // 获取文件描述符
            FileDescriptor fileDescriptor = fileInputStream.getFD();
​
            // 读取文件内容
            int byteData;
            while ((byteData = fileInputStream.read()) != -1) {
                content.append((char) byteData);
            }
​
            // 同步文件描述符到磁盘
            fileDescriptor.sync();
        } catch (IOException e) {
            e.printStackTrace();
        }
​
        return content.toString();
    }
}

在这个例子中,我们通过 FileOutputStreamFileInputStream 获取文件描述符,然后分别使用文件描述符进行写和读操作。在写操作中,我们在写入数据后调用 sync() 方法将数据同步到磁盘。在读操作中,同样在读取数据后调用 sync() 方法将数据同步到磁盘。这是一个演示 FileDescriptor 使用的简单例子,但在实际开发中,我们更倾向于使用高级的 I/O 类,以及 try-with-resources 语句来自动关闭资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/317313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring-boot集成mybait-plus+shareding实现分表分库,dynamic动态数据多数据源

spring-boot集成mybait-plusshareding实现分表分库,多数据源 1. Spring-boot集成shareding Mybatis-plus依赖引用yaml 配置示例 2. 引用 dynamic实现分表动态数据源依赖引用yaml配置数据源注入配置示例 说明: 以下内容为两部分: …

WebDav协议相关软件@简单配置局域网内的http和WebDav服务器和传输系统

文章目录 相关软件windows自带第三方软件 chfs(CuteHttpFileServer)下载软件GUI方案 补充命令行方案命令行程序定位简单创建服务站点使用配置文件配置细节 使用软连接或符号链接等手段将向共享站点的根目录添加文件开机自启服务包装nssm包装使用powershell包装 服务启动chfs服务…

安装nvidia driver出现 the cc vision check falied

这里提示说的需要gcc12,但是我只有gcc11,所以就报错了,说一说我自己的解决方法: 安装gcc12和g12,再切换版本为gcc12 安装gcc12: sudo apt install gcc-12安装g12: sudo apt -y install g-12切换版本:参考博客

MSF流量加密

1、背景介绍 在MSF中生成shell,并上线运行时。都是通过http https tcp等协议传输。虽然MSF本身会对流量进行加密,但MSF太出名以致于其加密特征容易被IPS,WAF等可以检测带有攻击的特征的设备拦截或记录。 2、生成 SSL 证书 openssl req -x50…

《ORANGE’S:一个操作系统的实现》读书笔记(二十九)文件系统(四)

上一篇文章完善了硬盘驱动程序,并且完成了一个文件系统。这篇文章开始记录对文件的操作,首先记录如何创建一个文件。 目录 创建文件 Linux 下的文件操作 文件描述符(file descriptor) open() 创建文件所涉及的其它函数 str…

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战14(BitMap实现用户签到功能) 📚订阅专栏&am…

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容: {"tags": {"allowUnknownTags": true,// 指定所用词…

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境: centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…

阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)

1. 免费白嫖一个阿里服务器 进入网址:服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 2. 远程连接到服务器 2.1. 使用Workbench连接 输入用户名和密码连接成功页面如下: 2.2. 使…

redis高级篇之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程? 3、主线程和Io线程是怎么协作完成请求处理的? 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程,4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

高级分布式系统-第6讲 分布式系统的容错性--可靠的组通信

可靠的组通信 组内通信最好是每个进程之间都建立点到点的通信, 但实际中这样的组织结构不是有效的, 因为会浪费很大的通信带宽。 在平等组中, 多播是主要的组织结构。 但多播是具有同步性质的容错结构, 并不适用拜占庭模型。 多…

Redis命令 - Strings命令组常用命令

1、Set命令 SET key value [EX seconds] [PX milliseconds] [NX|XX]1.1 参数说明: EX seconds: 设置key的过期时间,单位时秒PX milliseconds: 设置key的过期时间,单位时毫秒NX: 只有key不存在的时候,才会设置key的值XX: 只有key…

GitHub注册新账号的操作流程(详细)

目录 第一步 进入官网,点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…

Web前端 ---- 【Vue3】ref和reactive实现响应式的区别和联系

目录 前言 setup ref 基本数据类型 对象形式 reactive ref和reactive的区别与联系 前言 本文介绍函数ref和函数reactive实现响应式 setup 在介绍ref和reactive之前,先介绍setup,vue3新引入的配置项。在该配置项中,在vue2中的data、methods、comput…

VS游戏打包教程

我用得天天酷跑小游戏做的例子 1:安装打包插件 2:在解决方案里新建一个项目 3:新建一个setup项目 4:界面如下(通过右键folder,可以创建folder目录和输出) 5:素材文件 6:素材放完了就项目输出 7:创建快捷方式 右键这个主输出选择第一个create shortcut 8:将这个快捷方式,拖到,…

MAVROS与机载电脑Jetson nano通信

简介:MAVROS和Jetson nano通信,设置飞控参数和MAVROS文件,实现飞控和机载电脑的通信。MAVROS相当于PX4飞控中的MAVLINK模块。MAVROS将话题转为MAVLINK格式消息发送给飞控,飞控中的MAVLINK模块将MAVLINK格式消息转化为uORB消息给PX…

MYSQL分表分库 详解

目录 一、垂直拆分于水平拆分的区别? 垂直拆分 水平拆分 二、分表分库有哪些策略? Hash分片策略 枚举分片策略 日期分片策略 范围分片策略(用的较多) 三、分表分库之后,如何查询的呢? 四、分表分…

009集:open( )、write( )、close( )函数读写文件实例—python基础入门实例

一般来说,计算机文件可以分为两类:文本文件和二进制文件。大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常见的文本文件有:大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常用的文本文件格式有ASCII、MIME、*.txt等&#xff0…

【Linux 内核源码分析】进程调度 -CFS 调度器

Linux调度器 Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度,以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种,包括经典的O(1)调度器、CFS(Completely Fair Scheduler&a…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注: 笔记内容均为截图 课程视频地址:https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…
最新文章