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

java中的文件操作

基础知识

1.File类对象的常用方法

一、 创建文件和目录
1.createNewFile()
用于创建一个新的文件,如果文件已经存在,则返回 false
File file = new File("C:\\Users\\P51\\Desktop\\file.txt");
file.createNewFile();
2.mkdir()
用于创建一个单一目录,无法创建不存在的父级目录的目录
File file = new File("C:\\Users\\P51\\Desktop\\files");
file.mkdir();
3.mkdirs()
创建目录以及所有不存在的父目录。如果目录已经存在,返回false
File file = new File("C:\\Users\\P51\\Desktop\\files\\test\\testa");
file.mkdirs();二、删除文件或目录
1.delete()
删除文件或空目录。删除成功返回 true,失败返回 false2.deleteOnExit()
文件在 JVM 退出时自动删除。删除临时文件的方法三、获取文件和目录信息
1.exists()
检查文件或目录是否存在。
2.isFile()
判断文件是否为普通文件。
3.isDirectory())
判断是否为目录。
4.length()
返回文件的字节长度。对于目录,返回 05.lastModified())
返回文件最后修改的时间,单位为毫秒。
6.getName()
获取文件或目录的名称。
7.getAbsolutePath()
获取文件或目录的绝对路径。
8.getParent()
获取文件的父目录路径。四、列出目录中的文件
1.file.listFiles()
返回目录中所有文件和子目录的 File 对象数组。
2.file.list()
方法仅返回目录下的文件名(不包括文件的属性)。这个方法通常比 listFiles() 更快速,因为它只返回文件名字符串,而不返回File 对象。
五、文件权限操作
1.setReadable(boolean readable)设置文件是否可读。
2.setWritable(boolean writable)设置文件是否可写。
3.setExecutable(boolean executable)设置文件是否可执行。(一般指的是脚本文件)
六、文件路径相关操作
1.renameTo(File dest)
重命名文件或将文件移动到目标路径。如果重命名成功,返回 true
2.toURI()获取文件的 URI

2.File类的静态方法

//创建临时文件
File tempFile = File.createTempFile("test", ".txt", new File("C:\\Users\\P51\\Desktop\\files\\test\\testa"));
//这里就可以调用以下方法,该方法会在JVM 退出时自动删除文件
tempFile.deleteOnExit();

一、将数据作为文件保存到本地(序列化)

Java 序列化是一种将对象状态转换为字节序列的过程,以便可以将其持久化到磁盘或通过网络发送到其他 JVM 实例。序列化是 Java 的一种内置机制,它允许你将对象转换为字节流,之后可以将这些字节流重新转换回对象。

步骤

1.实现 Serializable 接口

要使一个类的对象可序列化,该类需要实现 java.io.Serializable 接口。这是一个标记接口,不包含任何方法。

2. serialVersionUID

为了确保序列化和反序列化过程中的版本兼容性,建议在类中声明一个名为 serialVersionUID 的静态常量。如果类在序列化后被修改,而没有更新这个版本号,反序列化时可能会抛出InvalidClassException。

public class MyClass implements Serializable {private static final long serialVersionUID = 1L;private int id;private String name;// 构造函数、getter 和 setter}
3.定义输出编码格式(GBK,UTF-8等)进行输出
3.1基本的文件输出流(OutputStream)

使用 FileOutputStream 时,可以在写入数据之前将字符串转换为字节数组,并指定编码格式。

在 getBytes() 方法中传入 charset 参数来指定编码格式

public static void main(String[] args) {String data = "Hello, world!";String filePath = "path/to/your/output.txt";String charset = "UTF-8"; // 指定编码格式try (OutputStream outputStream = new FileOutputStream(filePath)) {byte[] bytes = data.getBytes(charset);outputStream.write(bytes);System.out.println("File exported successfully.");} catch (IOException e) {e.printStackTrace();} finally{outputStream.close();        }}
3.2BufferedWriter 和 FileWriter(推荐使用)

这种方法在处理大量数据时性能表现较好,因为它们使用了缓冲机制,可以减少频繁的磁盘访问。

在 OutputStreamWriter 的构造函数中传入 charset 参数来指定编码格式。

public static void main(String[] args) {String filePath = "path/to/your/output.txt";String charset = "UTF-8"; // 指定编码格式try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), charset))) {writer.write("Line 1\n");writer.write("Line 2\n");writer.write("Line 3\n");System.out.println("File exported successfully.");} catch (IOException e) {e.printStackTrace();} finally{//关闭流write.close();        }}

demo示例

List<ClientLog> clientLogList = clientLogRepository.findAll();
DateTimeFormatter simpleDateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
String fileFullPath;
if(startDate != null && endDate != null) {fileFullPath = downloadPath + File.separator + "log-client" + File.separator +simpleDateFormat.format(startDate) + "-" + simpleDateFormat.format(endDate) + ".txt";
}else {fileFullPath = downloadPath + File.separator + "log-client" + File.separator +simpleDateFormat.format(LocalDateTime.now()) + ".txt";
}
File file = new File(downloadPath + File.separator + "log-client");
if(!file.exists()){file.mkdir();
}
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileFullPath), "GBK"));
StringBuilder stringBuilder = new StringBuilder();
for (Object line:clientLogList){//JSON解析,按需添加//String jsonString = JSON.toJSONString(line);stringBuilder.append(jsonString).append("\n");
}
writer.write(stringBuilder.toString());
//使用完流要关闭,否则可能没有内容
writer.close();

二、读取本地的指定文件内容并返回给前端文件流

步骤

1.读取文件

按照文件路径来进行读取。

注意读取指定文件时一定把文件名写全包括文件的后缀(txt,pdf,json等)

String filePath = "path_to_your_file"; 
// 替换为你的文件路径File file = new File(filePath);
方式1:使用 java.io 包(将内容存储为缓冲输入流
String filePath = "path_to_your_file.txt";try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}
方式2:使用 java.nio.file 包(将内容存储为集合)
String filePath = "path_to_your_file.txt";try {List<String> lines = Files.readAllLines(Paths.get(filePath));for (String line : lines) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}
方式3:如果需要读取整个文件为字节数组(适用于二进制文件)

可以使用Files.readAllBytes 方法。

String filePath = "path_to_your_file.bin";try {byte[] bytes = Files.readAllBytes(Paths.get(filePath));System.out.println("File size: " + bytes.length + " bytes");} catch (IOException e) {e.printStackTrace();}
方式4:使用 java.util.Scanner
 String filePath = "path_to_your_file.txt";try (Scanner scanner = new Scanner(new File(filePath))) {while (scanner.hasNextLine()) {System.out.println(scanner.nextLine());}} catch (FileNotFoundException e) {e.printStackTrace();}
方式5: 使用第三方库如 Apache Commons IO
String filePath = "path_to_your_file.txt";File file = new File(filePath);try {List<String> lines = FileUtils.readLines(file, "UTF-8");for (String line : lines) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}
2.文件读取和返回
2.1检查文件是否存在

.exists()

if (file.exists()) { ... }
2.2设置响应类型和头部信息

这两行代码告诉浏览器返回的内容是一个二进制流,同时指定了下载文件时的文件名。

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());

响应类型(即MIME类型):常见 MIME 类型列表 - HTTP | MDN (mozilla.org)

application/x-download 是一种被废弃的 MIME 类型,用于指示要下载的文件类型。它在过去被广泛使用,但现在已经不推荐使用了。

MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,用于标识文档的性质和格式。MIME类型通常由一种主要类型和一个子类型组成,中间使用斜杠分隔。主要类型表示文档的大类,例如文本、图像、音频等,而子类型则表示特定类型的细分,比如文本类型可以进一步细分为HTML、XML等。

MIME类型在互联网上的应用非常广泛,最常见的用途之一是通过HTTP协议来指示服务器发送的文件类型。这对于浏览器正确解释和展示不同类型的文件至关重要,比如指示浏览器一个链接指向的是图片、视频、文本还是其他类型的文件。

除了在Web开发中的应用外,MIME类型还被用于电子邮件系统中,以标识附件的类型,并确保接收者能够正确地打开或处理这些附件。MIME类型的标准化使得不同系统之间能够准确地识别和处理各种类型的文档,提高了互操作性和信息交换的可靠性。

2.3创建输入流和输出流

使用文件的输入流读取文件内容,然后使用响应的输出流将文件内容写入响应中。

 try (InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream());
2.4通过循环读取和写入数据实现文件流返回

这个循环从输入流中读取数据到缓冲区,然后将数据写入到响应的输出流中。

 byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}
问题:为什么不能直接将输入流的数据写入到响应流中,而是需要使用缓冲区。

原因解析:

1.提高传输效率:

使用缓冲区可以减少 I/O 操作的次数,提高数据传输的效率。每次从输入流读取一定大小的数据块,然后再写入输出流,比每次只读写一个字节要高效得多。

2.减少系统调用次数:

每次对流进行读写操作都会涉及到系统调用,这些调用是有开销的。如果每次只读写一个字节,将会产生大量的系统调用,导致程序性能下降。使用缓冲区一次处理多个字节,可以显著减少系统调用次数。

3.兼容性和可移植性:

不同的底层实现可能对单字节读写操作有不同的优化程度。使用缓冲区适应性更强,能保证在各种环境下都能高效运行。

4.代码简洁性和可读性:

使用缓冲区使代码更加简洁明了,逻辑清晰。直接逐字节操作不仅繁琐,而且容易引入错误。

示例代码
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;public class StreamCopyUtil {public static void copyStream(InputStream inputStream, OutputStream outputStream) throws IOException {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}
}
缓冲区的作用

1.缓冲区大小:

在上面的例子中,缓冲区大小为 4096 字节(4KB)。这个大小是一个折衷,既不会太小以至于频繁地调用系统 I/O 操作,也不会太大造成不必要的内存占用。具体大小可以根据实际应用场景调整。

2.循环读取和写入:

循环读取输入流中的数据到缓冲区,然后将缓冲区中的数据写入输出流。每次读取和写入的字节数由 read() 方法返回的字节数决定。

直接逐字节操作的缺点

如果不使用缓冲区,直接逐字节操作的代码如下:

javaCopy Codepublic static void copyStreamUnbuffered(InputStream inputStream, OutputStream outputStream) throws IOException {int byteData;while ((byteData = inputStream.read()) != -1) {outputStream.write(byteData);}
}

这种方法虽然也能完成任务,但由于每次只读写一个字节,会造成频繁的系统调用,导致性能低下。

总结

使用缓冲区来进行数据传输是一种常见且有效的优化方式,可以显著提高数据传输的效率,减少系统调用的开销,并使代码更加简洁和易于维护。这也是为什么在实际开发中,通常会看到使用缓冲区来处理输入流和输出流的操作。

2.5 关闭流

关闭流是非常重要的,因为它可以释放系统资源并确保数据完全写入。在实际开发中,为了避免资源泄漏和确保数据完整性,我们应该在使用完流之后及时关闭它们。

这里在使用BufferedWriter写入文件时没有内容就是因为没有关闭流导致写入是无效的,因此一定要关闭流。(本人就因为忘记关闭流而导致写入的文件内容为空)。

JAVA-BufferedWriter写入文件没有内容_bufferedwriter写入后为空-CSDN博客

inputStream.close();
outputStream.flush();
outputStream.close();

在处理输出流时,除了关闭流以外,有时还需要使用 flush() 方法。

flush() 方法的作用是将缓冲区中的数据强制写出到目标设备(如文件、网络等)中。这个方法在某些情况下非常重要,例如在进行网络通信时,需要确保数据被及时发送出去。

关闭流时自动 flush。需要注意的是,当你调用 close() 方法关闭输出流时,流会自动调用 flush() 方法。所以,在大多数情况下,只要在完成写入操作后正确地关闭流,就已经隐式地完成了 flush 操作。

demo示例

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String filePath = "C:\Users\P51\Desktop\files\test.txt"; // 替换为你的文件路径File file = new File(filePath);if (file.exists()) {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());//不是非必要response.setHeader("Content-Length", String.valueOf(file.length()));try (InputStream inputStream = new FileInputStream(file);OutputStream outputStream = response.getOutputStream()) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}//一定要关闭流,不要忘记!!!!!inputStream.close();outputStream.flush();outputStream.close();} else {response.getWriter().write("File not found");}}

最后祝大家新的一年,事业有成,学有所成!

相关文章:

java中的文件操作

基础知识 1.File类对象的常用方法 一、 创建文件和目录 1.createNewFile() 用于创建一个新的文件&#xff0c;如果文件已经存在&#xff0c;则返回 false File file new File("C:\\Users\\P51\\Desktop\\file.txt"); file.createNewFile(); 2.mkdir() 用于创建一个…...

修复OpenHarmony系统相机应用横屏拍照按钮点不到的问题

适配OpenHarmony系统相机应用横屏UI&#xff0c; 相关pr: https://gitee.com/openharmony/applications_camera/pulls/233/files 适配效果 如何安装 编译好的hap提供在附件中 1.预置在源码&#xff0c;随固件安装 2.安装hap hdc shell "mount -o remount,rw /"…...

2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情

2024165读书笔记|《飞花令合》—— 人生飘忽百年内&#xff0c;且须酣畅万古情 屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢 《飞花令合》…...

哈夫曼编码(Huffman Coding)与哈夫曼树(Huffman Tree)

已知字符集{a,b,c,d,e,f}&#xff0c;若各字符出现的次数分别为6&#xff0c;3&#xff0c;8&#xff0c;2&#xff0c;10&#xff0c;4&#xff0c;则对应字符集中各字符的哈夫曼编码可能是&#xff08; &#xff09;。 A.00&#xff0c;1011&#xff0c;01&#xff0…...

Django项目中高效管理和使用选择常量

引言 在开发Django项目时,我们经常需要处理各种选择字段,比如用户类型、订单状态或产品分类等。如何有效地管理这些选择常量,使其在整个项目中保持一致性,同时又易于维护和更新呢?本文将介绍一种在Django项目中集中管理和使用选择常量的方法。 正文 © ivwdcwso (I…...

拦截器(Interceptor)的使用

在Java Web开发中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一种动态拦截请求和响应的对象&#xff0c;它可以在请求被控制器处理之前和之后执行一些预处理和后处理逻辑。要定义一个拦截器并使其生效&#xff0c;通常需要以下几个步骤&#xff1a; 1. 定义拦截…...

线段树例题题解

卫星覆盖&#xff08;NOI1997&#xff09; 题面&#xff1a; SERCOI&#xff08;Space-Earth Resource Cover-Observe lnstitute&#xff09; 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...

AI提示词工程的“优化背后”:如何通过精准提示提升模型性能?

提示词工程(Prompt Engineering)已经成为推动AI模型如GPT等发挥其强大能力的核心。AI模型的输出质量与输入的提示词密切相关。因为之前已经大致用过一段时间提示词,所以这篇文章集中在有一定基础,起码对提示词不陌生,想要去设计和优化提示词+处理复杂问题的时候不知道如何…...

c# Record关键字

在 C# 9.0 中引入了 record 关键字&#xff0c;用于定义记录类型&#xff08;Record Types&#xff09;。记录类型是一种轻量级的数据载体&#xff0c;专注于表示数据&#xff0c;它提供了内置的相等性比较、生成属性和方法等功能&#xff0c;使得编写数据类更加简洁和高效。 …...

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI&#xff0c;用户可以轻松管理 Nginx 配置&#xff0c;而无需直接编辑配置文件&#xff0c;尤其适合新手用户和频繁修改配置的场景。 官网文档&#xff1a;nginxWebUI - 文档 本文将分享为什么选择 ngin…...

家政预约小程序04活动管理表结构设计

目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销&#xff0c;我们通常需要搞一些活动&#xff0c;比如满减、折扣、团购等。启动活动后&#xff0c;会在首页进行显示&#xff0c;当用户访问小程序的时候&#xff0c;就可以参与活动&#xf…...

谷歌浏览器的在线存储功能使用方法

谷歌浏览器不仅是目前全球使用最广泛的网络浏览器之一&#xff0c;它还集成了许多实用的功能来提升用户体验。其中&#xff0c;谷歌浏览器的在线存储功能允许用户将数据保存在云端&#xff0c;实现跨设备的无缝同步和共享。本文将详细介绍如何在谷歌浏览器中使用这一功能。 一、…...

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代&#xff0c;各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控&#xff0c;还是智慧工厂、智慧城市等领域&#xff0c;都需要高效、智能的设备来保障安全和提高生产效率。然而&#xff0c;传统的视频监控设备存在诸多痛点&#xff1a;…...

回调机制实现观察者模式

观察者设计模式&#xff0c;允许对象在状态变化时通知其他依赖对象&#xff0c;通常通过回调函数实现。 在回调机制中&#xff0c;可以注册多个回调函数&#xff0c;以便在特定事件发生时依次调用它们。下面是一个示例&#xff0c;展示如何在 C 中实现一个简单的事件管理器&am…...

并发编程系列(一) -多线程技术快速入门

最近对 Java 并发编程技术知识进行了重新整理&#xff0c;再次献上文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 并发编程系列(一) -多线程技术快速入门并发编程系列(二) -Thread类介绍并发编程系列(三) -synchronized关键字介绍并发编程系列(四) -v…...

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程-CSDN博客里面有提过相关知识------IO流&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源&#xff0c;我们对共享资源进行保护&#xff0c;就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题&#xff0c;下面是一个抢票的代码&#xff0c;共计票数10000张&#xff0c;4个线程去抢 之前我们展示过封…...

[江科大STM32] 第五集快速建立STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 一个MD&#xff0c;还有所有.c.h 这里所有文件 这里所有文件...

流水线并行举例说明;GPU 的细粒度问题

GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...

如何确保Kafka集群的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【如何确保Kafka集群的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何确保Kafka集群的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性&#xff0c;需要…...

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Oracle SqlPlus常用命令简介

参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求&#xff1a;每间隔5s&#xff0c;控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景&#xff1a;比如一个任务每个…...

《计算机组成及汇编语言原理》阅读笔记:p160-p176

《计算机组成及汇编语言原理》学习第 12 天&#xff0c;p160-p176 总结&#xff0c;总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...

TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信

上篇文章我们学习了TCP的服务器端模式的编写&#xff0c;这篇文章我们将开始编写客户端的代码&#xff0c;完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同&#xff0c;在客户端我们只需要服务器端的套接字和服务器端的地址和端口&#xff0c;用于向…...

如何在谷歌浏览器中使用自定义模板

作为最常用的网络浏览器之一&#xff0c;谷歌浏览器不仅提供了强大的功能&#xff0c;还允许用户通过各种方式自定义其外观和功能。其中&#xff0c;使用自定义模板可以极大地提升用户体验&#xff0c;无论是更改浏览器的外观还是优化网页显示效果。本文将详细介绍如何在谷歌浏…...

Day2 微服务 网关路由转发、网关登录校验、配置管理

目录 1.网关路由转发 1.1 网关 1.2 快速入门 1.2.1 创建项目 1.2.2 引入依赖 1.2.3 启动类 1.2.4 配置路由 1.2.5 测试 1.3 路由过滤 2.网关登录校验 2.1 鉴权思路分析 2.2 网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登录校验 2.4.…...

Android 旋转盘导航栏

1.直接上源码&#xff1a; package com.you.arc;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.support…...

空域降噪、频域降噪和时域降噪

目录 算法原理&#xff1a; 1.图像噪声 2.图像中常见的噪声的类型 3.不同域的定义 4.空域降噪 4.1.空域降噪的定义&#xff1a; 4.2.思想核心&#xff1a; 4.3.局部的线性算法 高斯降噪 4.4.非局部算法 5.频域降噪 傅里叶降噪&#xff1a; 小波降噪&#xff1a; …...