读书笔记-《ON JAVA 中文版》-摘要17[第十七章 文件]

news2024/11/16 9:28:41

文章目录

  • 第十七章 文件
    • 1. 文件和目录路径
      • 1.1 选取路径部分片段
      • 1.2 路径分析
      • 1.3 Paths的增减修改
    • 2. 目录
    • 3. 文件系统
    • 4. 路径监听
    • 5. 文件查找
    • 6. 文件读写
    • 7. 本章小结

第十七章 文件

在丑陋的 Java I/O 编程方式诞生多年以后,Java终于简化了文件读写的基本操作。

在 Java7 中对此引入了巨大的改进。这些新元素被放在 java.nio.file 包下面,过去人们通常把 nio 中的 n 理解为 new 即新的 io,现在更应该当成是 non-blocking 非阻塞 io(io就是input/output输入*/*输出)。最重要的是 Java8 新增的 streams 与文件结合使得文件操作编程变得更加优雅。

我们将看一下文件操作的两个基本组件:

  1. 文件或者目录的路径;

  2. 文件本身。

1. 文件和目录路径

一个 Path 对象表示一个文件或者目录的路径,是一个跨操作系统(OS)和文件系统的抽象,目的是在构造路径时不必关注底层操作系统,代码可以在不进行修改的情况下运行在不同的操作系统上。java.nio.file.Paths 类包含一个重载方法 static get(),该方法接受一系列 String 字符串或一个统一资源标识符(URI)作为参数,并且进行转换返回一个 Path 对象:

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PathInfo {
    static void show(String id, Object p) {
        System.out.println(id + ":" + p);
    }

    static void info(Path p) {
        show("toString", p);
        show("Exists", Files.exists(p)); // 检查一个Path在文件系统中是否存在
        show("RegularFile", Files.isRegularFile(p)); // 判断是否是一个文件
        show("Directory", Files.isDirectory(p));
        show("Absolute", p.isAbsolute());
        show("FileName", p.getFileName());
        show("Parent", p.getParent());
        show("Root", p.getRoot());
        System.out.println("******************");
    }

    public static void main(String[] args) {
        System.out.println(System.getProperty("os.name"));
        info(Paths.get("C:", "path", "to", "nowhere", "NoFile.txt"));
        Path p = Paths.get("PathInfo.java");
        info(p);
        Path ap = p.toAbsolutePath();
        info(ap);
        info(ap.getParent());
        try {
            info(p.toRealPath());
        } catch (IOException e) {
            System.out.println(e);
        }
        URI u = p.toUri();
        System.out.println("URI: " + u);
        Path puri = Paths.get(u);
        System.out.println(Files.exists(puri));
        File f = ap.toFile();
    }
}

1.1 选取路径部分片段

Path 对象可以非常容易地生成路径的某一部分:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PartsOfPaths {
    public static void main(String[] args) {
        System.out.println(System.getProperty("os.name"));

        /*
         * PS:System.setProperty 设置 user.dir,不设置的话,
         * Paths.get("PartsOfPaths.java").toAbsolutePath()输出的就是 D:\demo\PartsOfPaths.java
         * 并不是全限定名的类路径了。
         */
        System.setProperty("user.dir", "D:\\demo\\src\\main\\java\\files");
        Path p = Paths.get("PartsOfPaths.java").toAbsolutePath();

        /*
         * PS:path.getName(int index)和path.getNameCount():分层拆分路径,
         * 例如对于/a/b/c,getNameCount()返回的就是3,
         * 而对于path.getName(int index),当index分别为0~2时,
         * 得到的结果分别是 a、b、c。
         */
        for (int i = 0; i < p.getNameCount(); i++) {
            System.out.println(p.getName(i));
        }

        /*
         * PS:endsWith() 并不是用来匹配后缀的,而是用来匹配 Path 的
         * 所以这里是 false
         */
        System.out.println("ends with '.java': " + p.endsWith(".java"));

        /*
         * PS:Path 也实现了 Iterable 接口,因此我们也可以通过增强的 for-each 进行遍历
         * path.startsWith(Path other) 或 path.startsWith(String other):
         * 判断 path 的是不是以 other 开头的。
         * 对于 /a/b/c,不是 start with a,而是 start with "/"
         * 本例的 start with 为 "D:\" ,通过 getRoot() 可以获取
         */
        for (Path pp : p) {
            System.out.print(pp + ": ");
            System.out.print(p.startsWith(pp) + " : ");
            System.out.println(p.endsWith(pp));
        }

        System.out.println("Starts with " + p.getRoot() + " " + p.startsWith(p.getRoot()));
    }
}

输出:

Windows 10
demo
src
main
java
files
PartsOfPaths.java
ends with '.java': false
demo: false : false
src: false : false
main: false : false
java: false : false
files: false : false
PartsOfPaths.java: false : true
Starts with D:\ true

—PS: Path 接口,主要用来在文件系统中定位文件,通常表示系统相关的文件路径。Paths 静态工具类,用来根据String格式的路径或者URI返回Path的实例

1.2 路径分析

Files 工具类包含一系列完整的方法用于获得 Path 相关的信息。

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PathAnalysis {
    static void say(String id, Object result) {
        System.out.println(id + ": " + result);
    }

    public static void main(String[] args) throws IOException {
        System.out.println(System.getProperty("os.name"));
        System.setProperty("user.dir", "D:\\demo\\src\\main\\java\\files");
        Path p = Paths.get("PathAnalysis.java").toAbsolutePath();
        say("Exists", Files.exists(p));
        say("Directory", Files.isDirectory(p));
        say("Executable", Files.isExecutable(p));
        say("Readable", Files.isReadable(p));
        say("RegularFile", Files.isRegularFile(p));
        say("Writable", Files.isWritable(p));
        say("notExists", Files.notExists(p));
        say("Hidden", Files.isHidden(p));
        say("size", Files.size(p));
        say("FileStore", Files.getFileStore(p));
        say("LastModified: ", Files.getLastModifiedTime(p));
        say("Owner", Files.getOwner(p));
        say("ContentType", Files.probeContentType(p));
        say("SymbolicLink", Files.isSymbolicLink(p));
        if (Files.isSymbolicLink(p)) {
            say("SymbolicLink", Files.readSymbolicLink(p));
        }
        
        // 个测试方法 getPosixFilePermissions() 之前我们需要确认一下当前文件系统是否支持 Posix 接口,否则会抛出运行时异常
        if (FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) {
            say("PosixFilePermissions", Files.getPosixFilePermissions(p));
        }
    }
}

输出:

Windows 10
Exists: true
Directory: false
Executable: true
Readable: true
RegularFile: true
Writable: true
notExists: false
Hidden: false
size: 1674
FileStore: 软件 (D:)
LastModified: : 2023-06-14T09:26:50.330762Z
Owner: T (User)
ContentType: null
SymbolicLink: false

推荐一个大佬写的文章:文件操作工具类Files

1.3 Paths的增减修改

我们必须能通过对 Path 对象增加或者删除一部分来构造一个新的 Path 对象。我们使用 relativize() 移除 Path 的根路径,使用 resolve() 添加 Path 的尾路径(不一定是“可发现”的名称)。

2. 目录

Files 工具类包含大部分我们需要的目录操作和文件操作方法。

3. 文件系统

使用静态的 FileSystems 工具类获取"默认"的文件系统,也可以在 Path 对象上调用 getFileSystem() 以获取创建该 Path 的文件系统。你可以获得给定 URI 的文件系统,还可以构建新的文件系统(对于支持它的操作系统)。

import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;

public class FileSystemDemo {
    static void show(String id, Object o) {
        System.out.println(id + ": " + o);
    }

    public static void main(String[] args) {
        System.out.println(System.getProperty("os.name"));
        FileSystem fsys = FileSystems.getDefault();
        for (FileStore fs : fsys.getFileStores()) { // 获取系统盘
            show("File Store", fs);
        }
        for (Path rd : fsys.getRootDirectories()) { // 根目录
            show("Root Directory", rd);
        }
        show("Separator", fsys.getSeparator()); // 分隔符
        // 返回此文件系统的可选操作
        show("UserPrincipalLookupService", fsys.getUserPrincipalLookupService());
        show("isOpen", fsys.isOpen());
        show("isReadOnly", fsys.isReadOnly());
        // 返回创建此文件系统的提供程序
        show("FileSystemProvider", fsys.provider());
        // 返回文件系统支持的文件属性视图名称
        show("File Attribute Views", fsys.supportedFileAttributeViews());
    }
}

输出:

Windows 10
File Store: 系统 (C:)
File Store: 软件 (D:)
Root Directory: C:\
Root Directory: D:\
Separator: \
UserPrincipalLookupService: sun.nio.fs.WindowsFileSystem$LookupService$1@4eec7777
isOpen: true
isReadOnly: false
FileSystemProvider: sun.nio.fs.WindowsFileSystemProvider@3b07d329
File Attribute Views: [owner, dos, acl, basic, user]

4. 路径监听

通过 WatchService 可以设置一个进程对目录中的更改做出响应。在这个例子中,delTxtFiles() 作为一个单独的任务执行,该任务将遍历整个目录并删除以 .txt 结尾的所有文件,WatchService 会对文件删除操作做出反应:

import java.io.IOException;
import java.nio.file.*;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;

public class PathWatcher {
    static Path test = Paths.get("D:\\demo\\src\\test");

    static void delTxtFiles() {
        try {
            Files.walk(test).filter(f -> f.toString().endsWith(".txt"))
                    .forEach(f -> {
                        System.out.println("deleting " + f);
                        try {
                            Files.delete(f);
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    });
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        // PS:在 D:\demo\src\test 下 创建 Hello.txt
        Files.createFile(test.resolve("Hello.txt"));

        // PS:获取一个路径监听
        WatchService watcher = FileSystems.getDefault().newWatchService();

        // PS:将路径监听放在 test 上,监听事件为 delete
        // 可以选择 ENTRY_CREATE,ENTRY_DELETE 或 ENTRY_MODIFY(其中创建 和删除不属于修改)
        test.register(watcher, ENTRY_DELETE);

        // PS:过调用 Executors.newSingleThreadScheduledExecutor() 产生一个 ScheduledExecutorService 对象,
        // 然后调用 schedule() 方法传递所需函数的方法引用,并且设置在运行之前应该等待的时间
        Executors.newSingleThreadScheduledExecutor().schedule(PathWatcher::delTxtFiles, 250, TimeUnit.MILLISECONDS);

        // PS:当目标事件发生时,会返回一个包含 WatchEvent 的 Watchkey 对象。
        // 展示的这三种方法是能对 WatchEvent 执行的全部操作。
        WatchKey key = watcher.take();
        for (WatchEvent evt : key.pollEvents()) {
            System.out.println("evt.context(): " + evt.context() + "\nevt.count(): " + evt.count() + "\nevt.kind(): " + evt.kind());
            // PS:status 为 0:表示正常退出程序,也就是结束当前正在运行中的java虚拟机。
            // status 为 1 或 -1 或 任何其他非零值 :表示非正常退出当前程序。
            // 正常退出 是指如果当前程序还有在执行的任务,则等待所有任务执行完成以后再退出;
            // 非正常退出 是只要时间到了,立刻停止程序运行,不管是否还有任务在执行。
            System.exit(0);
        }

输出:

deleting D:\demo\src\test\Hello.txt
evt.context(): Hello.txt
evt.count(): 1
evt.kind(): ENTRY_DELETE

如果说"监视这个目录",自然会包含整个目录和下面子目录,但实际上 的:只会监视给定的目录,而不是下面的所有内容。如果需要监视整个树目录,必须在整个树的每个子目录上放置一个 Watchservice

5. 文件查找

到目前为止,为了找到文件,我们一直使用相当粗糙的方法,在 path 上调用 toString() ,然后使用 string 操作查看结果。事实证明, java.nio.file 有更好的解决方案:通过在 FileSystem 对象上调用 getPathMatcher() 获得一个 PathMatcher ,然后传入您感兴趣的模式。模式有两个选项: glob 和 regex 。

在这里,我们使用 glob 查找以 .tmp 或 .txt 结尾的所有 Path :

import java.io.IOException;
import java.nio.file.*;

public class Find {
    public static void main(String[] args) throws IOException {
        Path test = Paths.get("D:\\demo\\src\\test");
        Files.createDirectories(test.resolve("dir.tmp"));

        // PS: **/ 表示“当前目录及所有子目录”
        // 单 * 表示“任何东西”,然后是一个点,然后大括号表示正在寻找以 .tmp 或 .txt 结尾的东西
        PathMatcher matcher = FileSystems.getDefault()
                .getPathMatcher("glob:**/*.{tmp,txt}");

        Files.walk(test).filter(matcher::matches)
                .forEach(System.out::println);
    }
}

输出:

D:\demo\src\test\a\1.tmp
D:\demo\src\test\a\2.tmp
D:\demo\src\test\b\3.txt
D:\demo\src\test\b\4.txt
D:\demo\src\test\dir.tmp

—PS:先在 test 目录下面手动创建了几个文件,dir.tmp 是代码运行创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F67S2k2y-1686903589097)(img/161.png)]

6. 文件读写

Files.readAllLines() 一次读取整个文件(因此,“小”文件很有必要),产生一

个 List 。

先在 test 目录下,创建 Cheese.dat 内容为:

// streams/Cheese.dat
Not much of a cheese shop really, is it?
Finest in the district, sir.
And what leads you to that conclusion?
Well, it's so clean.
It's certainly uncontaminated by cheese.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eUIGSuZb-1686903589098)(img/172.png)]

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ListOfLines {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("D:\\demo\\src\\test\\Cheese.dat").toAbsolutePath();
        
        // PS:Files.readAllLines 入参可以是 path 返回一个 list
        Files.readAllLines(path).stream()
                .filter(line -> !line.startsWith("//"))
                .map(line -> line.substring(0, line.length() / 2))
                .forEach(System.out::println);
    }
}

输出:

Not much of a cheese
Finest in the 
And what leads you 
Well, it's
It's certainly uncon

Files.write() 被重载以写入 byte 数组或任何 Iterable 对象(它也有 Charset 选项):

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Random;

public class Writing {
    static Random rand = new Random(47);
    static final int SIZE = 1000;

    public static void main(String[] args) throws IOException {
        byte[] bytes = new byte[SIZE];

        // PS:生成随机字节并将它们放入用户提供的字节数组中。生成的随机字节数等于字节数组的长度
        rand.nextBytes(bytes);

        Path path = Paths.get("D:\\demo\\src\\test\\bytes.dat");

        // PS:Files.write 放入 byte 数组
        Files.write(path, bytes);
        System.out.println("bytes.dat: " + Files.size(path));

        Path path2 = Paths.get("D:\\demo\\src\\test\\Cheese.dat");
        Path path3 = Paths.get("D:\\demo\\src\\test\\Cheese.txt");
        List<String> stringList = Files.readAllLines(path2);

        // PS:Files.write 放入任何 Iterable 对象
        Files.write(path3,stringList);
        System.out.println("Cheese.txt: " + Files.size(path3));
    }
}

输出:

bytes.dat: 1000
Cheese.txt: 199

—PS:运行完代码在 test 下会自动创建 bytes.dat 和 Cheese.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFH3vFJs-1686903589099)(img/173.png)]

如果文件大小有问题怎么办? 比如说:

  1. 文件太大,如果你一次性读完整个文件,你可能会耗尽内存。

  2. 您只需要在文件的中途工作以获得所需的结果,因此读取整个文件会浪费时间。

Files.lines() 方便地将文件转换为行的 Stream :

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ReadLineStream {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("D:\\demo\\src\\test\\Cheese.dat");
        Files.lines(path).skip(2)
                .findFirst()
                .ifPresent(System.out::println);
    }
}

输出:

Finest in the district, sir.

7. 本章小结

虽然本章对文件和目录操作做了相当全面的介绍,但是仍然有没被介绍的类库中的功能——一定要研究 java.nio.file 的 Javadocs,尤其是 java.nio.file.Files 这个类。

Java 7 和 8 对于处理文件和目录的类库做了大量改进。使用文件现在很简单,甚至很有趣,这是你以前永远想不到的。

推荐一篇文章:详解 File、Path、Paths、Files 四个类,Java操作文件不再难

自我学习总结:

  1. Path 表示一个文件或者目录的路径,通过工具类 Paths.get() 获取
  2. Path 实现了 Iterable 接口,可以通过增强 for 循环遍历,里面的元素是全路径的层级
  3. Files 静态工具类,包含了一系列完整的方法用于获得 Path 相关的信息
  4. Path 对象的 relativize() 可以移除根路径,resolve() 可以添加路径,例如在一个目录的 Path 下面加个 test.txt path.resolve(“test.txt”)
  5. 使用静态的 FileSystems 工具类获取"默认"的文件系统,也可以在 Path 对象上调用 getFileSystem() 以获取创建该 Path 的文件系统。
  6. 通过 FileSystems.getDefault().newWatchService() 获取一个路径监听,Path 对象通过 .register(watcher, ENTRY_DELETE) 放置监听,监听事件有 ENTRY_CREATE,ENTRY_DELETE 或 ENTRY_MODIFY
  7. 通过在 FileSystem 对象上调用 getPathMatcher() 获得一个 PathMatcher ,用于文件查找
  8. 通过 Files.readAllLines() 对小文件进行读操作,.stream() 可生成流
  9. Files.lines() 对大文件进行读操作,返回的是个流
  10. Files.write() 可以进行文件写操作,第一个入参为 Path 对象,第二个参数可以是 byte 数组或者 Iterable 对象
  11. 本章关键词 Path Paths Files FileSystems
    在这里插入图片描述
    (图网,侵删)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机APP测试流程规范模板

一、流程图 二、测试周期 9.25-10.5 1、测试资源 测试任务开始前&#xff0c;检查各项测试资源。 1.1、产品功能需求文档 1&#xff09;产品原型图 2&#xff09;产品效果图 3&#xff09;行为统计分析定义文档 4&#xff09;测试设备&#xff08;Android4.1-Android4.…

OWASP 之跨站脚本xss基础技能

OWASP 之跨站脚本xss基础技能 一.XSS概述二.漏洞危害三.XSS漏洞绕过方法1.手工测试XSS步骤2.常见xss3.绕过方法 四.xss防御方法a.CSP内容安全策略b.HttpOnlyc.输入输出检查d.使用防御函数 五.pikachu靶场1.反射型XSS&#xff08;get&#xff09;2.反射型XSS&#xff08;post&am…

PS如何把多张图片拼接到一张?

现在有多张图片如下 &#xff0c;如何拼接成为1张呢&#xff1f; 打开ps&#xff0c;在ps里面点击文件->自动->联系表。 在弹出来的联系表对话框中&#xff0c;点击选取&#xff0c;选择要拼接的图片。 选择好图片之后&#xff0c;设置宽度高度&#xff0c;宽度的话&…

List Label 28.003 2023 Crack

列表和标签 28.003 在 Web 报表设计器中添加新的图表类型&#xff0c;并支持 Embarcadero RAD Studio 11.3。 6月 16&#xff0c; 2023 - 16&#xff1a;38 新版本 特征 .NET 所有可用的 NuGet 包现在都有一个特殊的企业包和 ID&#xff0c;以确保包都来自一个包源&#xff0c;…

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;GeneGPT: Augmenting Large Language Models with Domain …

代码审计——垂直越权详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 垂直越权&#xff0c;也称权限提升&#xff0c;是一种“基于URL的访问控制”设计缺陷引起的漏洞。 由于Web应用程序没有做权…

2023开放原子全球开源峰会——Intel专题探访

浩瀚宇宙&#xff0c;有光&#xff0c;朝着未来之境&#xff1b;万物之始&#xff0c;有道&#xff0c;启示智慧共荣&#xff1b;在多维赋能的时空里&#xff0c;见微知著&#xff0c;开放共享 &#xff0c;包罗万象&#xff1b;在抵达终点的路途中&#xff0c;彼此陪伴&#x…

《Java核心卷1》怎么样?读1,2章草记 | 第12版

文章目录 《Java核心技术卷 一》第一章 概述第二章 Java编程环境 图书推荐 《Java核心技术卷 一》 第一章 概述 前言&#xff1a;本书与一些”0基础入门“的书定位感觉是不太一样的&#xff0c;可能就像书名所说&#xff0c;是”核心技术“叭。书中经常将Java语言与 c 进行对比…

基于Java电子竞技管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

详解c++---红黑二叉树的原理和实现

什么是红黑二叉树树 avl树是通过控制平衡因子来控制二叉搜索树的平衡&#xff0c;当某个节点的平衡因子等于2或者-2的话我们就根据他所在的位置来进行旋转&#xff0c;如果这个节点位于右右的话就对其进行向左旋转&#xff0c;如果这个节点位于左左的话就对其进行向右旋转&…

【Android复习笔记】OkHttp核心原理

使用方法 调用流程 0kHttp请求过程中最少只需要接触OkHttpClient、Request、Call、 Response,但是框架内部进行大量的逻辑处理。 所有的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。 分发器:内部维护队列与线程池,完成请求调配;拦截…

chatgpt赋能python:Python中嵌套列表的访问方法

Python中嵌套列表的访问方法 在Python编程中&#xff0c;嵌套列表是一种很常见的数据类型。它可以存储多个列表&#xff0c;使得数据结构更加复杂灵活。然而&#xff0c;如何访问嵌套列表中的元素呢&#xff1f;本文将详细介绍Python中嵌套列表的访问方法。 嵌套列表的定义 …

ch8_2_CPU的指令周期

1.  指令周期 指令周期是指_ CPU从主存取出一条指令, 分析指令&#xff0c;加上执行这条指令的时间。 1.1指令周期 指令周期&#xff1a; 是指cpu&#xff0c;从内存中取出指令&#xff0c;并且执行一条指令所需要的全部时间。 比如 从内存单元中&#xff0c;取出操作数&…

【备战秋招】每日一题:4月29日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第二题-限行 在线评测链接:P1267 题目内容 塔子哥是一个富有的商人&#xff0c;他在一家大型贸易公司工作。他的公司位于城市的中心区&#xff0c;是一座高耸的摩天大楼。…

代码审计——SSRF详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击&#xff08;SSRF&#xff09;也成为跨站点端口攻击&#xff0c;是由于一些应用在向第三方主机请求资源时提…

Linux 学习记录33(网络编程篇)

Linux 学习记录33(网络编程篇) 本文目录 Linux 学习记录33(网络编程篇)一、阻塞IO二、非阻塞IO三、信号驱动IO四、IO多路复用(重点)1. select (TCP服务器)TCP服务器代码TCP客户端代码 2. poll 一、阻塞IO 1. 最常用&#xff0c;最简单&#xff0c;效率最低的. 2. 创建套接字文…

WPF开发txt阅读器11:自定义控件更改音量语速

文章目录 自定义控件控件调用自定义事件更改音量和语速 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f4…

【Java】Java核心要点总结 65:TreeSet 两种排序

文章目录 1. Comparable 和 Comparator区别比较2. TreeSet有两种实现指定排序规则的方式&#xff1a; 1. Comparable 和 Comparator区别比较 Comparable 是排序接口&#xff0c;若一个类实现了Comparable接口&#xff0c;就意味着“该类支持排序”。Comparator 是比较器&#x…

使用post请求建立长连接实现sse,接收后端主动发来的消息,实现chat-gpt的弹字效果,EventSource的应用

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 最近在做一个chat相关的功能&#xff0c;然后由于接口返回特别特别慢&#xff0c;所以需要搞一个慢慢等待的效果&#xff0c;就是接口一个单词一个单词的返回&#xff0c;然后前端收到一个展示一个&#xff0c…

Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 6 - EXTI外部中断的使用 1、简述 开发板蓝色按键连接PC13管脚&#xff0c;且断开时为高电平&#xff0c;闭合时低电平。我们将pc13设置为中断模式&#xff0c;低电平触发&#xff0c;当按键按下时&#xff0c;触发中…