Java基础(IO)
所有操作都在内存,不能长时间保存,IO主要在硬盘,可以长时间保存。
一、File类
File类被定义为文件和目录路径名的抽象表示形式,这是因为 File 类既可以表示文件也可以表示目录,他们都通过对应的路径来描述。
提供构造函数创建一个 File 类对象,则该对象就是指定文件的引用,可以通过该对象对文件操作。
常用方法:
package day8;import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;/*
* File类是文件和目录的抽象表示形式
* 1、目录 - 文件夹
* 2、如何创建File类的对象
* File f = new File("文件或目录的路径);
* 路径的分隔符:
* 1、Windows下的路径分隔符是“\“,但是”\“在Java中表示转义字符,和其后的字符结合表示特定的含义
* 使用"\\"表示”\“自身;
* 2、"\"和操作系统无关的路径分隔符
*
* */
//在桌面创建一个文本文件:
public class MyTest01 {public static void main(String[] args) {File f1 = new File("C:\\Users\\s'w'n\\Desktop\\1.txt");System.out.println(f1);//File f2 = new File("C:/Users/s'w'n/Desktop/1.txt");//System.out.println(f2);//File类的常见方法System.out.println("是否隐藏:" + f1.isHidden());System.out.println("是否可读:" + f1.canRead());System.out.println("是否可写:" + f1.canWrite());System.out.println("绝对路径:" + f1.getAbsolutePath());System.out.println("文件名:" + f1.getName());System.out.println("是否是文件夹/目录:" + f1.isDirectory());System.out.println("是否是文件:" + f1.isFile());/** lastModified() -- 返回时间戳 -- 1970-1-1 0:0:0 毫秒值* 时间戳 --> String xxxx-xx-xx xx:xx:xx* 1、时间戳 --> Date* 2、Date --> String* */long l = f1.lastModified();//时间戳 --> DateDate date = new Date(l);//Date --> StringSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = sdf.format(date);System.out.println("最后修改时间:" + str);System.out.println("文件大小:" + f1.length());System.out.println("是否存在:" + f1.exists());//没有也是可以的File f2 = new File("C:\\Users\\s'w'n\\Desktop\\2.txt");System.out.println("是否存在:" + f2.exists());File f3 = new File("C:\\Users\\s'w'n\\Desktop\\abcd1234");if(!f3.exists()){//创建文件夹f3.mkdir();}else {f3.delete();}}
}
package day8;
import java.io.File;
public class MyTest02 {/** 列出f下的所有的文件和文件夹*//*public static void listAll(File f){File[] fileArr = f.listFiles();for (File file : fileArr) {System.out.println(file);//判断file是否是文件夹 是-继续再遍历if (file.isDirectory()) {listAll(file);}}}*/public static void listAll(String tag,File f){File[] fileArr = f.listFiles();for (File file : fileArr) {System.out.println(tag + file.getName());//判断file是否是文件夹 是-继续再遍历if (file.isDirectory()) {listAll("\t" + tag, file);}}}public static void main(String[] args) throws Exception {File f = new File("C:/Users/s'w'n/Desktop/test123");//获取下一级的文件和文件夹/*File[] fileArr = f.listFiles();for (File file : fileArr) {System.out.println(file);}*///listAll(f);listAll("|--",f);}
}
二、IO流概述
2.1、IO流_什么是IO流
I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
IO流是一组有序的,有起点和终点的数据集合,是对数据传输的总称和抽象。
IO作用:1人机交互,2文件数据读取写入,数据持久化保存。
IO流的源和目的地:
内存
控制台
磁盘文件
网络端点
关于Input 和 Output:
Input读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中;
Output将程序(内存)数据输出到磁盘、光盘等存储设备中。
2.2、IO流分类
1 按照处理的数据单元不同:
字节流:操作的数据单元是8位字节,InputStream、OutputStream。二进制文件(声音、图片、视频)、文本文件;
字符流:操作的数据单元是16位字符,Reader、Writer,通常用于处理文本文件。
2 按照数据流向不同:
输入流:只能从中读取数据,而不能向其写入数据。InputStream、Reader;
输出流:只能向其写入数据,而不能从中读取数据。OutputStream、Writer;
输入、输出都是从内存的角度进行划分,内存-->硬盘,输出流;硬盘-->内存,输入流
2.3、IO流处理的流程。
1、打开流
2、在流中数据传输(输入/输出 读/写)
3、关闭流
在程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
三、字节流和字符流
操作的数据单元是8位字节,主要涉及两个抽象类:InputStream、OutputStream.
3.1、InputStream
只有read方法
package day8;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class MyTest03 {/** read()* read(byte[] b);* read(byte[] b,int offset,int length)* 共同点:* 1、都是从输入流读取数据* 2、读取到文件的末尾,都返回-1* 不同点:* 1、read()返回每次读取到的那一个字节* 2、read(byte[] b)返回读取到的字节数量,将读取到的数据放在了b这个数组中* read(byte[], 0, b.length);* 3、read(byte[] b,int offset,int length)返回读取到的字节数量,* 将读取到的数据放在了b这个数组中(从数组的第offset这个位置开始存放),读取length个字节* */public static void main(String[] args) throws IOException {//打开流/创建流FileInputStream in = new FileInputStream("C:/Users/s'w'n/Desktop/1.txt");byte[] arr = new byte[1024]; //保存读取到数据的数组/缓冲区int len = 0;//表示每次读取到的数据的长度/字节数 返回值:每次运行读取到的字节数可能比(1024小) 即小于arr.length(),要用len//使用IO流进行读写操作while(true){/** 读取数据到arr数组中,将读取到的内容从0号位置开始存放,最多读取arr.length()个字节*/len = in.read(arr,0,arr.length);if(len == -1){break;}//byte[] --> String//!!!要用lenString s = new String(arr,0,len);System.out.print(s);}//关闭流in.close();}
}
package day8;import java.io.FileInputStream;
//只有一个参数的,只能传数组
public class MyTest04 {public static void main(String[] args) throws Exception {//打开流/创建流FileInputStream in = new FileInputStream("C:/Users/s'w'n/Desktop/1.txt");byte[] arr = new byte[1024]; //保存读取到数据的数组/缓冲区int len = 0;//表示每次读取到的数据的长度/字节数 返回值:每次运行读取到的字节数可能比(1024小) 即小于arr.length(),要用len//使用IO流进行读写操作while(true){len = in.read(arr);if(len == -1){break;}//byte[] --> StringString s = new String(arr, 0, len);System.out.print(s);}//关闭流in.close();}
}
3.2、OutputStream
write()方法 字节写入输出流
flush()方法 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标;
close()方法 关闭此输出流并释放与该流关联的所有系统资源。
package day8;import java.io.FileInputStream;
import java.io.FileOutputStream;public class MyTest04 {public static void main(String[] args) throws Exception {/** OutputStream* write* */FileOutputStream out = new FileOutputStream("C:/Users/s'w'n/Desktop/2.txt");//String --> 文件//String --> byteString str = "哈哈哈哈哈哈哈哈哈啊哈哈";//变内容会把上一次的覆盖byte[] arr = str.getBytes();//将数组中的内容写入文件out.write(arr, 0, arr.length);//关闭流out.flush();}
}
package day8;import java.io.FileOutputStream;public class MyTest05 {public static void main(String[] args) throws Exception {/** OutputStream* write* 第二个参数如果为true,是以追加的方式写入数据 log日志* */FileOutputStream out = new FileOutputStream("C:/Users/s'w'n/Desktop/2.txt",true);//String --> 文件//String --> byteString str = "hello world";//变内容会把上一次的覆盖byte[] arr = str.getBytes();//将数组中的内容写入文件out.write(arr, 0, arr.length);//关闭流out.flush();}
}
3.3、文件拷贝
字节流
package day8;import java.io.FileInputStream;
import java.io.FileOutputStream;public class MyTest06 {public static void main(String[] args) throws Exception {//创建流FileInputStream in = new FileInputStream("C:/Users/s'w'n/Desktop/1.txt");FileOutputStream out = new FileOutputStream("C:/Users/s'w'n/Desktop/1.txt");int len = 0;//接收读取到的长度byte[] arr = new byte[1024];//接收读取到的数据//读取写入while (true){len = in.read(arr);if (len == -1){break;}out.write(arr, 0, len);}//关闭流 -- 多个流 -- 后打开的先关闭out.close();in.close();}
}
字符流
package day11;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;/*
* 拷贝2*/
public class MyTest01 {public static void main(String[] args) throws Exception {FileReader in = new FileReader("C:/Users/s'w'n/Desktop/1.txt");FileWriter out = new FileWriter("C:/Users/s'w'n/Desktop/3.txt");int len = 0; //读取到的字符个数char[] arr = new char[1024];while(true){len = in.read(arr);if(len == -1){break;}out.write(arr, 0, len);}out.close();in.close();}
}
3.4、图片拷贝
package day8;import java.io.FileInputStream;
import java.io.FileOutputStream;//复制图片
public class MyTest07 {public static void main(String[] args) throws Exception {//创建流FileInputStream in = new FileInputStream("C:/Users/s'w'n/Desktop/屏幕截图 2025-03-17 192045.png");FileOutputStream out = new FileOutputStream("C:/Users/s'w'n/Desktop/2.png");int len = 0;byte[] arr = new byte[1024];//读取写入while (true){len = in.read(arr);if(len == -1){break;}out.write(arr, 0, len);}//关闭流out.close();in.close();}
}
四、缓冲流
缓冲流:
把频繁的和硬盘的交互改为了和内存的交互。
Java API提供的带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,默认使用8192个字节或字符的缓冲区。
缓冲流要套接在相应的节点流之上。
根据数据操作单位可以把缓冲流分为:
BufferedInputStream和BufferedOutputStream;
BufferedReader和BufferedWriter。
关闭流的顺序和打开流的顺序相反。只需关闭最外层流即可。
4.1 文件拷贝
package day11;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;/*
缓冲流
* 拷贝3*/
public class MyTest01 {public static void main(String[] args) throws Exception {BufferedReader in = new BufferedReader(new FileReader("C:/Users/s'w'n/Desktop/1.txt"));BufferedWriter out = new BufferedWriter(new FileWriter("C:/Users/s'w'n/Desktop/4.txt"));int len = 0;char[] arr = new char[1024];while(true) {len = in.read(arr);if(len == -1) {break;}out.write(arr, 0, len);}in.close();out.close();}
}
4.2 按行读取
package day11;import java.io.BufferedReader;
import java.io.FileReader;/*
* 缓冲流
* 按行读取
* */
public class MyTest02 {public static void main(String[] args) throws Exception{BufferedReader in = new BufferedReader(new FileReader("C:/Users/s'w'n/Desktop/1.txt"));String line = null;while(true){//按行读取,读取到末尾返回nullline = in.readLine();if(line == null) {break;}System.out.println(line);}}
}
五、通讯录管理系统_IO版_读取
相关源码及其注释如下:
package day4;
/*
有需求 -- 才去设计类
自定义表示通讯录单条信息的类*/
public class PhoneBookItem {//属性private String name;//姓名private String gender;//性别private int age;//年龄private String phone;//电话private String qq;//QQprivate String addr;//地址//构造方法public PhoneBookItem() {}public PhoneBookItem(String name, String gender, int age, String phone, String qq, String addr) {this.name = name;this.gender = gender;this.age = age;this.phone = phone;this.qq = qq;this.addr = addr;}//方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}/** 返回对象的字符串表示形式 -- 返回一个字符串表示对象的信息* 打印对象时,系统会自动调用这个方法* */public String toString() {return "姓名:" + this.name+ " 性别:" + this.gender+ " 年龄:" + this.age+ " 电话:" + this.phone+ " QQ:" + this.qq+ " 地址:" + this.addr;}
}
package day4;
import java.io.*;
import java.util.ArrayList;/*
对通讯录的信息管理的类分层 - 特定的模块特定的事情*/
public class PhoneBookManager{//属性//ArrayListprivate ArrayList<PhoneBookItem> arr = new ArrayList<>();/*IO 部分* 启动 - 读取文件 - 读取文件中的通讯录信息到ArrayList中* 退出 - 保存文件 - 将ArrayList中的数据写入到文件** 文件的格式* 1、每个通讯录的信息单独占据一行* 2、每一行保存属性的顺序要一致 zs|sd|11|22|33* 3、字符串分割 String[] arr = split("\|");* *///读取文件 -- 读取文件中的通讯录信息到ArrayList中public void init() throws Exception {BufferedReader in = new BufferedReader(new FileReader("C:/Users/s'w'n/Desktop/phonebookconfig.txt"));String line = null;while (true){line = in.readLine();if (line == null){break;}//line --> PhoneBookItem --> ArrayListString[] strArr = line.split("\\|");PhoneBookItem item = new PhoneBookItem(strArr[0], strArr[1], Integer.parseInt(strArr[2]), strArr[3], strArr[4],strArr[5]);}in.close();}//保存文件public void save() throws Exception {//ArrayList --> String --> 文件BufferedWriter out = new BufferedWriter(new FileWriter("C:/Users/s'w/Desktop/phonebookconfig.txt"));for (PhoneBookItem item : arr) {//PhoneBookItem --> 特定格式的字符串StringBuffer sbf = new StringBuffer();sbf.append(item.getName());sbf.append("|");sbf.append(item.getGender());sbf.append("|");sbf.append(item.getAge());sbf.append("|");sbf.append(item.getPhone());sbf.append("|");sbf.append(item.getQq());sbf.append("|");sbf.append(item.getAddr());String s = sbf.toString();out.write(s);//换行out.newLine();}out.close();}//添加 -- 寻找对象数组中第一个为null的位置并赋值public boolean add(PhoneBookItem item) {return arr.add(item);}//删除public boolean del(String name) {for (int i = 0; i < arr.size(); i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {arr.remove(i);return true;}}return false;}/** name - 被修改项的名字* newItem - 修改之后的所有的信息*///修改public boolean update(String name, PhoneBookItem newItem) {for (int i = 0; i < arr.size(); i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {arr.set(i, newItem);return true;}}return false;}//查询所有public ArrayList<PhoneBookItem> findAll(){return this.arr;}//根据姓名查询public PhoneBookItem findByName(String name) {for (int i = 0; i <arr.size() ; i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {return arr.get(i);//要是找到值为null的,null.getName()...程序会崩溃结束}}return null;}}
package day4;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/*
负责显示/和用户交互*/
public class UI {public static void help(){System.out.println("-----------------------------通讯录管理系统-------------------------------");System.out.println("1.添加 2.删除 3.修改 4.查询所有 5.根据姓名查询 0.退出");System.out.println("-----------------------------通讯录管理系统-------------------------------");System.out.println("请选择业务:");}public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);//创建管理类对象PhoneBookManager phoneBookManager = new PhoneBookManager();phoneBookManager.init();while(true) {//打印帮助菜单help();//读取用户输入int choose = sc.nextInt();switch(choose) {case 1://添加//输入姓名System.out.println("-----------添加通讯录----------");System.out.print("姓名:");//如果是println的话就自动换行了String nameAdd = sc.next();/*根据姓名查询是否已经存在1、是 - 提示已经存在2、否 - 允许继续输入*/if (phoneBookManager.findByName(nameAdd) != null) {System.out.println("用户已经存在");break;}System.out.print("性别");String genderAdd = sc.next();System.out.print("年龄");int ageAdd = sc.nextInt();System.out.print("电话");String phoneAdd = sc.next();System.out.print("QQ");String qqAdd = sc.next();System.out.print("地址");String addrAdd = sc.next();//根据用户的输入创建单条信息的对象PhoneBookItem phoneBookItem = new PhoneBookItem(nameAdd, genderAdd, ageAdd, phoneAdd, qqAdd, addrAdd);//添加if(phoneBookManager.add(phoneBookItem)) {//打印被添加的信息System.out.println(phoneBookItem);//上面一行打印时会自动调用 System.out.println(phoneBookItem.toString());System.out.println("添加成功");}else{System.out.println("通讯录空间不足无法添加");}break;case 2://删除System.out.println("----------删除通讯录----------");System.out.println("请输入要删除的姓名:");String nameDel = sc.next();if(phoneBookManager.del(nameDel)) {System.out.println("删除成功");}else{System.out.println("系统中不存在该姓名,无法删除");}break;case 3://修改System.out.println("----------修改通讯录----------");/** 1、判断被修改的项是否存在* 2、判断修改之后的名字与其他项的名字是否重复* */System.out.println("请输入被修改项的姓名:");String oldName = sc.next();//判断被修改的项是否存在PhoneBookItem oldItem = phoneBookManager.findByName(oldName);if(oldItem == null) {System.out.println("被修改项不存在无法修改");break;}System.out.println("请根据提示输入修改之后的信息:");System.out.println("姓名:");String newName = sc.next();/** 修改之后的名字不能和其他项的名字重复* |* 如何判断修改之后的名字是其他项的名字* |* 根据修改之后的名字查询,如果能够查询出信息并且和被修改项的地址不同,就能说明是其他项 -- 不允许修改* *///根据修改之后的名字查询PhoneBookItem newItem = phoneBookManager.findByName(newName);if(newItem != null && oldItem != newItem) {System.out.println("修改之后的姓名和其他项重名,不允许修改");break;}System.out.print("性别");String newGender = sc.next();System.out.print("年龄");int newAge = sc.nextInt();System.out.print("电话");String newPhone = sc.next();System.out.print("QQ");String newQq = sc.next();System.out.print("地址");String newAddr = sc.next();PhoneBookItem updateItem = new PhoneBookItem(newName, newGender, newAge, newPhone, newQq, newAddr);phoneBookManager.update(oldName, updateItem);System.out.println("修改成功");break;case 4://查询所有System.out.println("----------查询所有通讯录----------");ArrayList<PhoneBookItem> arr = phoneBookManager.findAll();for (PhoneBookItem item : arr) {if(item != null) {System.out.println(item);}}break;case 5:System.out.println("----------根据姓名查询通讯录----------");System.out.print("姓名:");String nameSearch = sc.next();PhoneBookItem bookItemSearch = phoneBookManager.findByName(nameSearch);if(bookItemSearch == null) {System.out.println("通讯录中不存在该姓名对应的信息");break;}else{System.out.println(bookItemSearch);}break;case 0://将内存中的数据写入到文件phoneBookManager.save();//退出System.exit(0);default:System.out.println("请根据帮助菜单选择功能");}}}
}
六、序列化和反序列化
6.1、简介
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,序列化主要用于对象的持久化存储和网络传输。反序列化则是将这些存储或传输的格式转换回对象的过程
持久化传输:将对象存储到文件或数据库中。
网络传输:通过网络发送对象,接收端可以恢复对象。
分布式系统:在分布式系统中,对象的序列化和反序列化是实现远程通信的基础。
6.2、序列化
在Java中,序列化是通过实现java.io.Serializable接口来实现的。
步骤:
1、实现Serializable接口:让你的类实现此接口。
2、定义一个统一的序列化ID:为了防止序列化版本冲突,通常在类中定义一个名为serialVersionUID的静态常量。
3、使用ObjectOutputStream:通过ObjectOutputStream将对象写入输出流。
6.3 序列化操作_写入文件
import java.io.Serializable;public class Student implements Serializable {private static final long serialVersionUID = 1L;private String name; //姓名private Integer age;private String gender;private String username; //用户名private String password;public Student() {}public Student(String name, Integer age, String gender, String username, String password) {this.name = name;this.age = age;this.gender = gender;this.username = username;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
package day8;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;public class MyTest07 {public static void main(String[] args) throws Exception {/** 创建两个学生对象* 通过序列化的方式保存到文件* */Student s1 = new Student("zs", 10, "男", "zs", "123");Student s2 = new Student("ls", 10, "男", "zs", "123");ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:/Users/s'w'n/Desktop/1.txt"));out.writeObject(s1);out.writeObject(s2);out.close();}
}
6.4、反序列化
要是读到末尾了再读程序就会崩溃,异常。
package day8;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;public class MyTest06 {public static void main(String[] args) throws Exception {//创建流ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:/Users/s'w'n/Desktop/1.txt"));//读取Object o1 = in.readObject();Object o2 = in.readObject();System.out.println(o1);System.out.println(o2);//关闭流in.close();}
}
6.5、transient关键字
transient关键字是一个修饰符,用于标记类中的某些字段,这些字段在序列化过程中不会被序列化。
使用场景:
敏感信息:比如密码、令牌等敏感信息,你可能不希望它们被序列化。
资源消耗大的字段:比如文件句柄、网络连接等。这些资源在序列化时可能不需要保存。
临时数据:一些只在运行时有用,而不需要持久化存储的数据。
可以标在private等修饰符前。
相关文章:
Java基础(IO)
所有操作都在内存,不能长时间保存,IO主要在硬盘,可以长时间保存。 一、File类 File类被定义为文件和目录路径名的抽象表示形式,这是因为 File 类既可以表示文件也可以表示目录,他们都通过对应的路径来描述。 提供构…...
Trae IDE:AI深度集成的智能开发环境
(以高效人机协作重塑编程体验) 概述 Trae IDE(发音 /treɪ/)是一款深度集成AI能力的现代化开发工具,结合传统IDE的完备功能与前沿AI技术,提供智能问答、代码自动补全、跨文件编程及AI Agent驱动的自动化开…...
网站开发过程中样式忽然不显示问题
老规矩,先听故事:今天我开发网站时候遇到一个问题,就开发的这个网站在默认127.0.0.1运行样式有bug显示不出来,之前都可以,就完全一样的代码,之前可以正常运行显示,今天忽然就不行了,…...
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题 一、引言 约束多目标优化问题(CMOPs)在工程设计、资源分配等领域广泛存在,其核心是在满足多个约束条件的同时优化多个目标函数。传统方法往往难以平衡约束满足与目…...
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
在使用 CentOS 7 的虚拟机时,我们通常需要配置静态 IP 地址,以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址,并确保配置在系统重启后依然生效。 步骤 1:检查虚拟机网络接口 首先…...
整数和浮点数转换时的精度损失
文章目录 int和float转换时的精度损失float组成解析(1) 32位浮点数的结构(2)示例:解析一个浮点数(3)偏置值的作用(4) 偏置值为什么是127?(5&#…...
Protobuf工具
#region 知识点一 什么是 Protobuf //Protobuf 全称是 protocol - buffers(协议缓冲区) // 是谷歌提供给开发者的一个开源的协议生成工具 // 它的主要工作原理和我们之前做的自定义协议工具类似 // 只不过它更加的完善&…...
闭包原理与常见陷阱
引言 JavaScript闭包是前端开发中既强大又神秘的概念,它不仅是面试的必考题,更是解决复杂问题的利器。闭包让函数能够记住并访问其创建时的作用域,即使在该函数在其定义环境之外执行。 然而,正如许多强大的工具一样,…...
用 VS Code / PyCharm 编写你的第一个 Python 程序
用ChatGPT做软件测试 编写你的第一个 Python 程序——不只是“Hello, World”,而是构建认知、习惯与未来的起点 “第一行代码,是一个开发者认知世界的方式。” 编程的入门,不只是运行一个字符串输出,更是开始用计算机思维来理解、…...
Linux学习心得问题整理(一)
day01 运维初识 理解云计算运维目的是什么? 搭建云计算更有利于我们在公网环境下方便访问我们服务 节省时间的成本,能随时随地方便调度硬件资源,更容易搭建软件服务 安全可靠,售后期间支持技术支持维护 什么是运维?…...
在scala中sparkSQL连接masql并添加新数据
以下是 Scala 中使用 Spark SQL 连接 MySQL 并添加数据的完整代码示例(纯文本): 1. 准备连接参数(需替换实际信息) scala val jdbcUrl "jdbc:mysql://localhost:3306/test_db?useUnicodetrue&characterEnc…...
STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…...
.Net HttpClient 使用Json数据
HttpClient 使用Json数据 现代Web项目中,Json是最常用的数据格式。不论是前后端的交互中,还是纯前端项目中,都是如此。因此,.Net HttpClient 能不能更加方便、快捷的处理Json格式数据,也就至关重要了! 文末…...
AI时代,如何实现人机共舞?
在科技飞速发展的当下,人工智能(AI)已不再是科幻作品中的遥远想象,而是深入渗透到我们生活与工作的方方面面。从智能手机中的语音助手,到金融领域的风险预测模型;从医疗影像的智能诊断,到工业生…...
flea-cache使用之Redis哨兵模式接入
Redis哨兵模式接入 1. 参考2. 依赖3. 基础接入3.1 定义Flea缓存接口3.2 定义抽象Flea缓存类3.3 定义Redis客户端接口类3.4 定义Redis客户端命令行3.5 定义哨兵模式Redis客户端实现类3.6 定义Redis哨兵连接池3.7 定义Redis哨兵配置文件3.8 定义Redis Flea缓存类3.9 定义抽象Flea…...
【Docker】Docker环境下快速部署Ollama与Open-WebUI:详细指南
Docker环境下快速部署Ollama与Open-WebUI:详细指南 在本篇文章中,我们将深入探讨如何在Docker中高效部署 Ollama 和 Open-WebUI,并解决在实际使用中常见的问题,确保你的模型服务稳定高效地运行。 一、Ollama 和 Open-WebUI 快速部…...
FFmpeg在Android开发中的核心价值是什么?
FFmpeg 在 Android 开发中的核心价值主要体现在其强大的多媒体处理能力和灵活性上,尤其在音视频编解码、流媒体处理及跨平台兼容性方面具有不可替代的作用。以下是具体分析: --- 1. 强大的音视频编解码能力 - 支持广泛格式:FFmpeg 支持几乎所…...
Java的进制转换
进制知识 Java 中使用不同的前缀表示数据,常见的进制数据有二进制(0b)、八进制(0)、十进制(无)、十六进制(0x)。 public class Demo1 {public static void main(String…...
SpringBoot中的拦截器
SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…...
使用聊天模型和提示模板构建一个简单的 LLM 应用程序
官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…...
paimon中批和流查看过去的快照的数据及变动的数据
1、批处理 创建表并插入三条数据 CREATE TABLE ws_t (id INT,ts BIGINT,vc INT,PRIMARY KEY (id) NOT ENFORCED ); INSERT INTO ws_t VALUES(2,2,2),(3,3,3),(4,4,4),(5,5,5); --设置执行模式为批处理 RESET execution.checkpointing.interval; SET execution.runtime-mode …...
Linux513 rsync本地传输 跨设备传输 一
ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b...
c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)
贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …...
Android Native 之 自定义进程
在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...
深度学习 自然语言处理(RNN) day_02
1. 感知机与神经网络 1.1 感知机 生物神经元: 1.1.1 感知机的概念 感知机(Perceptron),又称神经元(Neuron,对生物神经元进行了模仿)是神 经网络(深度学习)的起源算法&am…...
Kotlin 中的作用域函数
在 Kotlin 中,作用域函数是一组用于在对象上下文中执行代码块的函数。 它们通过简洁的语法实现对对象的操作和逻辑封装。 作用域函数的对比: 1 let 特点: 通过 it 访问对象,需显式使用;返回值是代码块的最后一行结果…...
Linux的SLES系统和其他几大系统之间的区别
✅ SLES 和其他主流 Linux 发行版对比表 特性/发行版SLES (SUSE Linux Enterprise Server)RHEL (Red Hat Enterprise Linux)CentOS / AlmaLinux / RockyUbuntu ServerDebian定位企业级,注重稳定性和支持企业级,行业标准,广泛应用社区版 RHEL…...
上位机学习攻略、步骤和实战路径
目录 🎯 一、什么是上位机? 🧭 二、学习步骤和路径 第一步:了解基础概念 第二步:掌握通信协议 1. 常见协议: 2. 学习目标: 第三步:熟悉主流上位机软件 可选工具及语言&#…...
【爬虫】DrissionPage-1
官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式࿰…...
API安全
目录 API安全:从威胁到防护的全面解析 引言 一、API安全的定义与重要性 1.1 API安全的核心目标 1.2 API安全的挑战 二、API的常见安全威胁 2.1 身份验证攻击 2.2 中间人攻击(MITM) 2.3 注入攻击 2.4 安全配置错误 2.5 拒绝服务&…...
UDP和TCP协议
目录 1. UDP协议 1.1. UDP的特性 1.2. UDP的包头 1.3. UDP的三大使用场景和实际例子 1.4. TCP和UDP的区别 2. TCP协议 2.1. TCP包头格式 2.2. TCP包头和UDP包头对比 2.3. TCP协议的特点 2.4. TCP的三次握手(连接维护问题) 2.5. TCP的四次挥手…...
关于Go语言的开发环境的搭建
1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程,类似于java的开发环境搭建,我们都是需要去安装这个开发工具包的,也就是俗称的这个SDK,他是对于我们的程序进行编译的,不然我们写的这个代码也是跑不起来…...
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs)
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs) 导航(Navs)一、Base nav二、Available styles 可用样式2.1 Horizontal alignment 水平对齐2.2 Vertical 垂直的2.3 Tabs 表格样式2.4 Pills 胶囊样式2.5 Fill and justify 填…...
基于单片机的视力保护仪设计与实现
标题:基于单片机的视力保护仪设计与实现 内容:1.摘要 随着电子设备的普及,人们的视力健康面临着严峻挑战。为了有效预防近视等视力问题,本文旨在设计并实现一款基于单片机的视力保护仪。通过采用红外传感器、光敏传感器等元件,实时监测使用者…...
如何避免和恢复因终端关闭导致的 LoRA 微调中断
环境: Ubuntu20.04 Llama factory Qwen2.5-7B-Instruct llama.cpp H20 95G 问题描述: 使用命令 CUDA_VISIBLE_DEVICES1 FORCE_TORCHRUN1 llamafactory-cli train examples/train_lora/qwen2_5-7b_lora_sft.yaml 进行 LoRA 微调时,如果…...
RT-linux 系统详解
RT-Linux(Real-Time Linux)是一种基于Linux内核的实时操作系统(RTOS),旨在为Linux添加硬实时(Hard Real-Time)能力,使其适用于对时间确定性要求极高的嵌入式系统和工业控制场景。以下…...
开源网络地图可视化第六章学习指南
源代码地址:开源网络地图可视化-配套代码.zip - 蓝奏云 配套书籍:开源网络地图可视化——基于Leaflet的在线地图开发 (杨乃) (Z-Library)(1).pdf - 蓝奏云 3 第六章Leaflet地图动画 3.1 图标动画 3.1.1 沿线运动 沿线运动的动画使用了Leaflet.Geode…...
网页常见水印实现方式
文章目录 1 明水印技术实现1.1 DOM覆盖方案1.2 Canvas动态渲染1.3 CSS伪元素方案2 暗水印技术解析2.1 空域LSB算法2.2 频域傅里叶变换3 防篡改机制设计3.1 MutationObserver防护3.2 Canvas指纹追踪4 前后端实现对比5 攻防博弈深度分析5.1 常见破解手段5.2 进阶防御策略6 选型近…...
# 08_Elastic Stack 从入门到实践(八)---1
08_Elastic Stack 从入门到实践(八)—1 一、Logstash入门之简介以及部署安装 1、Elastic Stack 技术栈示意图 2、Logstash 简介 Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。(存储库当然是Ela…...
携程酒店 phantom-token token1004 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码 搞APP搞的心态有点崩…...
物理:从人体组成角度能否说明基本粒子的差异性以及组织结构的可预设性?
人类的个体差异源于粒子组合的复杂性、环境与随机性的相互作用,而非基本粒子本身的差异性。以下分层次解析: 一、基本粒子的同质性与组合多样性 1. 基本粒子的同一性 标准模型确认:同种类基本粒子(如电子、上夸克)具有完全相同的质量、电荷等属性,不存在个体差异。泡利不…...
前端面试每日三题 - Day 33
这是我为准备前端/全栈开发工程师面试整理的第33天每日三题练习: ✅ 题目1:Deno核心特性深度解析 革命性特性详解 // 安全权限控制(运行时显式授权) deno run --allow-netapi.example.com server.ts // 内置TypeScript支持 …...
JavaScript编译原理
在编程语言的世界中,编译器(如 GCC、TypeScript)和转译器(如 Babel)扮演着至关重要的角色,它们负责将人类可读的代码转换为机器或其他语言可执行的指令。这一过程通常分为四个关键阶段: 1. 词法…...
Nature图形复现—两种快速绘制热图的方法
相信大家在科研过程中,会遇到热图,有时候会觉得热图理解起来比较困难,或者觉得绘制热图也比较困难。本期教程我们来深入了解热图、绘制热图。 热图是一种通过颜色深浅或色阶变化来直观展示数据分布、密度或数值大小的可视化工具。它在多个领域…...
MySQL数据库——视图
目录 一、视图是什么? 二、特点 三、创建视图 四.查询视图 五.更新视图 六.视图的作用 总结 一、视图是什么? 视图是从一个或多个表中导出的虚拟表,它本身不存储数据,而是基于 SQL 查询的结果集。 二、特点 1.虚拟性࿱…...
标贝科技:大模型领域数据标注的重要性与标注类型分享
当前,大模型作为人工智能领域的前沿技术,其强大的泛化能力和复杂任务处理能力,依赖于海量数据的训练。而数据标注,作为连接原始数据与大模型训练的关键桥梁,在这一过程中发挥着举足轻重的作用。 大模型的训练依赖海…...
MYSQL备份恢复知识:第一章:备份操作举例
1. 备份工具 MySQL数据库的备份方式有两大类:一是物理备份,它对数据文件和日志进行整体备份;二是逻辑备份,通过DUMP工具将数据导出。具体的方法有以下几种: • 物理备份,MEB工具,是商用版本推荐…...
VS Code怎么设置python SDK路径
一、通过命令面板快速切换(推荐方法) 打开命令面板 • 快捷键:CtrlShiftP(Windows/Linux)或 CmdShiftP(macOS) • 输入命令:Python: Select Interpreter,回车后显示所有检…...
[经验总结]删除gitlab仓库分支报错:错误:无法推送一些引用到“http:”
问题描述 删除gitlab远程仓库报错。 [wingasowingaso release]$ git push gitlab --delete release remote: GitLab: You can only delete protected branches using the web interface. To http://x.x.x.x/gitlab/test.git! [remote rejected] release (pre-receive hoo…...
虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
摘要 随着汽车以太网的兴起和车载通信系统数量的增加,网络整合成为控制复杂性和成本的关键。当前架构呈现明确分层:以太网(100/1000Mbit/s)支撑信息娱乐、ADAS等高带宽应用,而CAN/CAN FD(0.5-5Mbit/s&#…...