当前位置: 首页 > news >正文

Java文件操作详解

CONTENTS

  • 1. 文件和目录路径
    • 1.1 获取Path的片段
    • 1.2 获取Path信息
    • 1.3 添加或删除路径片段
  • 2. 文件系统
  • 3. 查找文件
  • 4. 读写文件

1. 文件和目录路径

Path 对象代表的是一个文件或目录的路径,它是在不同的操作系统和文件系统之上的抽象。它的目的是,在构建路径时,我们不必注意底层的操作系统,我们的代码不需要重写就能在不同的操作系统上工作。

java.nio.file.Paths 类包含了重载的 static get() 方法,可以接受一个 String 序列,或一个统一资源标识符(Uniform Resource Identifier,URI),然后将其转化为一个 Path 对象:

package file;import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;public class PathInfo {static void showInfo(Path p) {System.out.println("--------------------");System.out.println("toString(): " + p);System.out.println("exists(): " + Files.exists(p));System.out.println("isRegularFile(): " + Files.isRegularFile(p));System.out.println("isDirectory(): " + Files.isDirectory(p));System.out.println("isAbsolute(): " + p.isAbsolute());System.out.println("getFileName(): " + p.getFileName());System.out.println("getParent(): " + p.getParent());System.out.println("getRoot(): " + p.getRoot());}public static void main(String[] args) {System.out.println(System.getProperty("os.name"));Path filePath = Paths.get("src/file/test.txt");showInfo(filePath);showInfo(filePath.toAbsolutePath());Path dirPath = Paths.get("src", "file");showInfo(dirPath);Path invalidPath = Paths.get("src", "file", "invalid.txt");showInfo(invalidPath);System.out.println("--------------------");URI fileURI = filePath.toUri();System.out.println("URI: " + fileURI);Path fileFromURI = Paths.get(fileURI);System.out.println("Files.exists(fileFromURI): " + Files.exists(fileFromURI));/** Windows 11* --------------------* toString(): src\file\test.txt* exists(): true* isRegularFile(): true* isDirectory(): false* isAbsolute(): false* getFileName(): test.txt* getParent(): src\file* getRoot(): null* --------------------* toString(): D:\IDEA Project\JavaStudy\src\file\test.txt* exists(): true* isRegularFile(): true* isDirectory(): false* isAbsolute(): true* getFileName(): test.txt* getParent(): D:\IDEA Project\JavaStudy\src\file* getRoot(): D:\* --------------------* toString(): src\file* exists(): true* isRegularFile(): false* isDirectory(): true* isAbsolute(): false* getFileName(): file* getParent(): src* getRoot(): null* --------------------* toString(): src\file\invalid.txt* exists(): false* isRegularFile(): false* isDirectory(): false* isAbsolute(): false* getFileName(): invalid.txt* getParent(): src\file* getRoot(): null* --------------------* URI: file:///D:/IDEA%20Project/JavaStudy/src/file/test.txt* Files.exists(fileFromURI): true*/}
}

虽然 toString() 生成的是路径的完整表示,但是可以看到 getFileName() 总是会生成文件的名字。使用 Files 工具类(后面会看到更多),我们可以测试文件是否存在,是否为“普通”文件,是否为目录等等。

在这里,我们看到了文件的 URI 是什么样子的,但 URI 可以用来描述大多数事物,不仅限于文件,然后我们成功地将 URI 转回到了一个 Path 之中。

1.1 获取Path的片段

package file;import java.nio.file.Path;
import java.nio.file.Paths;public class PartsOfPaths {public static void main(String[] args) {Path p = Paths.get("src/file/test.txt").toAbsolutePath();System.out.println("Path: " + p);System.out.println("endsWith(.txt): " + p.endsWith(".txt"));for (int i = 0; i < p.getNameCount(); i++)System.out.print(p.getName(i) + (i == p.getNameCount() - 1 ? "" : "/"));System.out.println();for (Path pName: p) {System.out.println("p.startsWith(" + pName + "): " + p.startsWith(pName));System.out.println("p.endsWith(" + pName + "): " + p.endsWith(pName));}System.out.println("p.startsWith(" + p.getRoot() + "): " + p.startsWith(p.getRoot()));/** Path: D:\IDEA Project\JavaStudy\src\file\test.txt* endsWith(.txt): false* IDEA Project/JavaStudy/src/file/test.txt* p.startsWith(IDEA Project): false* p.endsWith(IDEA Project): false* p.startsWith(JavaStudy): false* p.endsWith(JavaStudy): false* p.startsWith(src): false* p.endsWith(src): false* p.startsWith(file): false* p.endsWith(file): false* p.startsWith(test.txt): false* p.endsWith(test.txt): true* p.startsWith(D:\): true*/}
}

getNameCount() 界定的上限之内,我们可以结合索引使用 getName(),得到一个 Path 的各个部分。Path 也可以生成 Iterator,所以我们也可以使用 for-in 来遍历。

注意,尽管这里的路径确实是以 .txt 结尾的,但 endsWith() 的结果是 false。这是因为该方法比较的是整个路径组件(即用 / 分开的每个整体部分,如 test.txt),而不是名字中的一个字串。

还可以看到我们在对 Path 进行遍历时,并没有包含根目录,只有当我们用根目录来检查 startsWith() 时才会得到 true

1.2 获取Path信息

Files 工具类中包含了一整套用于检查 Path 的各种信息的方法:

package file;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;public class PathAnalysis {public static void main(String[] args) throws IOException {Path p = Paths.get("src/file/test.txt").toAbsolutePath();System.out.println("exists(): " + Files.exists(p));System.out.println("isDirectory(): " + Files.isDirectory(p));System.out.println("isExecutable(): " + Files.isExecutable(p));System.out.println("isReadable(): " + Files.isReadable(p));System.out.println("isRegularFile(): " + Files.isRegularFile(p));System.out.println("isWritable(): " + Files.isWritable(p));System.out.println("notExists(): " + Files.notExists(p));// 以下方法会抛出IOExceptionSystem.out.println("isHidden(): " + Files.isHidden(p));System.out.println("size(): " + Files.size(p));System.out.println("getFileStore(): " + Files.getFileStore(p));System.out.println("getLastModifiedTime(): " + Files.getLastModifiedTime(p));System.out.println("getOwner(): " + Files.getOwner(p));System.out.println("probeContentType(): " + Files.probeContentType(p));/** exists(): true* isDirectory(): false* isExecutable(): true* isReadable(): true* isRegularFile(): true* isWritable(): true* notExists(): false* isHidden(): false* size(): 30* getFileStore(): Asano (D:)* getLastModifiedTime(): 2023-10-20T02:58:25.335851Z* getOwner(): LAPTOP-23NEHV3U\AsanoSaki (User)* probeContentType(): text/plain*/}
}

1.3 添加或删除路径片段

我们必须能够通过对自己的 Path 对象添加和删除某些路径片段来构建 Path 对象。若想去掉某个基准路径可以使用 relativize(),想在一个 Path 对象的后面添加路径片段可以使用 resolve()

package file;import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;public class AddAndSubPaths {public static void main(String[] args) throws IOException {Path base = Paths.get("src").toAbsolutePath();System.out.println("base: " + base);Path filePath = Paths.get("src/file/test.txt").toAbsolutePath();System.out.println("filePath: " + filePath);Path filePathWithoutBase = base.relativize(filePath);System.out.println("filePathWithoutBase: " + filePathWithoutBase);Path filePathWithBase = base.resolve("file/test.txt");System.out.println("filePathWithBase: " + filePathWithBase);Path workspacePath = Paths.get("");System.out.println("workspacePath: " + workspacePath);System.out.println("workspacePath.toRealPath(): " + workspacePath.toRealPath());/** base: D:\IDEA Project\JavaStudy\src* filePath: D:\IDEA Project\JavaStudy\src\file\test.txt* filePathWithoutBase: file\test.txt* filePathWithBase: D:\IDEA Project\JavaStudy\src\file\test.txt* workspacePath:* workspacePath.toRealPath(): D:\IDEA Project\JavaStudy*/}
}

只有 Path 为绝对路径时,才能将其用作 relativize() 方法的参数。此外还增加了对 toRealPath() 的进一步测试,除了路径不存在的情况下会抛出 IOException 异常,它总是会对 Path 进行扩展和规范化。

2. 文件系统

为了完整起见,我们需要一种方式来找出文件系统的其他信息。在这里,我们可以使用静态的 FileSystems 工具来获得默认的文件系统,也可以在一个 Path 对象上调用 getFileSystem() 来获得创建这个路径对象的文件系统。我们可以通过给定的 URI 获得一个文件系统,也可以构建一个新的文件系统(如果操作系统支持的话)。

package file;import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;public class FileSystemDemo {public static void main(String[] args) {FileSystem fs = FileSystems.getDefault();for (FileStore s: fs.getFileStores())System.out.println("File Store: " + s);for (Path p: fs.getRootDirectories())System.out.println("Root Directory: " + p);System.out.println("Separator: " + fs.getSeparator());System.out.println("isOpen: " + fs.isOpen());System.out.println("isReadOnly: " + fs.isReadOnly());System.out.println("File Attribute Views: " + fs.supportedFileAttributeViews());/** File Store: OS (C:)* File Store: Asano (D:)* File Store: Saki (E:)* Root Directory: C:\* Root Directory: D:\* Root Directory: E:\* Separator: \* isOpen: true* isReadOnly: false* File Attribute Views: [owner, dos, acl, basic, user]*/}
}

3. 查找文件

java.nio.file 中有一个用于查找文件的类 PathMatcher,可以通过在 FileSystem 对象上调用 getPathMatcher() 来获得一个 PathMatcher 对象,并传入我们感兴趣的查找模式。模式有两个选项:globregexglob 更简单,但实际上非常强大,可以解决很多问题,如果问题更为复杂,可以使用 regex

package file;import java.io.IOException;
import java.nio.file.*;public class FindFiles {public static void main(String[] args) throws IOException {Path filePath = Paths.get("src/file");PathMatcher matcher1 = FileSystems.getDefault().getPathMatcher("glob:**/*.{txt,tmp}");Files.walk(filePath)  // 会抛出IOException.filter(matcher1::matches).forEach(System.out::println);System.out.println("--------------------");PathMatcher matcher2 = FileSystems.getDefault().getPathMatcher("glob:*.txt");Files.walk(filePath).map(Path::getFileName)  // 不加这行代码将不会产生任何输出.filter(matcher2::matches).forEach(System.out::println);/** src\file\FileToWordsBuilder.txt* src\file\test.txt* --------------------* FileToWordsBuilder.txt* test.txt*/}
}

matcher1 中,glob 表达式开头的 **/ 表示所有子目录,如果你想匹配的不仅仅是以基准目录为结尾的 Path,那么它是必不可少的,因为它匹配的是完整路径,直到找到想要的结果。单个的 * 表示任何东西,后面的花括号表示的是一系列的可能性,即查找任何以 .txt.tmp 结尾的东西。

注意在 matcher2 中我们只匹配 *.txt,而我们的 filePath 并不在基准目录下,因此需要先用 map() 将文件的完整路径改为只剩最后一段 Path 片段,即 xxx.txt 这种形式,这样才能匹配上。

4. 读写文件

目前为止,我们可以做的只是对路径和目录的操作,现在来看看如何操作文件本身的内容。

java.nio.file.Files 类包含了方便读写文本文件和二进制文件的工具函数。Files.readAllLines() 可以一次性读入整个文件,生成一个 List<String>

package file;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;public class ReadAllLines {public static void main(String[] args) throws IOException {Path p = Paths.get("src/file/test.txt");List<String> lines = Files.readAllLines(p);  // 会抛出IOExceptionfor (String line: lines)System.out.println(line);System.out.println("--------------------");Files.readAllLines(p).stream().map(line -> line.substring(0, line.length() / 2)).forEach(System.out::println);/** Hello world* Java is a nice language* --------------------* Hello* Java is a n*/}
}

Files.write() 也被重载了,可以将 byte 数组或任何实现了 Iterable 接口的类的对象写入文件:

package file;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;public class FilesWrite {static Random rand = new Random(47);public static void main(String[] args) throws IOException {byte[] bytes = new byte[10];rand.nextBytes(bytes);Path bytesPath = Paths.get("src/file/bytes.txt");Files.write(bytesPath, bytes);  // 会抛出IOExceptionfor (byte b: Files.readAllBytes(bytesPath))System.out.print(b + " ");System.out.println();System.out.println("The size of bytes.txt: " + Files.size(bytesPath));List<String> contents = new ArrayList<>(Arrays.asList("Hello world", "Hello java", "Hello AsanoSaki"));Path filePath = Paths.get("src/file/contents.txt");Files.write(filePath, contents);Files.readAllLines(filePath).stream().forEach(System.out::println);System.out.println("The size of contents.txt: " + Files.size(filePath));/** -107 66 36 -70 22 5 91 102 -85 10* The size of bytes.txt: 10* Hello world* Hello java* Hello AsanoSaki* The size of contents.txt: 42*/}
}

现在我们读取文件时都是将文件全部一次性读入,这可能会有以下的问题:

  • 这个文件非常大,如果一次性读取整个文件,可能会耗尽内存。
  • 我们只需要文件的一部分就能得到想要的结果,所以读取整个文件是在浪费时间。

Files.lines() 可以很方便地将一个文件变为一个由行组成的 Stream

package file;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;public class ReadLineStream {public static void main(String[] args) throws IOException {Files.lines(Paths.get("src/file/contents.txt"))  // 会抛出IOException.skip(1).map(String::toUpperCase).forEach(System.out::println);/** HELLO JAVA* HELLO ASANOSAKI*/}
}

如果把文件当作一个由行组成的输入流来处理,那么 Files.lines() 非常有用,但是如果我们想在一个流中完成读取、处理和写入,那该怎么办呢?

package file;import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;public class StreamInAndOut {public static void main(String[] args) {try (Stream<String> in = Files.lines(Paths.get("src/file/contents.txt"));PrintWriter out = new PrintWriter("src/file/uppercaseContents.txt")) {in.map(String::toUpperCase).forEachOrdered(out::println);} catch (IOException e) {System.out.println("Caught IOException");}}
}

因为我们是在同一个块中执行的所有操作,所以两个文件可以在相同的 try-with-resources 块中打开。PrintWriter 是一个旧式的 java.io 类,允许我们“打印”到—个文件,所以它是这个应用的理想选择。

相关文章:

Java文件操作详解

CONTENTS 1. 文件和目录路径1.1 获取Path的片段1.2 获取Path信息1.3 添加或删除路径片段 2. 文件系统3. 查找文件4. 读写文件 1. 文件和目录路径 Path 对象代表的是一个文件或目录的路径&#xff0c;它是在不同的操作系统和文件系统之上的抽象。它的目的是&#xff0c;在构建路…...

二叉树系列主题Code

Python实现二叉树遍历 # 定义二叉树节点类 class TreeNode: def __init__(self, val0, leftNone, rightNone): self.val val self.left left self.right right # 前序遍历&#xff08;非递归&#xff09; def preorderTraversal(root): if not root: return [] …...

Leetcode 673. 最长递增子序列的个数 C++

673最长递增子序列的个数 给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: …...

html用css grid实现自适应四宫格放视频

想同时播放四个本地视频&#xff1a; 四宫格&#xff1b;自式应&#xff0c;即放缩浏览器时&#xff0c;四宫格也跟着放缩&#xff1b;尽量填满页面&#xff08;F11 浏览器全屏时可以填满整个屏幕&#xff09;。 在 html 中放视频用 video 标签&#xff0c;参考 [1]&#xff1…...

【机器学习可解释性】5.SHAP值的高级使用

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始&#xff0c;以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…...

CentOS开机自动运行jar程序实现

前面已经有一篇文章介绍jar包如何在CentOS上运行&#xff0c;《在linux上运行jar程序操作记录》 后来发现系统重启后不能自动运行&#xff0c;导致每次都要手动打开&#xff0c;这篇介绍如何自动开机启动运行jar程序。 一、找到JDK程序执行位置 [rootlocalhost /]# which jav…...

matlab双目标定中基线物理长度获取

在MATLAB进行双目摄像机标定时,通常会获得相机的内参,其中包括像素单位的焦距(focal length)以及物理单位的基线长度(baseline)。对于应用中的深度估计和测量,基线长度的物理单位非常重要,因为它直接影响到深度信息的准确性。有时候,您可能只能获取像素单位的焦距和棋…...

自己动手实现一个深度学习算法——二、神经网络的实现

文章目录 1. 神经网络概述1&#xff09;表示2&#xff09;激活函数3&#xff09;sigmoid函数4&#xff09;阶跃函数的实现5&#xff09;sigmoid函数的实现6)sigmoid函数和阶跃函数的比较7&#xff09;非线性函数8&#xff09;ReLU函数 2.三层神经网络的实现1&#xff09;结构2&…...

gRPC源码剖析-Builder模式

一、Builder模式 1、定义 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的的表示。 2、适用场景 当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 说人话&#xff1a…...

ARM传输数据以及移位操作

3.2.2 数据传送指令 LDR/STR指令用来在寄存器和内存之间输送数据。如果我们想要在寄存器之间传送数据&#xff0c;则可以使用MOV指令。MOV指令的格式如下。 MOV {cond} {s}Rd, oprand2 MOV {cond} {s}Rd, oprand2 其中&#xff0c;{cond}为条件指令可选项&#xff0c;{s}用来表…...

06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)

1、数据情况&#xff1a; 其一、从后端拿到的数据为&#xff1a; let arr [1,3,6,10,11,23,24] 其二、目标数据为&#xff1a; [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…...

ngx_http_request_s

/* 罗剑锋老师的注释参考&#xff1a; https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/http/ngx_http_request.h */struct ngx_http_request_s {uint32_t signature; /* "HTTP" */ngx_connection_t …...

Docker 学习路线 2:底层技术

了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理&#xff0c;并有助于您更有效地使用该平台。 Linux容器&#xff08;LXC&#xff09; Linux容器&#xff08;LXC&#xff09;是Docker的基础。 LXC是一种轻量级的虚拟化解决方案&#xff0c;允许多个隔离的Linux系…...

UEFI实战——显示图片

一、准备工作 1.1 BMP格式图片 参考:BMP格式详解获取“BMP格式详解”文档里的图片,命名为Logo.bmp将Logo.bmp图片放到U盘里,U盘格式FAT32二、实例代码 2.1 代码结构 TextPkg/ ├── Display.c ├── GetFile.c ├── Test.c ├── Test.dsc ├── Test.h └── Tes…...

Ansible中的playbook

目录 一、playbook简介 二、playbook的语法 三、playbook的核心组件 四、playbook的执行命令 五、vim 设定技巧 六、基本示例 一、playbook简介 1、playbook与ad-hoc相比&#xff0c;是一种完全不同的运用。 2、playbook是一种简单的配置管理系统与多机器部署系统的基础…...

怎样去除视频中的杂音,保留人声部分?

怎样去除视频中的杂音&#xff0c;保留人声部分&#xff1f;这个简单嘛&#xff01;两种办法可以搞定&#xff1a;一是进行音频降噪&#xff0c;把无用的杂音消除掉&#xff1b;二是提取人声&#xff0c;将要保留的人声片段提取出来。 这就将两种实用的办公都分享出来&#xf…...

基于Qt QTreeView|QTreeWidget控件使用简单版

头文件解析: 这是一个C++代码文件,定义了一个名为MainWindow的类。以下是对每一句的详细解释: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H ``` 这是一个条件编译指令,用于避免头文件的重复包含。`MAINWINDOW_H`是一个宏定义,用于唯一标识这个头文件。 ```cpp #…...

edge浏览器的隐藏功能

1. edge://version 查看版本信息 2. edge://flags 特性界面 具体到某一特性&#xff1a;edge://flags/#overlay-scrollbars 3. edge://settings设置界面 详情可参考chrome: 4. edge://extensions 扩展程序页面 5. edge://net-internals 网络事件信息 6. edge://component…...

安卓抓包之小黄鸟

下载安装 下载地址: https://download.csdn.net/download/yijianxiangde100/88496463 安装apk 即可。 证书配置:...

Django中的FBV和CBV

一、两者的区别 1、在我们日常学习Django中&#xff0c;都是用的FBV&#xff08;function base views&#xff09;方式&#xff0c;就是在视图中用函数处理各种请求。而CBV&#xff08;class base view&#xff09;则是通过类来处理请求。 2、Python是一个面向对象的编程语言…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...