Java中的IO介绍

本章内容

一 、File概念

File可以代表一个目录或者一个文件,并不能代表文件的内容 文件和流的区别:File关注的是文件本身的特征,如名称、路径、修改时间、大小。 流关注的是文件的内容。

二、File基本的操作
  1. 常见构造方法

    | File(String pathname) | 建立一个以pathname为路径的File对象, pathname可以是相对路径,也可以是绝对路径。 | | ———————————————— | —————————————————————————————— | | File(String parent,String child) | 建立一个以parent加上child为路径的File对象 | | File(File parent,String child) | 建立一个以parent加上child为路径的File对象 |

    注意:文件的路径如果考虑跨平台,就使用File.seperator

    相对路径:javase程序中,相对参照点为项目目录 src/test.项目目录下的src/test 绝对路径:e:/test

  2. 创建文件操作

    mkdir:创建单层目录 dir1/dir2:必须保证dir1是存在的,才能成功创建dir2 mkdirs:创建层级目录 dir1/dir2:如果dir1不存在,会先创建dir1,再创建dir2 createNewFile:创建文件 dir1/a :必须保证dir1是存在的,否则,会报系统找不到指定的路径的异常

  3. 文件的常用读操作(文件名称、文件名称)

    exists() //文件或者目录是否存在 isFile() //是否是文件 isDirectory() //是否是目录 getName() //取文件或者目录的名字 getPath() //取文件或者目录的路径 getAbsolutePath() //取文件绝对路径 lastModified() //最后修改日期 length() //文件或者目录的字节大小 list()//获得当前File对象所表示目录下的文件和目录名称,返回String[]类型的数据。 listFiles()//获得当前File对象所表示目录下的文件和目录,返回File[]类型的数据。

    代码实例

  4. 修改文件名称

    注意:修改的新文件名需要是不存在的 ,如果修改前后的目录一致,那就是重命名的效果,如果修改前后目录不一致,相当于会删除旧目录中的文件,以新的名称出现在新目录中

    //      File file = new File(baseDir,"11.txt");
    //      file.renameTo(new File(baseDir,"bbb/111.txt"));

  5. 删除文件

            File file = new File(baseDir,"2.txt"); 
            file.delete();

  6. 删除文件夹

    递归:

    1、自己调用自己

    2、必须要一个条件

    private static void myDelete(File dir) {
            // TODO Auto-generated method stub
            if(dir.isDirectory()) {
                File[] listFiles = dir.listFiles();
                for (File file : listFiles) {
                    if(file.isDirectory()) {
                        myDelete(file);
                    }
                    file.delete();
                    
                }
                dir.delete();
            }
        }
    ​
  • 得有一个明确的递归出口(什么情况下不递归了)

  • 递归算法代码简洁,但是效率比较低

    1到n的累加和执行过程:

    | n=1 | 0x01 return 1 | fun(1) =1 | | —— | ———————- | ———————————- | | n=2 | 0x02 2+fun(1) | fun(2) =2+fun(1)=2+1=3 | | n=3 | 0x02 :3+fun(2) | fun(3)= 3+fun(2)=3+3=6 | | n=4 | 0x02 :4+fun(3) | fun(4)=4+fun(3)=4+6=10 | | n=5 | 0x02: 5+fun(4) | fun(5)=5+fun(4)=5+10=15 | | 栈底 | | |

    入栈:记录信息

    出栈:根据入栈记录的信息计算结果 fun(1) fun(2) ….. fun(5)

    public static int fun(int n){
        if(n<=1){
            return 1;           //0x01
        }else{
            return n+fun(n-1);  //0x02}
        }

public static void deleteFile(File f){        
    if(!f.exists()){           
        return;        
    }        
    //如果是一个文件        
    if(f.isFile()){            
        f.delete();//删除文件            
        System.out.println("删除文件"+f.getName());        
    } 
    //如果是一个目录 
    if(f.isDirectory()){
        File fs[]=f.listFiles();
        //满足这个条件,不是空目录
        if(fs.length>0){
            for(File subFile:fs){
                deleteFile(subFile);
            }
        }
        //删除空目录 
        f.delete();
        System.out.println("删除目录"+f.getName());
    }    
}
三、流的概念

File类关心的是磁盘上存储的文件位置和名称等,而流是指程序运行中的数据通信信道,当然流类所关心的是文件的内容。

四、流的分类

根据流向分为:输入流,输出流

根据传输单位:字节流,字符流

根据是否和数据源可以直接交互:节点流,处理流

节点流:可以和数据源直接交互,FileInputStream,FileOutPutStream,FileWriter,FileReader

处理流:需要连接嵌套其它的流使用,BufferedReader,BufferedWriter

五、流的四个根类
  1. InputStream(字节输入流)

    • FileInputStream:节点流,字节输入流,按照字节为单位读文件,文件复制

    • ObjectInputStream:处理流,对象输入流,需要嵌套一个字节输入流进行使用,如FileInputStream,反序列化

  2. OutputStream(字节输出流)

    • FileOutputStream:节点流,字节输出流,按照字节为单位写,文件复制

    • ObjectOutPutStream:处理流,对象输出流,需要嵌套一个字节输出流,如FileOutputStream进行使用,序列化

  3. Reader(字符输入流)

    • FileReader:节点流,针对文件的字符输入流,以字符为单位读文件,存在乱码问题,不能直接按行进行读

    • BufferedReader:处理流,带缓冲区的字符输入流,以行为单位读文件 readLine:返回值为null表示读取结束

    • InputStreamReader:处理流,转换流(可以将字节流转换为字符流),需要嵌套节点流使用,读文件的指定字符集编码,解决乱码问题

  4. Writer

    • FileWriter:节点流,针对文件的字符输出流,以字符为单位写文件,存在乱码问题,不能直接按行写

    • BufferedWriter :处理流,带缓冲区的字符输出流,按照行写字符,newLine

    • OutPutStreamWriter:处理流,转换流(可以将字节流转换为字符流),需要嵌套节点流使用,写文件的时候指定字符集编码,解决乱码问题

六、字节流
  1. FileInputStream

    常用api

    FileInputStream是InputStream的子类。 FileInputStream是读取文件的字节输入流。 FileInputStream常用的构造方法: FileInputStream(File file) FileInputStream(String filename) FileInputStream覆盖实现了父类如下方法: int available() void close()

    字节输入流的代码结构

    ​
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Arrays;
    ​
    public class StreamDemo {
    ​
        public static void main(String[] args) throws IOException {
            //字节流
            //1、建立文件源(数据源的一种)
            File file = new File("src/1.txt");
            //2、建立流链接文件源
            FileInputStream input = new FileInputStream(file);
            //3、读取数据
            int read = input.read();
            byte[] bs = new byte[1024];
            int len = input.read(bs);
            int read2 = input.read(bs, 2, 5);
            
            //使用数据
            
            //4、关闭流
            input.close();
        }
    ​
    }
    ​

    int read():一次读取1个字节,返回值表示读取的一个字节的数据(一个字节的数据不一定表示一个字符的编码),返回值为-1表示读取结束

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    ​
    public class StreamDemo {
    ​
        public static void main(String[] args) {
            //字节流
            //public abstract class InputStream
            File file = new File("src/1.txt");
            try {
                //如果是输入流,文件必须存在
                FileInputStream fileInputStream = new FileInputStream(file);
                
                int n;
                //read()读取流中的数据
                while((n=fileInputStream.read())!=-1) {
                    System.out.println(n);
                }
                
                //关闭流
                fileInputStream.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    ​
        }
    ​
    }
    ​

    int read(byte[ ] b):将文件中读到的数据放到数组中,返回值为读取到的字节长度,返回值为-1表示读取结束

    ​
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Arrays;
    ​
    public class StreamDemo {
    ​
        public static void main(String[] args) {
            //字节流
            //public abstract class InputStream
            File file = new File("src/1.txt");
            try {
                //如果是输入流,文件必须存在
                FileInputStream fileInputStream = new FileInputStream(file);
                
                byte[] bs = new byte[1024];
                //int read(byte b[]) 将文件中的所有数据读到字节数组中(bs)
                //返回值是读取了多少个字节
                int len = fileInputStream.read(bs);
    //          System.out.println(Arrays.toString(bs));
    //          System.out.println(len);
                String str = new String(bs);
                System.out.println(str.trim());
                
                //关闭流
                fileInputStream.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    ​
        }
    ​
    }
    ​

    int read(byte[] b,int off,int len):将文件中读到的数据放到数组中的指定位置,指定长度,返回值为读取到的字节长度,返回值为-1表示读取结束

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class StreamDemo {
    
    	public static void main(String[] args) {
    		//字节流
    		//public abstract class InputStream
    		File file = new File("src/1.txt");
    		try {
    			//如果是输入流,文件必须存在
    			FileInputStream fileInputStream = new FileInputStream(file);
    			
    //			int n;
    //			//read()读取流中的数据,每次读取一个字节
    //			while((n=fileInputStream.read())!=-1) {
    //				System.out.println(n);
    //			}
    			
    			byte[] bs = new byte[1024];
    			//int read(byte b[]) 将文件中的所有数据读到字节数组中(bs)
    			//返回值是读取了多少个字节
    			//第一个参数bs存了读取的数据
    			//第二个参数1设置了bs数组从下标1的位置开始存
    			//第三个参数3设置了从文件中读取几个字节
    			int len = fileInputStream.read(bs,1,3);
    			System.out.println(Arrays.toString(bs));
    			System.out.println(len);
    			String str = new String(bs);
    			System.out.println(str);
    			
    			//关闭流
    			fileInputStream.close();
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    }
    

    注意:read()和int read(byte[ ] b)方法返回值代表的意义

  2. FileOutputStream

    FileOutputStream是OutputStream的子类 FileOutputStream是写入文件的字节输出流 FileOutputStream常用的构造方法: FileOutputStream(File file) FileOutputStream(String filename) FileOutputStream(File file,boolean append) FileOutputStream(String filename,boolean append) FileOutputStream覆盖实现了父类如下方法: void close() void flush() void write(int b) :写入一个字节的数据,参数就是要写入的数据的编码

    void write(byte[] b) :将数组中的数据写到文件中,数组中存放的是字符的编码

    void write(byte[] b,int off,int len):将数组指定位置指定长度的数据写入的文件中

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class OutputStreamDemo {
    
    	public static void main(String[] args) throws IOException {
    		//FileOutputStream
    		//按照单位,字节流
    		//按照方向,输出流
    		//按照是否跟源进行关联,节点流
    		//1、声明文件源
    		File file = new File("src/output.txt");
    		//2、创建字节输出流
    		FileOutputStream fos = new FileOutputStream(file);
    		//3、写出数据
    		String str = "abcdefg";
    //		for(int i=0;i<str.length();i++) {
    //			fos.write(str.charAt(i));
    //		}
    		fos.write(str.getBytes(), 1, 3);
    		
    		
    		//4、关闭流
    		fos.close();
    	}
    
    }
    

  3. 文件复制

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopyDemo {
    
    	public static void main(String[] args) throws IOException {
    		//文件复制
    		File sourceFile = new File("G:\\video\\20220530-1-File概念.mp4");
    		File targetFile = new File("f:\\64\\1.mp4");
    		
    		FileInputStream input = new FileInputStream(sourceFile);
    		FileOutputStream output = new FileOutputStream(targetFile);
    		
            //缓存可以减少io次数,可以大大的提升速度
    		byte[] bs = new byte[1024*8];
    		int len;
    		while((len=input.read(bs))!=-1) {
    			output.write(bs);
    			bs = new byte[1024*8];
    		}
    
    		input.close();
    		output.close();
            sourceFile.delete();
    	}
    
    }
    

七、字符流

字符流:适合读写文本字符(按照字符读取,不能直接按照行读取)

  1. FileReader

    • 常用API:

      int read() :一次读一个字符,返回值是读到的一个字符的编码,-1表示读取结束

      int read(char[] cbuf) :返回值表示读取到字符的个数,参数表示存放读取到的数据的数组

      int read(char[] cbuf,int off,int len):返回值表示读取到字符的个数,参数表示存放读取到的数据的数组

      void close()

  2. FileWriter

    • 常用API:

      void write(int ch) :写入单个字符到调用的输出流。

      void write(String str) :写入str到输出流。

      void write(String str, int off, int len),写入字符串的某一部分。

      void write(char[] cbuf)

      void write(char[] cbuf,int off,int len):写入字符数组的某一部分。

      void flush() :清空输出缓冲区。

      void close() :关闭输出流。

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class CharIODemo {

	public static void main(String[] args) throws IOException {
		//Reader	字符输入流的父类
		//FileReader 文件字符输入流
		FileReader fr = new FileReader(new File("src/1.txt"));
		int n;
		while((n=fr.read())!=-1) {
			System.out.println((char)n);
		}
		
		char[] cs = new char[1024];
		while(fr.read(cs,1,3)!=-1) {
			System.out.println(new String(cs).trim());
			cs = new char[1024];
		}
		
		fr.close();
		
		//FileWriter 文件字符输出流

//		FileWriter fw = new FileWriter(new File("src/1.txt"));
		fw.write("你吃了么?".toCharArray());
		fw.write(25105);
		fw.write((int)'我');
//		//参数为String
		fw.write("人情味儿发我放散阀");
//		fw.close();
	}

}

八、嵌套流

流对象被其他处理流的多次连接,称为流的嵌套。

直接与数据源相连接的流是节点流

处理流连接节点流,提供附加性能

处理流可以被其它处理流继续连接,以获取需要的其它性能。

理流不可以与节点(数据源)直接连接

image-20210721145536019

九、缓冲流

默认带了8192个字符的缓冲区,是为了提高性能,减少频繁和硬盘进行io的次数,

BufferedReader:处理流,字符输入流,是Reader的子类提供了readLine方法,很实用

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	public static void main(String[] args) throws IOException {
		// BufferedReader
		//生成数据源
		File sourceFile = new File("src/1.txt");
		//生成节点流
		FileReader fr = new FileReader(sourceFile);
		//生成处理流 缓冲流
		BufferedReader br = new BufferedReader(fr);
		//boolean ready()返回true,则可以读
		while(br.ready()) {
			//String readLine()可以读出文件中的一行内容,如果没有则返回null
			System.out.println(br.readLine());
		}
		br.close();
	}

}

获得所有学生,并返回集合

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class StuDemo {

	public static void main(String[] args) throws IOException {
		//文件中读取内容,先封装成学生对象,再封装到集合中
		List<Stu> stuList = new ArrayList<Stu>();
		BufferedReader br = new BufferedReader(new FileReader(new File("src/stu.txt")));
		while(br.ready()) {
			//1,张三,18
			String stuStr = br.readLine();
			//{"1","张三","18"}
			String[] arr = stuStr.split(",");
			Stu stu = new Stu(Integer.parseInt(arr[0]),arr[1],Integer.parseInt(arr[2]));
			stuList.add(stu);
		}
		br.close();
		
		for (Stu stu : stuList) {
			System.out.println(stu);
		}
	}

}

BufferedWriter:处理流,字符输出流,是Writer的子类,提供了newLine() write(str)方法

写入一个学生

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {

	public static void main(String[] args) throws IOException {
		//BufferedWriter
		File file = new File("src/stu.txt");
        //第二个参数为是否追加,true为追加写,false为覆盖写
		FileWriter fw = new FileWriter(file,true);
		BufferedWriter bw = new BufferedWriter(fw);
		Stu stu = new Stu(5,"田七",23);
		
		String str = stu.getSid()+","+stu.getSname()+","+stu.getSage();
		
		bw.write(str);
		bw.newLine();
		
		bw.close();
	}

}

十、序列化
  1. 对象流

    • 对象输入流(ObjectInputStream):

      ObjectInputStream in=newObjectInputStream(输入流对象);

      相应的方法:in.readObject();

    • 对象输出流(ObjectOutputStream):

      ObjectOutputStream out=new ObjectOutputStream(输出流对象);

      相应的方法:out.writeObject(Object obj);

  2. 序列化

    • 序列化:就是将对象的内容分解成字节流,以便存储在文件中或在网络上传输。

      属性的要求:非transient 非静态 是可序列化类型(Serializable)

    • 反序列化:就是打开并读取字节流,且从该流中恢复该对象

      没有执行过反序列化的类型对应的代码块及构造方法

      能够序列化的对象必须是Serializable类型,对应的类型必须实现Serializable接口

    序列化类型中一般会要求提供一个serialVersionUID,作用是保证读(反序列化)和写(序列化)的过程中类型版本的一致性。如 写的时候版本id为1 那么读的时候版本id也必须是1,才能成功

     public static void write1() throws IOException{         
         //处理流           
         ObjectOutputStream writer=new ObjectOutputStream(new FileOutputStream(new File("src/data")));         
         for (int i = 0; i < 10; i++) {             
             Goods goods=new Goods("00"+i, "商品"+i, i+10.1f);             
             writer.writeObject(goods);        
         }         
         writer.flush();         
         writer.close();         
     }     
    public static void read1() throws IOException, ClassNotFoundException{         
        //处理流           
        ObjectInputStream reader=new ObjectInputStream(new FileInputStream(new File("src/data")));         
        while(true){             
            try {                
                Object obj=reader.readObject();                
                System.out.println(obj);            
            } catch (EOFException e) {
                //EOFException:表示文件读取到末尾了                
                // TODO Auto-generated catch block                
                System.out.println("读取结束");                
                break;            
            }
        }
        reader.close();
    }

    注意:使用EOFException判断文件是否读取到末尾

问题描述: 用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一个文件,用输出流ObjectOutputStream向文件连续写几个对象,关闭输出流,然 后读取,这些对象都可以读出;这时在向该文件增加对象,新写的对象就读不出了

问题出现的原因: ObjectOutputStream建立后第一次写入一个对象时, 会在对象数据前写入一些标志的数据“AC ED 00 05”(用二进制方式查看打开),应该是流相关的信息。当你关闭 ObjectOutputStream 后再重新打开往文件里面写对象时(append方式),就会再一次把“AC ED 00 05”写入文件,而这些信息并不是你写入对象的数据,所以当你用ObjectInputStream来读取对象时,流会将除第一个“AC ED 00 05”以外的数据当作各个对象的数据,造成无法解析,所以读取时有一个java.io.StreamCorruptedException出现。 这个可以通过编辑Info.dat来验证,只要将“AC ED 00 05”删除(第一个“AC ED 00 05”保留)就可以正常读出后来加入的对象。 给出一个比较笨的解决方法: 在以后要添加新的对象到Info.dat时,将里面原有的对象读出放入ArrayList中,清空文件,再将对象集一次写入。

尝试解决办法:

那个“AC ED 00 05”是 ObjectOutputStream.writeSystemHeader()写进去的,你可以继承ObjectOutputStream类,覆盖这个方法。 在你自己的writeSystemHeader()里判断是不是第一次写入一个文件,如果是向一个文件大小不为零的文件追加的话,就调用 super.reset(),如果是第一次写这个文件,不是追加,就调用super.writeSystemHeader()

/** 
 * 此类继承ObjectOutputStream,重写writeStreamHeader()方法,以实现追加写入时去掉头部信息 
 */  
public static class MyObjectOutputStream extends ObjectOutputStream {  
    private static File f;  
  
    // writeStreamHeader()方法是在ObjectOutputStream的构造方法里调用的  
    // 由于覆盖后的writeStreamHeader()方法用到了f。如果直接用此构造方法创建  
    // 一个MyObjectOutputStream对象,那么writeStreamHeader()中的f是空指针  
    // 因为f还没有初始化。所以这里采用单态模式  
    private MyObjectOutputStream(OutputStream out, File f) throws IOException, SecurityException {  
        super(out);  
    }  
  
    // 返回一个MyObjectOutputStream对象,这里保证了new MyObjectOutputStream(out, f)  
    // 之前f已经指向一个File对象  
    public static MyObjectOutputStream newInstance(File file, OutputStream out) throws IOException {  
        f = file;// 本方法最重要的地方:构建文件对象,两个引用指向同一个文件对象  
        return new MyObjectOutputStream(out, f);  
    }  
  
    @Override  
    protected void writeStreamHeader() throws IOException {  
        // 文件不存在或文件为空,此时是第一次写入文件,所以要把头部信息写入。  
        if (!f.exists() || (f.exists() && f.length() == 0)) {  
            super.writeStreamHeader();  
        } else {  
            // 不需要做任何事情  
        }  
    }  
}  

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

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

相关文章

nginx2

mkdir /usr/local/develop cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz yum install git git clone https://github.com/arut/nginx-rtmp-module.git 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd nginx-1.17.4/ 安装编译…

EMC学习笔记(二十六)降低EMI的PCB设计指南(六)

降低EMI的PCB设计指南&#xff08;六&#xff09; 1.PCB布局1.1 带键盘和显示器的前置面板PCB在汽车和消费类应用中的应用1.2 敏感元器件的布局1.3 自动布线器 2.屏蔽2.1 工作原理2.2 屏蔽接地2.3 电缆屏蔽至旁路2.4 缝隙天线&#xff1a;冷却槽和缝隙 tips&#xff1a;资料主要…

蓝桥杯嵌入式第六届真题(完成)STM32G431

蓝桥杯嵌入式第六届真题&#xff08;完成&#xff09;STM32G431 题目部分 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program b…

windows11 MSYS2下载安装教程

MSYS2 可以理解为在windows平台上模拟linux编程环境的开源工具集 当前环境&#xff1a;windows11 1. 下载 官网地址可下载最新版本&#xff0c;需要科学上网 https://www.msys2.org/ 2. 安装 按照正常安装软件流程一路next就可以 打开 3. 配置环境 网上很多教程提到需…

基于multiprocessing.pool的多进程池与单进程访问多网页的比较示例

一、示例代码&#xff1a; from multiprocessing import Pool import time import requestsurls [ # URL队列&#xff0c;通过多进程访问http://www.python.org,http://www.python.org/about/,http://www.python.org/doc/,http…

【JavaEE】_CSS选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

模拟串口LV2,解决硬件串口资源不足问题!!!!

模拟串口通信 2.0 版本&#xff01;&#xff01; 我在前面的文章里面有写了 虚拟串口通信&#xff0c;虽然说能用&#xff0c;但是用过的小伙伴都说 “好!” 优缺点: 先说一点&#xff0c;2.0版本并不适用于同硬件串口的所有场合&#xff0c;仅仅针对自己开发的电子垃圾的主…

Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

什么是对象和类 什么是 Python 类、类对象、实例对象 类变量、实例变量/类属性、实例属性 前言 只是叫法不一样 实例属性 实例变量 类属性 类变量 个人认为叫属性更恰当 类属性和实例属性区别 类属性&#xff0c;所有实例对象共享该属性实例属性&#xff0c;属于某一…

【MySQL】操作库 —— 库的操作 -- 详解

一、增删数据库 1、创建数据库 create database db_name; 本质就是在 /var/lib/mysql 创建一个目录。 说明&#xff1a; 大写的表示关键字。[ ] 是可选项。CHARACTER SET&#xff1a;指定数据库采用的字符集。COLLATE&#xff1a;指定数据库字符集的校验规则。 2、数据库删除…

Python||数据分析之pyecharts 绘图(词云、气泡)

1. echarts 和 Pyecharts 简介 1.1echarts 简介: • echarts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 • echarts 遵循 Apache-2.0 开源协议,免费商用。 • ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 AS…

算法day12

算法day12 二叉树理论基础114 二叉树的前序遍历145 二叉树的后序遍历94 二叉树的中序遍历迭代法 二叉树理论基础 直接看代码随想录就完事了&#xff0c;之前考研也学过&#xff0c;大概都能理解 我这里就说说代码层面的。 二叉树的存储&#xff1a; 1、链式存储&#xff1a;这…

内容检索(2024.02.12)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此做简介并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff1a; 信号仿真类话题如何看待频域与时域的仿真差别-…

猫头虎分享已解决Bug || Python Error: ImportError: No module named ‘module_name‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

数学建模:EWM – TOPSIS 超强讲义! 原理、应用、代码

目录 一、综合评价指标预处理 1.定量指标的一致化处理&#xff08;正向化处理&#xff09; 2.定量指标的无量纲化处理 二、熵权法&#xff08;EWM&#xff09; 三、TOPSIS法 四、熵权法-TOPSIS的使用流程 案例&#xff1a;熵权法-TOPSIS的案例分析&#xff1a;水质评价 …

贪吃蛇的实现,基于windows操作系统

前言&#xff1a; 贪吃蛇从学习到真正实现花了9天实现&#xff0c;第一二天第一次学习&#xff0c;第三四五天第二次学习&#xff0c;第六七八天一边实现一边思考&#xff0c;才完成了贪吃蛇的代码。实现了贪吃蛇以后已经接近过年&#xff0c;我想自己再根据掌握的知识制作烟花…

leetcode 461. 汉明距离

比较简单的一题&#xff0c;先对两个整数进行异或操作&#xff0c;会将两个整数二进制形式中各个数字进行异或操作&#xff0c;不同的数字则为1&#xff0c;再通过移位操作统计得到的二进制数中为1的个数&#xff0c;即为所求。 Java代码如下&#xff1a; class Solution {pub…

STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程

STM32 STD/HAL库驱动W25Q64 模块读写字库数据OLED0.96显示例程 &#x1f3ac;原创作者对W25Q64保存汉字字库演示&#xff1a; W25Q64保存汉字字库 &#x1f39e;测试字体显示效果&#xff1a; &#x1f4d1;功能实现说明 利用W25Q64保存汉字字库&#xff0c;OLED显示汉字的时…

SVD奇异值分解

一、奇异值 奇异值&#xff08;Singular Values&#xff09;是线性代数中矩阵的重要性质之一&#xff0c;与奇异值分解&#xff08;SVD&#xff09;密切相关。让我们来更详细地了解一下奇异值的概念&#xff1a; 定义&#xff1a; 对于一个矩阵 ( A )&#xff0c;它的奇异值是…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成&#xff1a;悬挂、转向、轮子/履带、刹车/油门、动…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题&#xff1a;Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior&#xff08;TED.16年&#xff09; 摘要 本文提出了一种基于表面电位的紧凑模型&#xff0c;用于模拟具有栅极和源极场板&#xff08;FP&#xff09;结构的AlGaN/G…