文件操作和IO
目录
一. 文件预备知识
1. 硬盘
2. 文件
(1) 概念
(2) 文件路径
(3) 文件类型
二. 文件操作
1. 文件系统操作
[1] File常见的构造方法
[2] File的常用方法
[3] 查看某目录下所有的目录和文件
2. 文件内容操作
(1) 打开文件
(2) 关闭文件
(3) 读文件
(4) 写文件
一. 文件预备知识
1. 硬盘
上一个要点中提到, 文件指的是计算机硬盘中存储的文件及目录. 那么硬盘是什么呢? 它有什么特点?
(1) 概念: 硬盘是计算机中用来存储数据的设备. 硬盘包括机械硬盘和固态硬盘. 机械硬盘读写速度较慢, 在特定场景下读写速度较快(顺序读写), 成本相对较低; 固态硬盘读写速度快(尤其是随机读写), 成本相对较高.
(2) 硬盘和内存的区别: 硬盘存储空间大, 内存存储空间小; 硬盘读写速度快, 内存读写速度慢; 硬盘能持久存储数据, 内存在断电后数据丢失; 硬盘成本较低, 内存成本较高.
2. 文件
(1) 概念
狭义上的文件: 指的是计算机硬盘上存储的文件及保存文件的目录.
广义上的文件: 计算机中的很多硬件设备, 软件资源, 在操作系统中, 都会被统称为"文件". (比如输入用的键盘, 输出用的控制台, 还有打印机, 网卡等 这些软硬件资源都属于"文件").
[注]: 我们在文件操作中讨论的是 "狭义上的文件".
(2) 文件路径
- 绝对路径: 从盘符(或根目录)开始, 一直到文件名结束, 表示某个文件完整的存储路径.
eg: 
D:\Java_Wang\proj_BInaryTree\src 这个路径就表示文件src在计算机中的完整存储路径.
- 相对路径: 从当前目录开始, 去表示某一文件的存储路径. ( "." 表示当前目录, ".." 表示上一级目录)
eg: 我们以D:\Java_Wang\proj_BInaryTree这个路径为当前目录, 那么src文件的相对路径就是: .\src
如果以D:\Java_Wang\proj_BInaryTree\src 为当前目录去表示out文件的相对路径, 那就应该表示为: ..\out (因为src的上一级目录是proj_BinaryTree)
[注]: 一般Windows系统中的文件分隔符是" \ "(反斜杠) , Linux系统的文件分隔符是" / "(斜杠). 但是Windows为了兼容Linux的用户, 同时支持" \ "和" / " , 但是, 需要注意的是, 写反斜杠的时候, 只写一个反斜杠" \ ", 表示转义字符; 写两个反斜杠" \\ "才表示反斜杠.
(3) 文件类型
- 文本文件: 文本文件以字符的形式存储数据, 文件中存放的所有的二进制数据都能通过码表对应到正确的字符. (一般可以用文本编辑器打开查看)
- 二进制文件: 二进制文件以二进制的形式存储数据, 文件中存放的二进制数据并非所有都能通过码表对应到字符. (一般用文本编辑器打开是乱码)
[注]: 文本文件和二进制文件在内存中都是以二进制 (0/1) 的形式存储的. 区别主要在于文本文件所有数据都能通过码表对应正确的字符, 对人类可读. 而二进制文件通过码表对应出来的字符是不可读的(乱码).
我们可以举个例子看看:
通过文本编辑器打开文本文件:

文本文件打开之后是正常的, 可读的文字.
通过文本编辑器打开二进制文件:

二进制文件打开之后是一大堆不可读的乱码.
二. 文件操作
1. 文件系统操作
文件系统操作主要包括: 创建文件, 删除文件, 创建目录, 删除目录, 重命名文件, 判定文件是否存在 等.
java中, 提供了File类 (这个类封装了系统对于文件操作的API), 来帮助我们完成文件系统操作. File这个类会将某个路径包装成一个对象, 后续对这个路径的操作全是基于这个对象进行的. ([注]: 这个路径可以存, 在也可以不存在).
[1] File的构造方法

[1] File常见的构造方法
(1) File(File parent, String child) --> 两个参数, 根据父目录对象和孩子文件的路路径创建一个File对象.
(2) File(String pathname) --> 一个参数, 根据文件路径创建一个File对象. (常用)
(3) File(String parent, String child) --> 两个参数, 根据父目录的路径和孩子文件的路径创建一个File对象.
[2] File的常用方法
关于对File的操作, java标准库提供了很多方法, 大家可以自行查看, 我们这里挑几个常用的方法讨论一下.
(1) getParent() : 返回值为String类型, 返回File对象的父目录的路径.
(2) getName() : 返回值为String类型, 返回File对象的文件名称.
(3) getPath() : 返回值为String类型, 返回文件的路径.
(4) getAbsolutePath() : 返回值为String类型, 返回文件的绝对路径.
(5) getCanonicalPath() : 返回值为String类型, 返回文件经过修饰的绝对路径.
下面我们通过代码演示一下上述几个方法:
import java.io.File;
import java.io.IOException;public class Demo1 {public static void main(String[] args) throws IOException {File file = new File(".\\test.txt"); //创建一个文件对象//注意: 这里写了一个相对路径, 这个相对路径的基准路径是当前项目所在的路径System.out.println(file.getParent()); //获取当前文件对象的父目录System.out.println(file.getName()); //获取当前文件名字System.out.println(file.getPath()); //获取当前文件的路径System.out.println(file.getAbsolutePath()); //获取当前文件的绝对路径System.out.println(file.getCanonicalPath()); //获取当前文件经过修饰的绝对路径}
}
我们这里声明了IOException, 我们咋进行文件操作的时候, 很可能会抛出异常, 主要原因有两点: 一是由于权限不够, 二是由于硬盘存储空间已满.

我们创建文件对象的时候, 给的路径是一个相对路径. 我们前面说过, 相对路径一定有一个基准路径, 这里test.txt文件的基准路径(当前目录)就是该项目所在目录. 那么该项目所在目录的路径是什么呢? 我们可以通过project --> Open in Explorer 来查看.

下面我们看这个程序的打印结果:

父目录的路径: 父目录的路径就是当前路径, 就是一个 "."
文件名称: 文件名称就是test.txt
路径: 这里文件路径用相对路径表示.
文件的绝对路径: 显示文件的绝对路径 (注意这里的绝对路径没有删除 ".")
文件经过修饰后的绝对路径: 这里显示的绝对路径就是我们平时看到的绝对路径了. 修饰就相当于把 "." 删除掉了.
(6) createNewFile() : 返回值为boolean类型, 创建File对象代表的文件, 如果创建成功, 返回true.

我们看到, 这里成功在当前目录下创建了一个文件test.txt. 打印true. 我们在左侧项目列表中能看到, 多出了一个test.txt文件.
(7) delete() : 返回值为boolean类型, 删除文件, 如果删除成功, 则返回true.

(8) deleteOnExit() : 没有返回值, 表示在进程结束时删除文件.

我们调用了deleteOnExit(), 表示在进程结束时删除该文件, 如上述运行结果,在先打印了两个"wait for Exit" 之后, 进程结束, 同时删除文件, 我们可以看到在同一时刻左侧项目列表中看到test.txt消失.
(9) mkdir() : 返回值为boolean类型, 创建File对象代表的目录 ([注]: 这里只能创建一级目录), 创建成功则返回true

如上述代码, 我们调用mkdir()方法, 并打印其返回值, 运行结果是true, 并且可以在左侧项目列表中看到出现了一个新的目录名为test.txt.
(10) mkdirs() : 返回值为boolean类型, 创建File对象代表的目录 (可以是多级目录), 创建成功则返回true.

如上述代码, 我们创建了多级目录.
(11) isFile() : 返回值为boolean类型, 判断当前File对象代表的文件是否是一个普通文件.
(12) isDirectory() : 返回值为boolean类型, 判断当前File对象代表的文件是否是一个目录.

调用isFile()和isDirectory()判断test.txt的文件类型. 显然, text是一个普通文件, 不合是一个目录. 所以打印 true, false.
(13) list() : 返回值为String[]类型, 返回一个字符串数组. 返回File对象代表的目录下所有的文件的名称.

运行代码, 我们发现, 如果我们直接打印 list() 的结果, 得到的是一串哈希码, 但这显然不是我们想要的. 所以, 我们如果想得到所有文件的名称, 还需要一步处理: Arrays.toString().

这样一来就得到了我们想要的文件名称了.
(14) listFiles() : 返回值为File[], 返回一个File类型的数组. 返回File对象代表的目录下所有的文件对象.

listFiles()方法能够获取所有文件对象, 而list()方法只能获取文件名称, 所以我们日常开发中, 使用listFiles() 会更多一点.
(15) renameTo(File dest) : 返回值为boolean类型, 进行文件改名操作.
我们先创建出一个名称为"aaa"文件.

下一步调用renameTo方法将文件aaa的名称改为bbb.

[3] 查看某目录下所有的目录和文件
通过list()和listFiles(), 我们只能查看到当前目录下面一层的文件. 但是如果我们想要获取到当前目录下面所有的目录和文呢? --> 通过递归的方法实现.
import java.io.File;public class Demo4 {private static void scan(File currentDir) {File[] files = currentDir.listFiles(); // 1. 获取该目录下所有的文件if (files == null || files.length == 0 ) {return;// 2. 如果目录为空 / 给定路径不是目录 --> 直接返回.}System.out.println(currentDir.getAbsolutePath());// 3. 打印目录的路径for (File f : files) {// 4. 遍历当前目录下所有的内容.if (f.isFile()) {// 如果是普通文件, 直接打印其路径System.out.println(f.getAbsolutePath());} else {// 如果是目录(不是普通文件), 那就递归调用scan方法.scan(f);}}}public static void main(String[] args) {File f = new File(".");scan(f);}
}
如上述运行结果, 这里就打印出了当前目录下 所有的 目录(+其中的文件) 和 文件.
2. 文件内容操作
文件内容的操作, 无非两种, 读文件和写文件. 对于读文件和写文件的操作, 系统也有相应的API, 并且 java 也对这些 API 进行了封装, 叫做 "文件流" 或者 "IO流". (流: Stream).
为什么叫流呢? 因为它的读写方式是流式的. 什么是流式? --> 我们可以结合水流来理解一下: 比如我接水的时候, 要接100ml的水, 那么我可以一次接100ml全接完, 也可以一次接50ml分两次接完, 也可以一次接10ml分10次接完, 也可以第一次接1ml, 第二次接2ml, 第三次接3ml, ... 直到接完100ml. 类似地, IO流在读数据的时候, 要读100byte的数据, 可以一次把100byte全读完, 也可用一次读取50byte, 分两次读完, 也可以一次读10byte, 分10次读完, 也可以第一次读1byte, 第二次读2byte, 第三次读3byte, ... 直到读完100byte.
上述这样的读写方式, 我们就成为是"流式"的.
Java中实现IO流的类有很多, 我们把它们分成两大类: 字符流(用于读写文本文件) 和 字节流(用于读写二进制文件). 字符流是以字符为读写的基本单位; 字节流是以字节为读写的基本单位.
字节流又分为 字节输入流(InputStream) 和 字节输出流(OutputStream).
字符流又分为 字符输入流(Reader) 和 字符输出流(Writer).
上面说的这4个类, 都是抽象类, Java中又提供了很多很多类实现了这4个抽象类.

其中, 以 InputStream, OutputStream 结尾的, 就是实现了 InputStream, OutputStream 的类. 以Reader, Writer 结尾的, 就是实现了 Reader, Writer 的类.
这么多类, 我们当然不需要全部掌握, 我们只需要掌握其中几个重点的类即可, 其他的在以后如果有用到再查.
[注]: 什么是"输入", 什么是"输出"? --> 我们一般站在CPU的角度讨论这个问题: 数据远离CPU是输出, 数据靠近CPU是输入.
InputStream

如上述代码, 我们创建了一个字节流对象, 由于InputStream是抽象类, 不能直接用它创建对象, 所以我们使用它的实现类FileInputStream来创建对象. 这里抛出的FileNotFoundException是IOException的子类. (所以在这里我们直接写IOException也是没有问题的).
注意: 这里FileInputStream类构造方法中传的参数就是我们要进行读写的目标文件, 这个参数可以是绝对路径, 可以是相对路径, 还可以是File对象.


上述代码的含义: 创建了一个字节流对象, 并且打开指定目录的文件(此处并不能直接看出来, 但是这样的代码确实隐含了这样的操作).
注意, 在这里我们使用完字节流对象之后, 记得要释放资源.
关于这里为什么要释放资源, 我们来具体解释一下: 我们先需要知道, 系统中有一个文件描述符表, 它本质上是一个长度固定, 不可扩容的数组, 如果我们打开一个文件, 就相当于在文件描述符表上插入了一个元素(占用了一个位置), 只有调用close(), 才能把这个占用的空间释放出来, 如果我们不去调用close(), 那么这个位置就会被持续占用, 如果我们一直打开文件, 一直不关闭, 那么用不了多久这个文件描述符表就会被占满, 到那时候我们再打开文件, 就会出现错误! --> 这个问题就被称为"文件资源泄漏"问题. 所以, 我们在打开文件之后, 一定记得要关闭, 避免出现这样的问题.
但是我们发现, 每打开一个文件都要写一遍close(), 这样太麻烦了, Java也考虑到了这一点, 所以提供了一种语法: try with resources 这样的语法.

如上述代码, 这里 try() 中创建的资源(可以是多个资源), 在 try() 后{ }中的内容执行完毕之后, 会自动执行 close() 把打开的资源关闭.
文件内容的操作有四种:
(1) 打开文件
打开文件会在创建资源的时候自动打开.
(2) 关闭文件
调用close()
(3) 读文件
使用read方法.


这里返回值是 int 而不是 byte 的原因是: 如果是正常返回, 那么就返回0-255, 如果读到文件末尾了, 那就返回-1. (如果使用byte的话, 只能表示0-255的数据, 无法返回-1).
我们再来看这三个构造方法分别表示什么意思:
<1> int read() : 从输入流中读取一个字节的数据, 并返回一个整数. (调用一次, 读一个字节, 返回值就是这个字节的内容)
<2> int read(byte[ ] b) : 从输入流中读取数据到字节数组b中, 读取的最大长度是b.length().
<3> int read(byte[ ] b, int off, int len) : 从输入流中读取数据到字节数组b中, 从b数组的off偏移量 (其实就是数组中某个指定位置) 开始, 读取的最大长度是len.
[注]: <2> <3> 中的b参数, 是"输出型参数", 表示该方法的输出结果是存到数组b中的.
(4) 写文件
使用write方法
write方法没有返回值, 参数表示的含义也和read差不多.
<1> void write(int b) : 将一个字节写入输出流, b表示要输出的字节的整数表示形式.
<2> void write(byte[ ] b) : 写入输出流一个字节数组.
<3> void write(byte[] b) : 将字节数组b中从off偏移量开始的len个字节写入输出流.
[注]: OutputStream, 在调用write()时, 默认会清空原来的内容. 如果我们不想清空原来的内容, 要追加写, 我们就可以在构造方法中加上一个true, 表示追加写.

好, 那么上面是关于字节流读写的方法, 那么字符流呢? --> 与字节流十分相似


<1> int read() : 从输入流中读取一个字符.
<2> int read(char[ ] cbuf) : 从输入流中读取数据到字符数组cbuf中.
<3> int read(CharBuffer target) : 从输入流中读取数据到指定缓冲区中 (缓冲区: buffer).
<4> int read(char[ ] cbuf, int off, int len) : 从输入流中读取数据到字符数组cbuf中, 从cbuf数组的off偏移量开始, 读取的最大长度是len.

<1> void write(int c) : 将一个字符写入输出流, c是子字符的整数表示形式.
<2> void wrtie(String str) : 将一个字符串写入输出流.
<3> void write(char[ ], cbuf) : 写入输出流一个字符数组.
<4> void write(String str, int off, int len) : 将字符串str中从off偏移量开始的len个字符写入输出流.
<5> void write(char[ ] cbuf, int off, int len) : 将字符数组cbuf中从off偏移量开始的len个字符写入输出流.
好了, 本篇文章就介绍到这里啦, 大家如果有疑问欢迎评论, 如果喜欢小编的文章, 记得点赞收藏~~

相关文章:
文件操作和IO
目录 一. 文件预备知识 1. 硬盘 2. 文件 (1) 概念 (2) 文件路径 (3) 文件类型 二. 文件操作 1. 文件系统操作 [1] File常见的构造方法 [2] File的常用方法 [3] 查看某目录下所有的目录和文件 2. 文件内容操作 (1) 打开文件 (2) 关闭文件 (3) 读文件 (4) 写文件 …...
【C++滑动窗口】1248. 统计「优美子数组」|1623
本文涉及的基础知识点 C算法:滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…...
C语言导航 4.1语法基础
第四章 顺序结构程序设计 第一节 语法基础 语句概念 语句详解 程序详解 4.1.1语句概念 说明:构成高级语言源程序的基本单位。 特征:在C语言中语句以分号作为结束标志。 分类: (1)简单语句:空语句、…...
使用 Python 和 Py2Neo 构建 Neo4j 管理脚本
Neo4j 是一个强大的图数据库,适合处理复杂的关系型数据。借助 Python 的 py2neo 库,我们可以快速实现对 Neo4j 数据库的管理和操作。本文介绍一个功能丰富的 Python 脚本,帮助用户轻松管理 Neo4j 数据库,包含启动/停止服务、清空数…...
Centos 7 安装wget
Centos 7 安装wget 最小化安装Centos 7 的话需要上传wget rpm包之后再路径下安装一下。rpm包下载地址(http://mirrors.163.com/centos/7/os/x86_64/Packages/) 1、使用X-ftp 或者WinSCP等可以连接上传的软件都可以首先连接服务器,这里我用的…...
定时器的小应用
第一个项目 第一步,RCC开启时钟,这个基本上每个代码都是第一步,不用多想,在这里打开时钟后,定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…...
linux企业中常用NFS、ftp服务
1.静态ip配置 修改ip地址为静态vim /etc/sysconfig/network-scripts/ifcfg-enxxx BOOTPROTO"static" IPADDR192.168.73.10 GATEWAY192.168.73.2 # 该配置与虚拟机网关一致 NETMASK255.255.255.0重启网卡:systemctl restart network.service ping不通域名…...
数据结构与算法分析模拟试题及答案5
模拟试题(五) 一、单项选择题(每小题 2 分,共20分) (1)队列的特点是( )。 A)先进后出 B)先进先出 C)任意位置进出 D࿰…...
.NET 9.0 中 System.Text.Json 的全面使用指南
以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式,包括序列化、反序列化、配置选项等,并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…...
Python自动检测requests所获得html文档的编码
使用chardet库自动检测requests所获得html文档的编码 使用requests和BeautifulSoup库获取某个页面带来的乱码问题 使用requests配合BeautifulSoup库,可以轻松地从网页中提取数据。但是,当网页返回的编码格式与Python默认的编码格式不一致时,…...
11.12机器学习_特征工程
四 特征工程 1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 …...
RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记
《FACTS About Building Retrieval Augmented Generation-based Chatbots》是2024年7月英伟达的团队发表的基于RAG的聊天机器人构建的文章。 这篇论文在待读列表很长时间了,一直没有读,看题目以为FACTS是总结的一些事实经验,阅读过才发现FAC…...
【配置后的基本使用】CMake基础知识
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...
ollama+springboot ai+vue+elementUI整合
1. 下载安装ollama (1) 官网下载地址:https://github.com/ollama/ollama 这里以window版本为主,下载链接为:https://ollama.com/download/OllamaSetup.exe。 安装完毕后,桌面小图标有一个小图标,表示已安装成功&…...
【项目开发】理解SSL延迟:为何HTTPS比HTTP慢?
未经许可,不得转载。 文章目录 前言HTTP与HTTPS的耗时差异TCP握手HTTPS的额外步骤:SSL握手使用curl测量SSL延迟性能与安全的权衡前言 在互联网发展的早期阶段,Netscape公司设计了SSL(Secure Sockets Layer)协议,为网络通信提供加密和安全性。有人曾提出一个大胆的设想:…...
2.STM32之通信接口《精讲》之USART通信
有关通信详解进我主页观看其他文章!【免费】SPIIICUARTRS232/485-详细版_UART、IIC、SPI资源-CSDN文库 通过以上可以看出。根据电频标准,可以分为TTL电平,RS232电平,RS485电平,这些本质上都属于串口通信。有区别的仅是…...
Bootstrap和jQuery开发案例
目录 1. Bootstrap和jQuery简介及优势2. Bootstrap布局与组件示例:创建一个响应式的表单界面 3. jQuery核心操作与事件处理示例:使用jQuery为表单添加交互 4. Python后端实现及案例代码案例 1:用户登录系统Flask后端代码前端代码 5. 设计模式…...
Qt 之 qwt和QCustomplot对比
QWT(Qt Widgets for Technical Applications)和 QCustomPlot 都是用于在 Qt 应用程序中绘制图形和图表的第三方库。它们各有优缺点,适用于不同的场景。 以下是 QWT 和 QCustomPlot 的对比分析: 1. 功能丰富度 QWT 功能丰富&a…...
【STM32】MPU6050简介
文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册:MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…...
Oracle 单机及 RAC 环境 归档模式及路径修改
Oracle 数据库的使用过程中经常会根据需求的不同而调整归档模式,也经常会修改归档文件存放路径。 下面分别演示单机及 RAC 环境下修改归档模式及路径的操作步骤。 一、单机环境 1.查询当前归档模式及路径 SQL> archive log list Database log mode …...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
