【JavaEE】_文件与IO

news2024/11/25 18:38:19

目录

 1.文件概述

1.1 文件的概念

1.2 文件的存储

1.3 文件的分类

1.4 目录结构

1.5 文件操作

1.5.1 文件系统操作

1.5.2 文件内容操作

2. Java文件系统操作

2.1 File类所处的包

2.2 构造方法

2.3 方法

2.3.1 与文件路径、文件名有关的方法

2.3.2 文件是否存在与普通文件、目录的判定的方法

2.3.3 文件的创建与删除的方法

2.3.4 目录的创建方法

2.3.5 罗列目录文件的方法

 2.3.6 文件的重命名操作

 3.Java文件内容操作

3.1 FileInputStream  字节流的读操作

3.2  FileOutputStream  字节流的写操作

3.3 Reader  字符流的读操作

3.4 Writer  字符流的写操作

4. 文件操作的应用


 1.文件概述

1.1 文件的概念

狭义文件概念:

平时说的文件一般都是存储在硬盘上的普通文件:形如.txt  .jpg  .mp4  rar等都可认为是普通文件,他们都是在硬盘上存储的;

广义文件概念:

在计算机中文件也可以是一个广义的概念,就不只是包含普通文件,还可以包含目录(目录文件),也就是俗称的文件夹,操作系统中还会使用文件来描述一些其他的硬件设备或软件资源:比如操作系统中将网卡、显示器、键盘等这样的硬件设备也抽象成了一个文件;

当前讨论的文件仍然是针对普通文件;

1.2 文件的存储

普通文件是保存在硬盘上的;

机械硬盘包括磁头与存储数据的介质:盘片,机械硬盘一旦上电,盘片就会高速运转,磁头在盘片上找到对应的数据。

但是由于机械硬盘的机械构造,盘片转速越高,读写速度就越快,但是因为工艺的限制,盘片转速也不可能无限高,机械硬盘的读写速度已经多年停滞不前,而是向大容量方向发展;

故而从硬盘上读取数据就要比从内存读取数据要慢很多,大约是3~4个数量级;

因为flash芯片的使用,固态硬盘的速度就要比机械硬盘高很多;

当前学习中就以机械硬盘为主,即文件数据读取的特点为:存储空间更大,读取速度更慢;

1.3 文件的分类

一般情况下文件主要分为两类:文本文件与二进制文件,两种文件在编程时会存在差异;

文本文件中存储的是字符,二进制文件中存储的是字节;

判断一个文件是文本文件还是二进制文件最简单的方法就是使用记事本打开该文件,如果打开后是乱码则为二进制文件,否则就是文本文件:

日常中使用的.txt  .c  .java都属于文本文件

而.doc  .ppt  .exe  .zip  .class 等都是二进制文件

(word保存的不是一个单纯的文本,而是一个带有各种格式化信息的“富文本”)

1.4 目录结构

计算机中保存管理文件是通过操作系统中的“文件系统“模块”进行管理的,在文件系统中一般是通过“树形”结构来组织磁盘上的目录和文件的,如:

如果是一个普通文件,就是树的叶子结点;

如果是一个目录文件,目录中就可以包含子树,这个目录就是非叶子结点;

在操作系统中,就通过“路径”概念来描述一个具体文件或目录的位置:

(1)绝对路径:以盘符开头,如:E:\JavaEE_FilesAndIO\src\Main.java 就是一个绝对路径;

(2)相对路径:以.或..开头,其中.表示当前路径,..表示当前路径的父目录(上级路径)。

相对路径实现必须有一个基准目录,相对路径就是从基准目录出发,按照一个路径找到对应文件,

例如:以E:\JavaEE_FilesAndIO为基准目录,找到Main.java文件,就可以表示为.\src\Main.java;

E:\Java_String\src目录中也存在一个Main.java文件,如果此时仍以E:\JavaEE_FilesAndIO为基准目录,找到Main.java文件,就需要表示为:..\src\Main.java;

即:.表示基准路径,..表示基准路径的上一级目录

即使定位到同一个文件,如果基准目录不同,此时相对路径也不同;

1.5 文件操作

java中的文件操作主要包括两类:文件系统相关操作与文件内容相关操作;

1.5.1 文件系统操作

文件系统操作指的是通过“文件资源管理器”能够完成的一些功能,如:

① 列出目录下的文件 ② 创建文件 ③ 创建目录 ④ 删除目录 ⑤ 重命名文件等等;

Java提供了一个File类来完成上述操作,这个File类描述了一个文件或目录,基于这个对象就可以实现上面的功能;

1.5.2 文件内容操作

类似于C语言的文件操作,即:

① 打开文件 ② 读文件  ③ 写文件  ④ 关闭文件

Java提供了一组类来实现对文件内容的操作:

(1)按照文件内容,分为两个系列:

字节流对象(针对二进制文件,以字节为单位进行读写)与字符流对象(针对文本文件,以字符为单位进行读写);

(2)

以下内容将对于java文件的系统操作与内容操作分别进行阐述:

2. Java文件系统操作

2.1 File类所处的包

import java.io.File;

2.2 构造方法

//绝对路径
File f1= new File("E:/JavaEE_FilesAndIO:/file2.txt");
//相对路径:基准路径取决于运行java程序的方式
File f2= new File("./file3.txt");

运行java程序的方式:

(1)命令行方式(java Demo1),此时执行命令所在的目录就是基准路径,实际不考虑该情况;

(2)IDEA方式,此时基准路径就是当前java项目所在路径,如此时的项目所在位置为:

(3)如果将一个java程序达成war包置于tomcat上运行,此时基准路径就是tomcat的bin目录;

如果路径指定错了,很容易出现找不到文件的情况;

2.3 方法

2.3.1 与文件路径、文件名有关的方法

//绝对路径
File f1= new File("E:/file2.txt");
System.out.println(f1.getParent());   //获取父目录
System.out.println(f1.getName());     //获取文件名
System.out.println(f1.getPath());     //获取文件路径(构造File时指定的路径)
System.out.println(f1.getAbsolutePath());//获取绝对路径
System.out.println(f1.getCanonicalPath());// 获取绝对路径

System.out.println("-----------------------------");

//相对路径:基准路径取决于运行java程序的方式

File f2= new File("./file3.txt");
System.out.println(f2.getParent());   //获取父目录
System.out.println(f2.getName());     //获取文件名
System.out.println(f2.getPath());     //获取文件路径(构造File时指定的路径)
System.out.println(f2.getAbsolutePath());//获取绝对路径
System.out.println(f2.getCanonicalPath());// 获取绝对路径

输出结果为:

注:"/" 读作斜杠, "\"读作反斜杠;

File类中pathSeparator属性就是相邻路径之间的分隔符,一般情况下,大部分操作系统上路径的分隔符都是斜杠,而Windows默认使用的是反斜杠,但斜杠与反斜杠都可被系统识别;

2.3.2 文件是否存在与普通文件、目录的判定的方法

基于当前项目路径下包含的目录与文件如下:

 试运行以下代码:

        File f= new File("./file1.txt");
        System.out.println(f.exists());   //文件是否存在
        System.out.println(f.isDirectory()); //文件是否为目录
        System.out.println(f.isFile());   // 文件是否是一个普通文件

输出结果为:

2.3.3 文件的创建与删除的方法

        File f = new File("./file2.txt");
        System.out.println(f.exists());
        System.out.println("The file is absent,create a file now.");
        f.createNewFile();
        System.out.println("Finish creating a file.");
        System.out.println(f.exists());
        f.delete();
        System.out.println("Finish deleting the file");
        System.out.println(f.exists());

输出结果为:

注:java还提供了一个deleteOnExit()的方法进行程序退出后再删除,使用较少;

2.3.4 目录的创建方法

(1)单个目录:

        File f = new File("./aaa");
        f.mkdir();    //创建目录
        System.out.println(f.isDirectory());   //判断是否为目录

 输出结果为:

(2)多级目录:

        File f = new File("./aaa/bbb/ccc/ddd");
        f.mkdirs();    //创建多级目录
        System.out.println(f.isDirectory());   //判断是否为目录

 输出结果为:

可从左侧Project栏查看对应目录与文件: 

2.3.5 罗列目录文件的方法

        File f = new File("./");
        System.out.println(Arrays.toString(f.list()));   //返回字符串数组
        System.out.println(Arrays.toString(f.listFiles()));   //返回File数组

 输出结果为:

 2.3.6 文件的重命名操作

        File f1 = new File("./aaa");
        File f2 = new File("./zzz");
        f1.renameTo(f2);  //将aaa改名为zzz

可从左侧Project栏查看对应目录与文件: 

 3.Java文件内容操作

3.1 FileInputStream  字节流的读操作

 

 read提供了三个版本的重载:

① 无参:一次读一个字节;

② 一参:一次读若干个字节,将读到的结果存入参数数组中,返回值是读到的字节数;

③ 三参:一次读若干个字节,将读到的结果存入参数数组中,返回值是读到的字节数,可指定元素放置数组的位置下标off以及最多能放多少个元素len

 (字符流也有类似的设定,为了方便char类型的读取,选择了int而非short)

基于E:\JavaEE_FilesAndIO路径下file1.txt文件内存有abcdef,试运行:

代码示例1:一次读取一个字节:

        //方法中需要指定打开文件的路径(绝对路径、相对路径或File对象)
        try {
            //创建对象,同时也打开文件
            InputStream inputStream = new FileInputStream("./file1.txt");
            //尝试按照字节进行读取
            while(true) {
                int b = inputStream.read();
                if (b == -1) {
                    //读到了文件末尾
                    break;
                }
                System.out.println(b);
            }
            //关闭文件并释放资源
            inputStream.close();
        }catch(FileNotFoundException e) {
            //FileNotFoundException是IOException的一个子类,故而可以进行合并
            e.printStackTrace();
        }catch(IOException e){
            //读操作可能发生的异常:IO操作失败的可能性是非常大的
            e.printStackTrace();
        }

 输出结果为:

 这些数字就是每个字符的ASCII码值(英文字符本身就是一个字节)

代码改进1:

但是这种编写方式会导致:如果文件不存在抛出异常时会跳过关闭文件,导致释放资源失败,故而需要将close方法置于finally中,修改代码如下:

        //方法中需要指定打开文件的路径(绝对路径、相对路径或File对象)
        InputStream inputStream = null;
        try {
            //创建对象,同时也打开文件
            inputStream = new FileInputStream("./file1.txt");
            //尝试按照字节进行读取
            while(true) {
                int b = inputStream.read();
                if (b == -1) {
                    //读到了文件末尾
                    break;
                }
                System.out.println(b);
            }
        }catch(FileNotFoundException e) {
            //FileNotFoundException是IOException的一个子类,故而可以进行合并
            e.printStackTrace();
        }catch(IOException e){
            //读操作可能发生的异常:IO操作失败的可能性是非常大的
            e.printStackTrace();
        }finally{
            try {
                //关闭文件并释放资源
                inputStream.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }

代码改进2:

但是这样的编写方式是非常麻烦的,java中提供了一个语法:try with resources:

try(InputStream inputStream = new FileInputStream("./file1.txt")){
            while(true){
                int b = inputStream.read();
                if(b == -1){
                    break;
                }
                System.out.println(b);
            }
        }catch(IOException e){
            e.printStackTrace();
        }

 以上代码中没有显式手动调用close,但是try会帮我们自动调用:

当代码执行完这里的try语句块之后,就会自动调用close;

注:需要实现Closeable interface才能置于try()中,所有的流对象都实现了Closeable

代码示例2:一次读取若干个字节:

        try(InputStream inputStream = new FileInputStream("./file1.txt")){
            //一次读取若干个字节
            while(true){
         //将读出的结果置于buffer数组中,相当于用参数表示方法返回值,这种方法称为输出型参数
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                if(len == -1){
                    break;
                }
                for(int i=0;i<len;i++){
                    System.out.println(buffer[i]);
                }
            }
        }catch(IOException e){
            e.printStackTrace();
        }

实际使用中这样的读取方式才是常见且高效的;

3.2  FileOutputStream  字节流的写操作

现将E:\JavaEE_FilesAndIO路径下file1.txt文件原存内容全部清空,试运行:

代码示例1:一次写入一个字节:

        try(OutputStream outputStream = new FileOutputStream("./file1.txt")){
            outputStream.write('a');
            outputStream.write(98);
            outputStream.write(99);
        }catch(IOException e){
            e.printStackTrace();
        }

打开对应文件:

代码示例2:一次写入多个字节:

        try(OutputStream outputStream = new FileOutputStream("./file1.txt")){
            byte[] buffer = new byte[]{97,98,99};
            outputStream.write(buffer);
        }catch(IOException e){
            e.printStackTrace();
        }

打开对应文件:

注:每次按照“写”方式打开文件,都会清空文件原有内容,再从起始位置往后写

故而也存在追加写的流对象,打开之后不清空,继上次文件内容后继续往后写;

3.3 Reader  字符流的读操作

基于对应文件中存储有“abc”的file1.txt文件,试运行如下代码:

        try(Reader reader = new FileReader("./file1.txt")){
            //按照字符读
            while(true){
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if(len == -1)
                    break;
                //如果传入的是byte数组,还可以手动指定utf8字符集避免乱码
                String s =new String(buffer,0,len);
                System.out.println(s);
            }
        }catch(IOException e){
            e.printStackTrace();
        }

输出结果为:

3.4 Writer  字符流的写操作

试运行以下代码:

        try(Writer writer  = new FileWriter("./file1.txt")){
            writer.write("xyz");
        }catch(IOException e){
            e.printStackTrace();
        }

打开对应文件:

注:与FileOutputStream类似,每次读文件时文件原有内容会被清空;

4. 文件操作的应用

例1:扫描指定目录并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件:

实现思路:

输入目录——>输入要删除的文件名——>询问是否要删除文件;

代码如下:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

//例1: 扫描到指定目录,并找到名称中含有指定字符的所有普通文件,并且后续询问是否要删除该文件
public class Demo5{
    public static void main(String[] args) {
        System.out.println("请输入要扫描的路径:");
        Scanner scanner = new Scanner(System.in);
        String rootDirPath = scanner.next();
        System.out.println("请输入要删除的文件:");
        String toDeleteName = scanner.next();
        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()){
            System.out.println("输入的扫描路径有误!");
        }
        scanDir(rootDir,toDeleteName);
    }
    public static void scanDir(File rootDir,String toDeleteName){
        File[] files = rootDir.listFiles();
        if(files == null){
            System.out.println("目录为空!");
            return;
        }
        for(File f:files){
            if(f.isFile()){
                if(f.getName().contains(toDeleteName)){
                 //只要文件名含有关键字即可,不要求完全相同
                    deleteFile(f);
                }
            }
            else if(f.isDirectory()){
                scanDir(f, toDeleteName);
            }
        }
    }
    public static void deleteFile(File f){
        try {
            System.out.print(f.getCanonicalPath() + "  ");
            System.out.println("是否要删除该文件?(Y / N)");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if (choice.equals("Y")|| choice.equals("y")) {
                f.delete();
                System.out.println("文件删除成功!");
            } else {
                System.out.println("文件删除取消!");
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

原路径下目录及文件如下:

试运行后,输出结果为:

 根据路径查找对应文件:

例2:进行普通文件的复制

实现思路:

指定一个被复制的原文件路径与一个复制之后生成的目标文件路径。打开原路径文件读取内容后写入到目标文件;

代码如下:

import java.io.*;
import java.util.Scanner;

public class Demo6{
    public static void main(String[] args) {
        //1. 输入原路径与目标路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的原文件:");
        String src = scanner.next();
        System.out.println("请输入要拷贝的目标文件:");
        String dest = scanner.next();
        File srcFile = new File(src);
        if(!srcFile.isFile()){
            System.out.println("输入的原路径有误!");
            return;
        }
        //无需检查目标文件是否存在,OutputStream写文件时会自动创建不存在的文件
        //2. 拷贝:读取原文件拷贝到目标文件
        try(InputStream inputStream = new FileInputStream(src)){
            try(OutputStream outputStream = new FileOutputStream(dest)){
                //将inputStream中的内容读取出来放到outputStream中
                byte[] buffer = new byte[1024];
                while(true){
                    int len = inputStream.read(buffer);
                    if(len==-1){
                        //读取结束
                        break;
                    }
                    //buffer中可能只有一部分是有效数据,不能全部写入
                    outputStream.write(buffer,0,len);
                }
            }

        }catch(IOException e){
            e.printStackTrace();
        }

    }
}

试运行:

查看对应路径文件内容:

 

例3:扫描指定目录,并找到名称或内容中包含指定字符的所有普通文件:

代码如下:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

public class Demo7{
    public static void main(String[] args) throws IOException {
        //1.输入要扫描的路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        String rootDirPath = scanner.next();
        System.out.println("请输入要查找的关键词:");
        String word = scanner.next();
        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()){
            System.out.println("输入的路径非法!");
            return;
        }
        //2.递归进行遍历
        scanDir(rootDir, word);
    }
    public static void scanDir(File rootDir,String word) throws IOException {
        //1.先列出rootDir中的内容
        File[] files = rootDir.listFiles();
        if(files == null){
            return;
        }
        //2.遍历每个元素,针对普通文件和目录文件分别进行处理
        for(File f:files){
            if(f.isFile()){
                //针对普通文件进行关键词查找
                if(containsWord(f, word)){
                    System.out.println(f.getCanonicalPath());
                }
            }
            else if(f.isDirectory()){
                scanDir(f, word);
            }
        }
    }
    public static boolean containsWord(File f,String word){
        //将f中的内容都读出来放在一个StringBuilder中
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)){
            char[] buffer = new char[1024];
            while(true){
                int len = reader.read(buffer);
                if(len == -1){
                    break;
                }
                //将此处的结果放置到StringBuilder中去
                stringBuilder.append(buffer, 0, len);

            }
        }catch(IOException e){
            e.printStackTrace();
        }
        //indexOf返回的是子串的下标,如果word在stringBuilder中不存在就返回-1
        return stringBuilder.indexOf(word)!=-1;
    }
}

原路径下目录及文件内容如下:

 试运行后,输出结果为:

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

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

相关文章

c++之function和bind详解-SurfaceFlinger学习必备语法基础

背景 C中的function和bind是为了更方便地进行函数对象的封装和调用而设计的&#xff0c;在SurfaceFlinger源码中也是有很多使用部分。 比如分析Vsync相关源码时候有相关回调时候 可以看到这里的mRegistration就有个参数是 std::bind,怎么这里就可以进行回调呢&#xff1f; 所…

代码随想录 Leetcode860. 柠檬水找零

题目&#xff1a; 代码(首刷自解 2024年2月15日&#xff09;&#xff1a; class Solution { public:bool lemonadeChange(vector<int>& bills) {vector<int> leftchange(2,0);//leftchange[0]代表5元数量&#xff0c;1代表10for (int i 0; i < bills.size…

最小生成树(Kruskal算法及相关例题)

1.Kruskal算法概念以及基本思路 &#xff08;1&#xff09;概念&#xff1a; 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。它的时间复杂度为O&#xff08;ElogE&#xff09;(E是图G的边的总数)&#xff0c;适合于求边稀疏的网的最小生成树 。 其基本思想是&#xff…

OS文件管理

文件管理 文件的属性 文件所包含的属性&#xff1a; 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件。标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#…

2.12:C语言测试题

1.段错误&#xff1a;申请堆区内存未返回&#xff0c;str指向NULL 2.段错误&#xff1a;局部变量&#xff0c;本函数结束&#xff0c;p也释放 3.越界访问&#xff0c;可能正常输出hello&#xff0c;可能报错 4.可能段错误&#xff0c;释放后&#xff0c;str未指向NULL&#x…

CentOS7.9+Kubernetes1.29.2+Docker25.0.3高可用集群二进制部署

CentOS7.9Kubernetes1.29.2Docker25.0.3高可用集群二进制部署 Kubernetes高可用集群&#xff08;Kubernetes1.29.2Docker25.0.3&#xff09;二进制部署二进制软件部署flannel v0.22.3网络&#xff0c;使用的etcd是版本3&#xff0c;与之前使用版本2不同。查看官方文档进行了解…

The method toList() is undefined for the type Stream

The method toList() is undefined for the type Stream &#xff08;JDK16&#xff09; default List<T> toList() { return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray()))); }

C语言strstr函数

简介 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是&#xff0c;则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串&#xff1b;否则&#xff0c;返回NULL。 实验 #include "stdio.h" #include "string.h"c…

2.14:二维数组、非函数实现strcat、strcmp、strcpy、strlen

1.编程实现二维数组的杨辉三角 程序代码&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 int main(int argc, const char *argv[])5 {6 int n;7 printf("please enter n:");8 scanf("%d",&…

2024/02/13

21 、C 22 、D 23、B 如果5先出栈那么1&#xff0c;2&#xff0c;3&#xff0c;4就已经入栈了&#xff0c;5出后4出&#xff0c;1要出栈必须先让3&#xff0c;2出栈&#xff0c;所以 不可能输出B 24、10&#xff0c;12&#xff0c;120 25、2&#xff0c;5 26、段错…

2024.02.12作业

1. 段错误 2. 段错误 3. hello 4. world 5. int a; int* a; int **a; int a[10]; int* a[10]; int(* a)[10]; int* a(int); int (*a[10])(int); 6. 6&#xff1b; 2&#xff1b; 2 7. 2 8. 2 9. b 10. a 11. a 12. c 13. b 14. c 15. a 16. c 17. b 18. a 19…

消息中间件特点

1.  消息中间件概念 消息中间件是消息传递的过程中保存消息的容器。 主要目的&#xff1a;提供路由并保证消息的传递&#xff1b;如果发送消息时接受者不可用&#xff0c;消息队列会保留信息&#xff0c;直到可以成功传递为止。 消息中间件保存消息也是有期限的。 2.  消息…

JVM工作原理与实战(三十八):JIT即时编译器原理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JIT即时编译器 二、HotSpot中的JIT编译器 三、JIT优化技术 1.方法内联 2.逃逸分析 四、JIT优化建议 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节…

[计算机网络]---序列化和反序列化

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、再谈协议…

《VulnHub》GoldenEye:1

title: 《VulnHub》GoldenEye&#xff1a;1 date: 2024-02-16 14:53:49 updated: 2024-02-16 15:08:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务&#xff08;pop3&#xff09;、邮件泄露敏…

成考怎么搜题答案?9个受欢迎的搜题分享了 #微信#职场发展

大学生应该养成良好的时间管理习惯&#xff0c;合理分配学习、休息和娱乐的时间&#xff0c;避免压力过大或时间浪费。 1.Forest专注森林 Forest是一款专注与时间管理应用。当你需要专注于学习或工作时&#xff0c;你可以在Forest应用中种植一棵虚拟树&#xff0c;设定一段时…

幻兽帕鲁——游戏优化【腾讯云服务器联机版本】

幻兽帕鲁8人以内联机&#xff0c;闭眼参加【腾讯云幻兽帕鲁专属游戏活动】4核16G12兆 购买腾讯云服务器后&#xff0c;游戏一键部署&#xff0c;联机流程参照这个博文 【10秒开服】雾锁王国全自动部署教程-CSDN博客 幻兽帕鲁——游戏优化 1.设置虚拟内存 第一步&#xff1a…

selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘

Selenium更新到 4.x版本后&#xff0c;以前的一些常用的代码的语法发生了改变 from selenium import webdriver browser webdriver.Chrome() browser.get(https://www.baidu.com) input browser.find_element_by_id(By.ID,kw) input.send_keys(Python)目标&#xff1a;希望通…

阿里云“BGP(多线)”和“BGP(多线)_精品”区别价格对比

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

Linux:docker搭建redis集群(3主3从扩容缩容 哈希槽分配)

操作系统&#xff1a;centos7 docker-ce版本&#xff1a;24.0.7 1.准备redis镜像 我这里使用redis 6.0.8 镜像进行操作&#xff0c;如果你也需要镜像&#xff0c;在网络正常情况下直接使用 docker pull redis:6.0.8 即可进行下载&#xff0c;如果你没配置国内加速器&#x…