当前位置: 首页 > 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是一个面向对象的编程语言…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...