Java进阶-IO(4)

前面几篇介绍了java IO的基础部分,现在进入核心内容的学习,如File类、动态读取和序列化等,如下。
在这里插入图片描述

一、File类

1、概述

是 java.io 包中唯一代表磁盘文件本身的对象(可以通过 File 类操作文件和目录),定义了一些操作文件的方法,如新建、删除、重命名文件和目录等。

File 类不能访问文件内容本身(访问要使用输入/输出流)

2、构造方法(重载–3个)

构造方法用于创建对象(实例化)

File(String path):如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文件。
File(String path, String name):path 是路径名(目录),name 是文件名。
File(File dir, String name):dir 是路径对象(目录),name 是文件名。

3、File类常用方法

不用死记,可通过查看API文档来获取文件属性

1)常用汇总

canRead()    测试程序是否能从指定的文件中读取
canWrite()    测试程序是否能写当前文件
delete()    删除指定的文件
exists()    测试当前 File 是否存在
getAbsolutePath()    返回文件的绝对路径名
getName()    返回对象的文件名或路径名(如果是路径,则返回最后一级子路径名)
getParent()    返回当前 File 对象所对应目录(最后一级子目录)的父目录名
isAbsolute()    测试文件是否为一个绝对路径名。
isDirectory()    测试文件是否为一个路径(目录)
isFile()    测试文件是否为一个“普通”文件
lastModified()    返回文件最后修改的时间
length()    返回文件长度
list()    返回指定的路径文件列表
list(FilenameFilter)    返回指定的目录中满足指定过滤器的文件列表
mkdir()    创建一个目录,它的路径名由当前 File 对象指定
mkdirs()    创建一个目录(多级目录),它的路径名由当前 File 对象指定
renameTo(File)    将文件更名为给定参数 File 指定的路径名

2)说明
创建&&删除文件

创建:createNewFile()
删除:delete()
注:在创建或删除前都先用exists()方法判断文件是否存在

创建&&删除目录

创建:mkdir() 
注:创建多级目录(即目录中还包含目录),用mkdirs
删除:delete()
注:在创建或删除前都先用exists()方法判断目录是否存在

遍历目录(list方法–重载)

String[] list():返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。(list() 方法返回的数组中仅包含文件名称,而不包含路径)
String[] list(FilenameFilter filter):返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则接受所有名称。

带过滤器参数的 list() 方法(当希望只列出目录下的某些文件,就需要调用)

首先创建文件过滤器,该过滤器必须实现 java.io.FilenameFilter 接口。
在 accept() 方法中指定允许的文件类型。

4、示例

1)获取文件属性

import java.io.File; // 导包
import java.util.Date;
//获取文件属性
public class FlieDemo {
    public static void main(String[] args){
        String path="D:\\Ultimate JavaCode\\src\\test6"; // 文件路径
        File f=new File(path,"date1_24.txt"); // File(String path, String name)构造方法实例化File对象
        System.out.println("D:\\Ultimate JavaCode\\src\\test6\\date1_24.txt文件信息如下:");
        System.out.println("============================================"); //以下通过实例化对象f调用Flie类常用方法
        System.out.println("文件名称:"+f.getName());
        System.out.println("文件路径:"+f.getPath());
        System.out.println("绝对路径:"+f.getAbsoluteFile());
        System.out.println("文件长度:"+f.length()+"字节");
        System.out.println("文件或者目录:"+(f.isFile()?"是文件":"不是文件"));//三元表达式(boolean x?x=true时执行该部分:x=false时执行该部分)
        System.out.println("文件或者目录:" + (f.isDirectory() ? "是目录" : "不是目录"));
        System.out.println("是否可读:"+(f.canRead()?"可读取":"不可读取"));
        System.out.println("是否可写:"+(f.canWrite()?"可写入":"不可写入"));
        System.out.println("是否隐藏:"+(f.isHidden()?"是隐藏文件":"不是隐藏文件"));
        System.out.println("最后修改日期:"+new Date(f.lastModified())); // 实例化日期对象
    }
}

运行结果

D:\Ultimate JavaCode\src\test6\date1_24.txt文件信息如下:
============================================
文件名称:date1_24.txt
文件路径:D:\Ultimate JavaCode\src\test6\date1_24.txt
绝对路径:D:\Ultimate JavaCode\src\test6\date1_24.txt
文件长度:72字节
文件或者目录:是文件
文件或者目录:不是目录
是否可读:可读取
是否可写:可写入
是否隐藏:不是隐藏文件
最后修改日期:Tue Jan 24 11:33:48 CST 2023

2)在 D:\Ultimate JavaCode\src\test6下创建一个 date1_24_1.txt 文件,程序启动时会检测该文件是否存在,如果不存在则创建;如果存在则删除再创建。

import java.io.File; //导包
import java.io.IOException;

public class FileDemo1 {
    public static void main(String[] args) throws IOException { // 抛出IO异常
        String path="D:\\Ultimate JavaCode\\src\\test6"; // 文件路径
        File f1=new File(path,"date1_24_1.txt"); // File(String path, String name)构造方法实例化File对象
        if(f1.exists()){ // 判断文件是否存在
            f1.delete(); // 存在先删除
        }
        f1.createNewFile(); // 再创建
    }
}

优化:不同操作系统路径的分隔符是不同的。Windows 中用反斜杠\表示目录的分隔符,Linux 则用正斜杠/,

在操作文件时一定要使用 File.separator 表示分隔符(使用符合本地操作系统要求的分隔符),养成良好的开发习惯。

import java.io.File; //导包
import java.io.IOException;

public class FileDemo1 {
    public static void main(String[] args) throws IOException { // 抛出IO异常
        String path="D:\\Ultimate JavaCode\\src\\test6"+File.separator+"date1_24_1.txt"; // 文件路径,用 File.separator
        File f1=new File(path); // File(String path)构造方法实例化File对象
        if(f1.exists()){ // 判断文件是否存在
            f1.delete(); // 存在先删除
        }
        f1.createNewFile(); // 再创建
    }
}

3)编写程序判断D盘根目录下是否存在Date1_24目录,若存在则先删除再创建。

import java.io.File; //导包

public class FileDemo2 {
    public static void main(String[] args){
        String path="D:/Date1_24/"; // 指定目录位置
        File f=new File(path); // File(String path)构造方法创建File对象
        if (f.exists()){
            f.delete();
        }
        f.mkdir(); // 创建目录
    }
}
// 结果:会发现D盘下多了一个Date1_24的空文件夹

4)使用 list()方法遍历D盘根目录下的所有文件和目录,并显示文件或目录名称、类型及大小。

import java.io.File; //导包

public class FileDemo3 {
    public static void main(String[] args){
         File f=new File("D:/"); // File(String path)构造方法创建File对象
         System.out.println("文件名称\t\t文件类型\t\t文件大小");
         System.out.println("===================================================");
         String fileList[]=f.list(); // 调用不带参数的list()方法,返回一个数组
         for(int i=0;i<fileList.length;i++){ // 遍历返回的字符数组
             System.out.print(fileList[i]+"\t\t");
             //三元表达式对文件类型归类(文件或文件夹)
             System.out.print((new File("D:/",fileList[i])).isFile()?"文件"+"\t\t":"文件夹"+"\t\t");
             System.out.println((new File("D:/",fileList[i])).length()+"字节");
             //由于 list() 方法返回的字符数组中仅包含文件名称,要获取文件类型和大小,必须先转换为 File 对象再调用其方法。
         }
    }
}

运行结果(展示部分)

文件名称        文件类型        文件大小
===================================================
$RECYCLE.BIN        文件夹        0字节
360downloads        文件夹        4096字节
360RecycleBin        文件夹        4096字节
360安全浏览器下载        文件夹        0字节
Anaconda        文件夹        24576字节
Android        文件夹        0字节
apache-tomcat-8.5.83        文件夹        4096字节
BaiduNetdiskDownload        文件夹        0字节
centbrowser_4.3.9.248        文件夹        0字节
Date1_24        文件夹        0字节
Dev-Cpp        文件夹        4096字节
HBuilderX.3.3.11.20220209        文件夹        0字节
ideaIU-2021.3.3.win        文件夹        4096字节
Maven        文件夹        0字节
Microsoft Visio        文件夹        0字节
MSOCache        文件夹        0字节
mydrivers        文件夹        0字节
mysql        文件夹        4096字节
Node.js        文件夹        4096字节

注:由于 list() 方法返回的字符数组中仅包含文件名称,要获取文件类型和大小,必须先转换为 File 对象再调用其方法。

5)带过滤器参数的 list() 方法示例(自行实现)

public class ImageFilter implements FilenameFilter {
    // 实现 FilenameFilter 接口
    @Override
    public boolean accept(File dir, String name) {
        // 指定允许的文件类型
        return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");
    }
}

其他代码与4)中相同。

二、动态读取文件内容

所谓动态读取,就是从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。

1、RandomAccessFile 类

1.1 概述

是 Java 输入/输出流体系中功能最丰富的文件内容访问类,提供了众多方法访问文件内容,既可以读取文件内容,也可以向文件输出数据。

RandomAccessFile 可以从任意位置访问文件,在只需要访问文件部分内容的情况下,可以使用 RandonAccessFile 类。

RandomAccessFile 对象包含了一个记录指针,用以标识当前读写处的位置。当程序新创建一个 RandomAccessFile 对象时,指针位于文件头(也就是 0 处),当读/写了 n 个字节后,文件记录指针将会向后移动 n 个字节。除此之外,RandonAccessFile 可以自由移动该记录指针,既可以向前移动,也可以向后移动。

1.2 RandomAccessFile 类的构造方法(重载)

构造方法用来创建对象(实例化)

RandomAccessFile(File file, String mode):访问参数 file 指定的文件,访问形式由参数 mode 指定,mode 参数有两个常用的可选值 r 和 rw( r 表示只读,rw 表示读写)
RandomAccessFile(String name, String mode):访问参数 name 指定的文件,mode含义同上。
1.3 RandomAccessFile 类的常用方法

会用一些常用的就行

boolean readBoolean()    从文件中读取一个 booleanbyte readByte()    从文件中读取一个带符号位的字节
char readChar()    从文件中读取一个字符
int readlnt()    从文件中读取一个带符号位的整数
long readLong()    从文件中读取一个带符号位的 longString readLine()    从文件中读取下一行文本
void seek(long pos)    指定从文件起始位置开始的指针偏移量
void writeBoolean(boolean v)    以字节的形式向文件中写入一个 booleanvoid writeByte(int v)    以单字节的形式向文件中写入一个 bytevoid writeChar(int v)    以双字节的形式向文件中写入一个 charvoid writelnt(int v)4字节的形式向文件中写入一个整数
writeLong(long v)8字节的形式向文件中写入一个 longvoid writeBytes(String s)    以字节序列的形式向文件中写入一个字符串
void skipBytes(int n)    以当前文件指针位置为起始点,跳过 n 字节
1.4 示例

使用 RandomAccessFileDemo 类创建一个 weather.txt 文件,然后写入一个长中文字符串,再从第 6 个字节开始读取并输出

import java.io.File; // 导包
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo {
    public static void main(String[] args) throws IOException { // 抛出异常
        // 先创建一个空的“weather.txt“文件
        File file=new File("D:\\Ultimate JavaCode\\src\\test6\\weather.txt");//指定文件路径
        if(file.exists()){ // 判断文件是否存在
            file.delete();
            file.createNewFile(); // 创建文件
        }
        file.createNewFile();

        // 再创建RandomAccessFile对象并写入字符串
        RandomAccessFile rf=new RandomAccessFile(file,"rw"); // rw表示读写
        String str1="晴天,阴天,多云,小雨,大风,中雨,小雪,雷阵雨"; // 要写入的字符串
        // 编码转换,防止乱码
        String str2=new String(str1.getBytes("GBK"),"ISO_8859_1");
        rf.writeBytes(str2); // 写入文件

        // 最后从第 6 个字节开始读取并输出
        System.out.println("当前文件指针的位置:"+rf.getFilePointer());
        rf.seek(6); // 设置指针偏移量为6,即移动6个字节
        System.out.println("从文件头跳过6个字节后,文件的内容如下:");
        // 定义一个长度为2的byte数组,进行内容的循环读取
        byte[] b=new byte[2];
        int len=0;
        while ((len=rf.read(b,0,2))!=-1){
            System.out.print(new String(b,0,len));
        }
        rf.close(); // 关闭文件,释放资源
    }
}

三、转换流

1)概述
用于字节流和字符流之间的转换,有两种

InputStreamReader
将字节的输入流按指定字符集转换为字符的输入流。即将InputStream转换为Reader(编码:字节---->字符)

OutputStreamWriter
将字符输出流按指定字符集转换为字节输出流。即将Writer转换为OutputStream(解码:字符---->字节)

2)说明

当文件中含有中文英文数字时,使用字节流将文件内容在内存中显示,英文和数字显示正常,而中文却却显示乱码。这时可以使用转换流将其转化为字符流显示在内存中。

3)何时使用

1.当字节和字符之间有转换动作时;
2.流操作的数据需要编码或解码时;
- 编码:字节/字节数组---->字符/字符数组
- 解码:字符/字符数组---->字节/字节数组

转换流作用:提供字节流与字符流之间的转换,通常使用转换流来处理文件乱码问题,实现编码和解码的功能。

四、序列化

1、对象序列化流(ObjectOutputStream)

1.1 概述

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来完成对象的持久存储。 如果流是网络套接字流,则可以在另一个主机或另一个进程中重新构建对象。

1.2 构造方法
objectOutputStream(OutputStream out):创建一个写入指定的OutputStreamObjectOutputStream
1.3 序列化对象的方法
void writeObject(Object obj):将指定的对象写入ObjectOutputStream

注:

一个对象要想被序列化,该对象所属的类必须实现Serializable接口

Serializable是一个标记接口,实现该接口,不需要重写任何方法

1.4 示例

1)创建一个学生类

import java.io.Serializable;

public class Student implements Serializable { // 创建一个学生类
    private String name; // 封装成员变量
    private int age;

    public Student() { // 无参构造方法
    }
    public Student(String name, int age) { // 带全部参数的构造方法
        this.name = name;
        this.age = age;
    }
    // 提供get()和set()方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

2)使用序列化流

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
// NotSerializableException:当实例需要具有Serializable接口时抛出。 序列化运行时或实例的类可以抛出此异常。
// 一个对象要想被序列化,该对象所属的类必须实现Serializable接口,否则会报NotSerializableException错误
public class ObjectOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        // 创建序列化流对象
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\Ultimate JavaCode\\src\\test8\\oos.txt"));
        // 创建学生对象
        Student s=new Student("林青霞",20);
        oos.writeObject(s); // 调用writeObject()方法将对象写入序列化流
        // 释放资源
        oos.close();
    }
}
// result:打开文件发现存在乱码问题,因此需要使用反序列化流转换才能读懂

2、对象反序列化流

2.1 说明
ObjectInputStream
- ObjectInputStream反序列化前先使用ObjectOutputStream编写的原始数据和对象

构造方法
ObjectInputStream(InputStream in)
- 创建从指定的InputStream读取的ObjectInputStream

反序列化对象的方法
Object readObject()
-ObjectInputStream读取一个对象
2.2 示例
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 创建反序列化流对象
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\Ultimate JavaCode\\src\\test8\\oos.txt"));
        // 调用readObject()方法将对象读入反序列化流
        Object obj = ois.readObject();
        Student s=(Student) obj; // 大转小强转,向下转型
        System.out.println(s.getName()+","+s.getAge());
        //释放资源
        ois.close();
    }
}
// result(经过对象反序列化后输出不会再乱码)
// 林青霞,20

3、java序列化小结

  • 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,即对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。整个过程都是 Java 虚拟机(JVM)独立的,说明在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象
  • 类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。

五、Properties类

1、概述

Properties类是一个Map体系的集合类,父类是Hashtable。Properties可以保存到流中或从流中加载。

2、示例

Properties作为Map集合的使用

import java.util.Properties;
import java.util.Set;

public class PropertiesDemo {
    public static void main(String[] args) {
        // 创建Properties集合对象
        Properties prop=new Properties();
        // 调用父类Map集合的put()方法添加集合键值元素
        prop.put("101","zhangsan");
        prop.put("102","lishi");
        prop.put("103","wangwu");
        // 遍历集合
        Set<Object> keySet=prop.keySet(); // 得到所有keySet的集合
        for(Object key:keySet){
            Object value=prop.get(key); // 获取所有keySet对应的值,注意Map集合的遍历方式,键值遍历
            System.out.println(key+","+value);
        }
    }
}

运行结果

103,wangwu
102,lishi
101,zhangsan

3、Properties作为集合的特有方法

3.1 说明
Object setProperty(String key,String value):数组集合的键和值,都是String类型,底层调用Hashtable方法 put(设置键值对,可代替父类的put()方法)
String getProperty(String key):使用此属性列表中指定的键搜索属性(根据键key获取值value)
Set<String> stringPropertyName():从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串(获取得到所有键的集合)
3.2 示例

Properties作为集合的特有方法

import java.util.Properties;
import java.util.Set;
// Properties作为集合的特有方法
public class PropertiesDemo1 {
    public static void main(String[] args) {
        // 创建集合Properties对象
        Properties prop=new Properties();
//        prop.put("101","zhangsan"); // 调用父类的put方法添加键值对元素
        // 使用Properties的特有方法setProperty()方法添加键值对元素,键值都为String类型
        prop.setProperty("101","zhangsan");
        prop.setProperty("102","lishi");
        // 使用Properties的特有方法getProperty()方法获取值
//        System.out.println(prop.getProperty("101")); // lishi
//        System.out.println(prop.getProperty("1001")); // null
        // 使用Properties的特有方法stringPropertyName()方法获取所有键的集合,键值都为String类型(关键,重要一步)
        Set<String> names = prop.stringPropertyNames();
        // 增强for循环遍历集合
        for(String key:names){
//            System.out.println(key); // 遍历键
            String value = prop.getProperty(key); // getProperty()方法获取键对应的值
            System.out.println(key+","+value); // 输出键和值信息
        }
    }
}

运行结果

102,lishi
101,zhangsan

4、Properties和IO流结合的方法

4.1 方法说明
void load(InputStream inStream):从输入字节流读取属性列表(键和元素对)
void load(Reader reader):从输入字符流读取属性列表(键和元素对)
void store(OutputStream out,String comments):将此属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输入字符串(即将Properties集合数据保存到文件中)
4.2 示例

Properties和IO流结合的方法

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class PropertiesDemo2 {
    public static void main(String[] args) throws IOException{
        // 将Properties集合中的数据保存到文件中
        myStore(); // 演示第二个方法时先将该方法注释,因为文件已经创建成功,没有必要再次创建,浪费资源
        // 将文件中的数据加载到Properties集合中
        myLoad();
    }
    private static void myLoad() throws IOException{
        // 创建Properties对象
        Properties prop=new Properties();
        // void load(Reader reader):从输入字符流读取属性列表(键和元素对)
        // Reader为抽象类,创建其实现类即子类FileReader对象作为参数
        FileReader fr=new FileReader("D:\\Ultimate JavaCode\\src\\test8\\fw.txt");
        // 调用load()方法将文件中的数据加载到Properties集合中
        prop.load(fr);
        // 释放资源
        fr.close();
        // 打印集合,查看是否加载成功
        System.out.println(prop);
    }
    private static void myStore() throws IOException {
        // 创建Properties对象
        Properties prop=new Properties();
        // 使用特有的setProperty()方法设置字符串类型的键值
        prop.setProperty("101","zhangsan");
        prop.setProperty("102","lishi");
        prop.setProperty("103","wangwu");
        // void store(Writer writer,String comments)
        // Writer为抽象类,创建其实现类即子类FileWriter对象作为第一个参数
        FileWriter fw=new FileWriter("D:\\Ultimate JavaCode\\src\\test8\\fw.txt");
        // 调用store()方法将Properties集合中的数据保存到文件中
        prop.store(fw,null); // 第二个参数comments为描述信息,不描述可设置为null
        // 释放资源
        fw.close();
    }
}

运行结果

{101=zhangsan, 102=lishi, 103=wangwu}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

Docker安装MySQL镜像实战分享

今天我们对Docker安装MySQL镜像进行实战分享&#xff0c;以更深入的了解容器的使用场景。我们在云付服务器Ubuntu环境上已经安装好了Docker&#xff0c;接下来我们开始安装mysql5.7版本&#xff0c;安装mysql有两种思路&#xff0c;直接拉取mysql镜像和自己做mysql镜像&#xf…

【python基础学习10课_面向对象、封装、继承、多态】

一、类与对象 1、类的定义 在类的里面&#xff0c;称之为方法。 在类的外面&#xff0c;称之为函数。类&#xff1a;人类&#xff0c;一个族群&#xff0c;是一个群体类的语法规则&#xff1a;class 自定义的类名():属性 -- 变量方法 -- 函数类&#xff0c;首字母大写&#x…

软考-中级-系统集成2023年综合知识(五)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…

阿里云服务器配置选择哪个比较好?看花眼了

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Java常用笔试题,面试java对未来的规划

最重要的话 2021年&#xff0c;真希望行业能春暖花开。 去年由于疫情的影响&#xff0c;无数行业都受到了影响&#xff0c;互联网寒冬下&#xff0c;许多程序员被裁&#xff0c;大环境格外困难。 我被公司裁掉后&#xff0c;便着急地开始找工作&#xff0c;一次次地碰壁&#…

微信jsSDK前端签名错误,巨坑; 前后端分离的一大失误。

微信 JS 接口签名校验工具 1. 确保你后端生成的签名是正确&#xff0c;这个是第一步。否则后面都是白扯。 以用上面微信自带的验证签名工龄进行验证。 确保生成的签名和你的签名是一致的。 2. timestamp需要是字符串类型. 3. 切记&#xff0c;URL不要encode&#xff0c;如果…

9.12零钱兑换(LC518-M)(开始完全背包,与01背包的不同仅在于遍历顺序)

算法&#xff1a; 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背包。 但本题和纯完全背包不一样&#xff0c;纯完全背包是凑成背包最大价值是多少&#xff0c;而本题是要求凑成总金额的物品组合个数&#xff01; 动规五步曲&#…

剑指offer--c++--n个骰子的点数

目录 题目&#xff1a; 题目分析&#xff1a; 最后编写代码&#xff1a; 输出结果 题目&#xff1a; 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率。 感谢大佬的帮助&#xff1a;https://www.cnblogs.c…

人人都写过的6个bug

大家好&#xff0c;我是知微。 程序员写bug几乎是家常便饭&#xff0c;也是我们每个人成长过程中难以避免的一部分。 为了缓解这份“尴尬”&#xff0c;今天想和大家分享一些曾经都会遇到过的bug&#xff0c;让我们一起来看看这些“经典之作”。 1、数组越界 #include <…

数据库-DDL

show databases; 查询所有数据库 select database(); 查询当前数据库 use 数据库名&#xff1b; 使用数据库 creat database[if not exists] 数据库名…

成都源聚达:开抖音店铺分数需要达到多少

在数字化浪潮中&#xff0c;抖音以其独特的平台魅力吸引了无数商家入驻。但想要开设一家抖音店铺并非随意之举&#xff0c;它需要商家达到一定的评分标准。这如同参加一场考试&#xff0c;只有成绩合格者才有资格入座。那么&#xff0c;这个分数线究竟是多少呢? 据官方数据显示…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析&#xff1a; 这个题目乍一看&#xff0c;数据大小用暴力解法大概率会超时&#xff0c;可能想用双指针&#xff0c;但是问题出现在 可能存在负数&#xff0c;也就是说即使是找到了一个答案&#xff0c;后面也可能存在负数和正数抵消&#xff0c;又是答案&#xff0c;因此不…

【Linux】文件传输工具lrzsz的安装与使用

目录 一、关于lrzsz 二、安装lrzsz 三、lrzsz的说明及使用 1、上传命令rz 2、下载命令sz 一、关于lrzsz 在开发的过程中&#xff0c;经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时&#xff0c;一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能…

用ChatGPT计算植被归一化指数NDVI并出图的详细教程

用ChatGPT结合GIS计算植被归一化指数NDVI出图教程 用ENVI计算比较繁琐&#xff0c;如今AI的盛行&#xff0c;我们可以轻松解决计算问题&#xff0c;只需1一分钟变可以出图。 详细教学请看上方视频步骤。 更多ChatGPT教学内容请见&#xff1a;ChatGPT结合GIS&#xff1a;一分钟…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

服务器为什么会卡顿,出现卡顿情况怎么办

从维护服务器的角度来看&#xff0c;服务器卡顿是一种常见的问题&#xff0c;但服务器卡顿可能会影响到网站、游戏或平台的正常访问和运行&#xff0c;所以出现卡顿问题首先需要对服务器进行全面的检查&#xff0c;确定卡顿原因&#xff0c;然后选取适合的解决方案&#xff0c;…

基于Spring Boot的秒杀系统(附项目源码+论文)

摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套基于Spring Boot的秒杀系统&am…

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

智能驾驶规划控制理论学习06-基于优化的规划方法

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…