IO流(二)

IO流(二)

目录

  1. IO流 —— 字符流
  2. IO流 —— 缓冲流
  3. IO流 —— 转换流
  4. IO流 —— 打印流
  5. IO流 —— 数据流
  6. IO流 —— 序列化流
1.IO流 —— 字符流
  • 文件字符输入流 —— 读字符数据进来
    • 字节流:适合复制文件等,不适合读写文本文件
    • 字符流:适合读写文本文件内容
FileReader(文件字符输入流)
  • 作用:以内存为基准,可以把文件中的数据以字符的形式,读入到内存中去
构造器说明
Public FileReader(File file)创建字符输入流管道与源文件接通
Public FileReader(String Pathname)创建字符输入流管道与源文件路径接通
方法名称说明
Public int read()每次读取一个字符返回,如果发现没有数据可读会返回-1
Public int read(char[] buffer)每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1
掌握文件字符输入流每次读取一个字符
/*** 目标:掌握文件字符输入流每次读取一个字符*/
public class FileReaderTest1 {public static void main(String[] args) {try (// 1、创建一个文件字符输入流管道与源文件接通Reader fr = new FileReader("src/ab.txt")) {// 2、读取文本文件的内容int c; // 记住每次读取的字符编号while((c = fr.read()) != -1) {System.out.print((char)c);}} catch (IOException e) {e.printStackTrace();}}
}
掌握文件字符输入流每次读取多个字符
/*** 目标:掌握文件字符输入流每次读取多个字符*/
public class FileReaderTest2 {public static void main(String[] args) {try (// 1、创建一个文件字符输入流管道与源文件接通Reader fr = new FileReader("src/ab.txt")) {// 2、每次读取多个字符char[] buffer = new char[3];int len; // 记住每次读取了多少个字符while((len = fr.read(buffer)) != -1) {System.out.print(new String(buffer,0,len));}} catch (IOException e) {e.printStackTrace();}}
}
文件字符输出流 (写字符数据出去)

作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去

构造器说明
Public FileWriter(File file)创建字节输出流管道与源文件对象接通
Public FileWriter(String filePath)创建字节输出流管道与源文件路径接通
Public FileWriter(File file,boolean append)创建字节输出流管道与源文件对象接通,可追加数据
Public FileWriter(String filePath,boolean append)创建字节输出流管道与源文件路径接通,可追加数据
方法名称说明
void Writer(int c)写一个字符
void Writer(String str)写一个字符串
void Writer(String str,int off,int len)写一个字符串的一部分
void Writer(char[] cbuf)写一个字符数组
void Writer(char[] cbuf,int off,int len)写入字符数组的一部分
/*** 目标:掌握文件字符输出流:写字符数据出去*/
public class FileWriterTest2 {public static void main(String[] args) {try (// 创建一个文件字符输出流管道与目标文件接通// 覆盖管道
//				Writer fw = new FileWriter("src/out02.txt");// 追加数据的管道Writer fw = new FileWriter("src/out02.txt",true)) {// 1、public void write(int c) : 写一个字符出去fw.write('a');fw.write(97);fw.write('叶'); // 写一个字符出去fw.write("\r\n");// 2、public void write(String c) : 写一个字符串出去fw.write("我爱你中国abc");fw.write("\r\n");// 3、public void writer(String c,int pos,int len) : 写字符串的一部分出去fw.write("我爱你中国abc",0,5);fw.write("\r\n");// 4、public void write(char[] buffer) : 写一个字符数组出去char[] buffer = {'张','三','z','h','a','n','g'};fw.write(buffer);fw.write("\r\n");// 5、public void write(char[] buffer,int pos,int len) : 写字符数组的一部分出去fw.write(buffer,0,2);fw.write("\r\n");} catch (IOException e) {e.printStackTrace();}}
}
字符输出流使用时的注意事项

字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

方法名称说明
Public void flush() throws IoException刷新流,就是将内存中缓存的数据立即写到文件中去生效
Public void close() throws IoException关闭流的操作,包含了刷新!
/*** 目标:搞清楚字符输出流使用时的注意事项*/
public class FileWriterTest3 {public static void main(String[] args) throws Exception {// 字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效Writer fw = new FileWriter("src/out03.txt");// 写字符数据出去fw.write('a');fw.write('b');fw.write('c');fw.write('d');fw.write("\r\n");fw.write("我爱你中国abc");fw.write("\r\n");//		fw.flush(); // 刷新流
//		fw.write("张三"); // 刷新流后还可以往文件写数据
//		fw.flush();fw.close(); // 关闭流,关闭流里面包含刷新操作}
}
字节流、字符流的使用场景小结
  • 字节流适合做一切文件数据的拷贝(音视频,文本)
  • 字节流不适合读取中文内容输出
  • 字符流适合做文本文件的操作(读、写)

2.IO流——缓冲流

  1. 字节缓冲流
  2. 字符缓冲流
  3. 原始流、缓冲流的性能分析

1

缓冲流的作用:对原始流进行包装,以提高原始流读写数据的性能

字节缓冲流的作用,提高字节流读写数据的性能

2

  • 原理:字节缓冲输入流自带8KB缓冲池,字节缓冲输出流也自带了8KB缓冲池
构造器说明
Public BufferedInputStream(InputStream is)把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读取数据的性能
Public BufferedOutputStream(OutputStream os)把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能
/*** 目标:掌握字节缓冲流的作用*/
public class BufferedInputStreamTest1 {public static void main(String[] args){		try(InputStream is = new FileInputStream("‪D:/reSource/logo.png");// 1、定义一个字节缓冲输入流包装原始的字节输入流InputStream bis = new BufferedInputStream(is);OutputStream os = new FileOutputStream("C:/data/logo.png");// 2、定义一个字节缓冲输出流包换原始的字节输出流OutputStream bos = new BufferedOutputStream(os);){byte[] buffer = new byte[1024]; // 1KBint len; while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}System.out.println("复制完成");} catch (Exception e) {e.printStackTrace();} }
}
BufferedReader(字符缓冲输入流)
  • 作用:自带8KB(8192字节)的字符缓冲池,可以提高字符输入流读取数据的性能
构造器说明
Public BufferedReader(Reader r)把低级的字符输入流包装成字符缓冲输入流管道
  • 字符缓冲输入流新增的功能:按照行读取字符
方法说明
Public String readLine()读取一行数据返回,如果没有数据可读了,会返回null
/*** 目标:掌握字符缓冲输入流的用法*/
public class BufferedReaderTest2 {public static void main(String[] args) {try (Reader fr = new FileReader("src/ab.txt");// 创建一个字符缓冲输入流包装原始的字符输入流BufferedReader br = new BufferedReader(fr);) {//			char[] buffer = new char[3];
//			int len;
//			while((len = fr.read(buffer)) != -1) {
//				System.out.print(new String(buffer,0,len));
//			}String line; // 记住每次读取的一行数据while((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
BufferedWriter(字符缓冲输出流)
  • 作用:自带8KB(8192字节)的字符缓冲池,可以提高字符输出流写字符数据的性能
构造器说明
Public BufferedWriter(Writer r)把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能
  • 字符缓冲输出流新增的功能:换行
方法说明
Public void newLine()换行
public class BufferedWriterTest3 {public static void main(String[] args) {try (Writer fw = new FileWriter("src/out02.txt",true);// 创建一个字符缓冲输出流管道包装原始的字符输出流BufferedWriter bw = new BufferedWriter(fw);) {// 1、public void write(int c) : 写一个字符出去bw.write('a');bw.write(97);bw.write('叶'); // 写一个字符出去
//			fw.write("\r\n");bw.newLine();// 2、public void write(String c) : 写一个字符串出去bw.write("我爱你中国abc");
//			bw.write("\r\n");bw.newLine();} catch (IOException e) {e.printStackTrace();}}
}
案例:拷贝静夜思到另一个文件,恢复顺序
  1. 定义一个缓冲字符输入流管道与源文件接通
  2. 定义一个List集合存储读取的每行数据
  3. 定义一个循环按照行读取数据,存入到List集合中去
  4. 对List集合中的每行数据按照首字母编号升序排序
  5. 定义一个缓冲字符输出流管道与目标文件接通
  6. 遍历List集合中的每个元素,用缓冲字符输出管道写出来并换行
/*** 案例:拷贝静夜思到另一个文件,恢复顺序*/
public class Test4 {public static void main(String[] args) {try(// 1、定义一个缓冲字符输入流管道与源文件接通BufferedReader br = new BufferedReader(new FileReader("src/sort.txt"));// 5、创建一个缓冲字符输出流管道与目标文件接通BufferedWriter bw = new BufferedWriter(new FileWriter("src/Newsort.txt"));) {// 2、定义一个List集合存储读取的每一行ArrayList<String> data = new ArrayList<String>();// 3、按照行读取每段数据String line; // 记录读取的当前行while((line = br.readLine()) != null) {data.add(line);}// 4、对ArrayList集合中的每段进行排序,默认按照每段首字母编号排序Collections.sort(data);// 6、遍历List集合的每段内容,依次写出到新文件中for(String ln : data) {bw.write(ln); // 输出遍历的当前段落bw.newLine(); // 换行}} catch (Exception e) {e.printStackTrace();}}
}
原始流、缓冲流的性能分析

测试用例:

  • 分别使用原始的字节流,以及字节缓冲流,赋值一个很大的视频文件

测试步骤:

  1. 使用低级的字节流按照一个一个字节的形式去复制文件
  2. 使用低级的字节流按照字节数组的形式复制文件
  3. 使用高级的缓冲字节流按照一个一个字节的形式复制文件
  4. 使用高级的缓冲字节流按照字节数组的形式复制文件
/*** 目标:观察原始流和缓冲流的性能*/
public class TimeTest4 {// 复制视频的路径private final static String SRC_FILE = "src/File1";// 复制到哪个目的地private final static String DEST_FILR = "D:\\";public static void main(String[] args) {
//		copy01(); // 低级字节流一个一个字节的形式复制,非常慢,直接淘汰copy02(); // 低级字节流按照一个一个字节数组的形式复制,速度较慢copy03(); // 缓冲流按照一个一个字节的形式的复制,速度较慢copy04(); // 缓冲流按照一个一个字节数组的形式复制,速度极快,推荐使用!}private static void copy01() {long startTime = System.currentTimeMillis();try(InputStream is = new FileInputStream(SRC_FILE);OutputStream os = new FileOutputStream(DEST_FILR + "1.avi");) {int b;while((b = is.read()) != -1) {os.write(b);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMillis();System.out.println("低级字节流一个一个字节复制耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy02() {long startTime = System.currentTimeMillis();try(InputStream is = new FileInputStream(SRC_FILE);OutputStream os = new FileOutputStream(DEST_FILR + "2.avi");) {byte[] buffer = new byte[1024]; // 1KBint len;while((len = is.read(buffer)) != -1) {os.write(buffer,0,len);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMillis();System.out.println("低级字节流使用字节数组复制耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy03() {long startTime = System.currentTimeMillis();try(InputStream is = new FileInputStream(SRC_FILE);BufferedInputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream(DEST_FILR + "3.avi");BufferedOutputStream bos = new BufferedOutputStream(os);) {int b;while((b = bis.read()) != -1) {bos.write(b);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMillis();System.out.println("缓冲流一个一个字节复制耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy04() {long startTime = System.currentTimeMillis();try(InputStream is = new FileInputStream(SRC_FILE);BufferedInputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream(DEST_FILR + "4.avi");BufferedOutputStream bos = new BufferedOutputStream(os);) {byte[] buffer = new byte[1024]; // 1KBint len;while((len = bis.read(buffer)) != -1) {bos.write(buffer,0,len);}} catch (Exception e) {e.printStackTrace();}long endTime = System.currentTimeMillis();System.out.println("缓冲流使用字节数组复制耗时:" + (endTime - startTime) / 1000.0 + "s");	}
}

3.IO——转换流

  • 引出问题:不同编码读取时会乱码
  • 字符输入转换流
  • 字符输出抓换流
不同编码读取出现乱码的问题
  • 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
  • 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!
/*** 目标:掌握不同编码读取乱码的问题*/
public class Test1 {public static void main(String[] args) {try(// 1、创建一个文件字符输入流与源文件接通// 代码编码:UTF-8 文件的编码:UTF-8Reader fr = new FileReader("src/File1");//				// 代码编码:UTF-8 文件的编码:GBK
//				Reader fr = new FileReader("src/File1"); // 乱码// 2、把文件字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(fr);){String line;while((line = br.readLine()) != null) {System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}
}

3

InputStreamReader(字符输入转换流)
  • 解决不同编码时,字符流读取文本内容乱码的问题
  • 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
构造器说明
Public InputStreamReader(InputStream is)把原始的字节输入流,按照代码默认编码转成字符输入流(与直接使用FileReader的效果一样)
Public InputStreamReader(InputStream is,String charset)把原始的字节输入流,按照指定字符集编码成字符输入流(重点)
/*** 目标:掌握字符输入转换流的作用*/
public class InputStreamReaderTest2 {public static void main(String[] args) {try(// 1、得到文件的原始字节流(GBK的字节流形式)InputStream is = new FileInputStream("src/File2");// 2、把原始的字节输入流按照指定的字符集编码转换成字符输入z转换流Reader isr = new InputStreamReader(is, "GBK");// 3、把字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(isr);) {String line;while((line = br.readLine()) != null) {System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}
}
需要控制写出去的字符使用什么字符编码,该咋整?
  1. 调用String提供的getBytes方法解决、
    • String data = “我爱你中国abc”;
    • byte[] bytes = data.getBytes(“GBK”);
  2. OutputStreamWriter 字符输出转换流
    • 作用:可以控制写出去的字符使用什么字符集编码
    • 解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符编码了
构造器说明
Public OutputStreamWriter(OutputStream os)可以把原始的字节输出流,按照代码默认编码转换成字符输出流
Public OutputStreamWriter(OutputStream os,String charset)可以把原始的字节输出流,按照指定的编码转换成字符输出流(重点)
/*** 目标:掌握字符输出转换流的使用*/
public class OutputStreamWriterTest3 {public static void main(String[] args) {try(// 1、创建一个文件字节输出流OutputStream os = new FileOutputStream("src/File3.txt");// 2、把原始的字节输出流按照指定的字符集编码转换成字符输出流Writer osw = new OutputStreamWriter(os,"GBK");// 3、把字符输出流包装成缓冲字符输出流BufferedWriter bw = new BufferedWriter(osw);) {bw.write("我爱你中国ABC");bw.write("我是中国人abc");} catch (Exception e) {e.printStackTrace();}}
}

4.IO——打印流

4

PrintStream / PrintWriter(打印流)
  • 作用:打印流可以实现更方便,更高效的打印数据出去,能实现打印啥出去就是啥出去
PrintStream提供的打印数据的方案
构造器说明
Public PrintStream(OutputStream out / File / String)打印流直接通向字节输出流对象 / 文件 / 文件路径
Public PrintStream(String fileName,Charset charset)可以指定写出去的字符编码
Public printStream(OutputStream out,boolean autoFlush)可以指定实现自动刷新
Public printStream(OutputStream out,boolean autoFlush,String encoding)可以指定实现自动刷新,并可指定字符的编码
方法说明
Public void print(Xxx xxx)打印任意类型的数据出去
Public void Writer(int / byte[] / byte[] 一部分)可以支持写一个字节 / 一个字节数组 / 一个字节数组的一部分 出去
/*** 目标:掌握打印流:PrintStream / PrintWriter的用法*/
import java.io.PrintStream;
import java.nio.charset.Charset;public class PrintTest1 {public static void main(String[] args) {try(// 创建一个打印流管道
//				PrintStream ps =
//					new PrintStream("src/File3.txt",Charset.forName("GBK")); // 指定写出去的数据是"GBK"编码PrintStream ps =new PrintStream("src/File3.txt");) {ps.println(97); // 97ps.println('a'); // 'a'ps.println("张三"); // "张三"ps.println(true); // trueps.println(99.9); // 99.9ps.write(97); // 'a'} catch (Exception e) {e.printStackTrace();}}
}
PrintWriter提供的打印数据的方案
构造器说明
Public printWriter(OutputStream out / Writer / File / String)打印流直接通向 字节输出流 / 字符输出流 / 文件 / 文件路径
Public printWriter(String filename,Charset charset)可以指定写出去的字符编码
Public printWriter(OutputStream out,boolean autoFlush,String encoding)可以指定实现自动刷新,并可指定字符的编码
public class PrintWriterTest2 {public static void main(String[] args) {try(// 创建一个打印流管道
//				PrintWriter ps =
//				new PrintWriter("src/File4.txt");// 创建一个打印流的追加管道PrintWriter ps =new PrintWriter(new FileOutputStream("src/File4.txt",true));) {ps.println(97);ps.println('a');ps.println("张三");ps.println(true);ps.println(99.9);//			ps.write(97); // 'a'} catch (Exception e) {e.printStackTrace();}}
}
PrintStream 和 PrintWriter 的区别
  • 打印数据的功能是一模一样的,都是使用方便,性能高效
  • PrintStream继承字节输出流OutputStream,因此支持写字节数据的方法
  • PrintWriter继承自字符输出流Writer,因此支持写字符数据的方法
打印流的一种应用:输出语句的重定向
  • 可以把输出语句的打印位置改到某个文件中去
  • PrintStream ps = new PrintStream(“文件地址”); Sysout.setout(ps);
/*** 目标:了解输出语句的重定向*/
public class Test3 {public static void main(String[] args) {System.out.println("床前明月光"); // 输出到控制台System.out.println("疑是地上霜"); // 输出到控制台try(PrintStream ps = new PrintStream("src/File5.txt");){// 把系统默认的打印流对象改成自己设置的打印流System.setOut(ps);System.out.println("举头望明月"); // 输出到指定的文件System.out.println("低头思故乡"); // 输出到指定的文件	} catch (Exception e) {e.printStackTrace();}}
}

5.IO流——数据流

6

DataOutputStream(数据输出流)
  • 允许把数据和其数据类型一并写出去
构造器说明
Public DataOutputStream(OutputStream out)创建新数据输出流包装基础的字节输出流
方法说明
Public final void writeByte(int V) throws IoException将byte类型的数据写入基础的字节输出流
Public final void writeInt(int V) throws IoException将int类型的数据写入基础的字节输出流
Public final void writeDouble(double V) throws IoException将double类型的数据写入基础的字节输出流
Public final void writeUTF(String str) throws IoException将字符串数据以 UTF-8 编码成字节写入基础的字节输出流
Public final void write(int / byte[] / byte[] 一部分)支持写一个字节 / 一个字节数组 / 一个字节数组的一部分出去
/*** 目标:数据输出流*/
public class DataOutputStreamTest1 {public static void main(String[] args) {try(// 1、创建一个数据输出流包装低级的字节输出流DataOutputStream dos = new DataOutputStream(new FileOutputStream("src/File6out.txt"));) {dos.writeInt(97);dos.writeDouble(99.9);dos.writeBoolean(true);dos.writeUTF("张三666");} catch (Exception e) {e.printStackTrace();}	}		
}
DataInputStream(数据输入流)
  • 用于读取数据输出流写出去的数据
构造器说明
Public DataInputStream(InputStream is)创建新数据输入流包装基础的字节输入流
方法说明
Public final byte readByte() throws IoException读取字节数据返回
Public final int readInt() throws IoException读取int类型的数据返回
Public final double readDouble() throws IoException读取double类型的数据返回
Public final String readUTF() throws IoException读取字符串数据(UTF-8)返回
Public int readInt() / read(byte[])支持读取字节数据进来
/*** 目标:使用数据输入流读取特定类型的数据*/
public class DataInputStreamTest2 {public static void main(String[] args) {try(// 1、创建一个数据输入流包装一个低级字节输入流DataInputStream dis =new DataInputStream(new FileInputStream("src/File6out.txt"));) {int i = dis.readInt();System.out.println(i);double d = dis.readDouble();System.out.println(d);boolean b = dis.readBoolean();System.out.println(b);String rs = dis.readUTF();System.out.println(rs);} catch (Exception e) {}}
}

6.IO流——序列化流

  • 对象序列化:把java对象写入到文件中去
  • 对象反序列化:把文件里的java对象读出来

6

ObjectOutputsream(对象字节输出流)
  • 可以把java对象进行序列化:把java对象存入到文件中去
构造器说明
Public ObjectOutputStream(OutputStream out)创建对象字节输出流,包装基础的字节输出流
方法说明
Public final void writeObject(object o) throws IoException把对象写出去
/*** 目标:掌握对象字节输出流的使用:序列化对象*/
public class ObjectOutputStreamTest1 {public static void main(String[] args) {try(// 2、创建一个对象字节输出流 包装原始的字节输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/File7out.txt"));) {// 1、创建一个java对象User u =new User("admin","张三",19,"123456");// 3、序列化对象到文件中去oos.writeObject(u);System.out.println("序列化对象成功!");} catch (Exception e) {e.printStackTrace();}}
}

注意:对象如果要参与序列化,必须要实现序列化接口 (java.io.serializable)

ObjectInputStream(对象字节输入流)
  • 可以把java对象进行反序列化,把存储在文件中的java对象读入到内存中来
构造器说明
Public object InputStream(InputStream is)创建对象字节输入流,包装基础的字节输入流
方法说明
Public final object readObject()把存储在文件中的java对象读出来
/*** 目标:掌握对象字节输入流的使用:反序列化对象*/
public class objectInputStreamTest2 {public static void main(String[] args) {try(// 1、创建一个对象字节的输入流管道,包装低级的字节输入流与源文件接通ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/File7out.txt"));){User u = (User)ois.readObject();System.out.println(u);} catch (Exception e) {e.printStackTrace();}}
}
如果一次序列化多个对象,怎么弄?
  • 用一个ArrayList集合存储多个对象,然后直接对集合进行序列化
  • 注意:ArrayList集合已经实现了序列化接口(Serializable)
/*** 目标:掌握对象字节输出流的使用:序列化多个对象*/
public class ObjectOutputStreamTest2 {public static void main(String[] args) {try(// 2、创建一个对象字节输出流 包装原始的字节输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/File8out.txt"));) {// 1、创建多个java对象User u1 =new User("zhangsan","张三",19,"123456");User u2 =new User("lisi","李四",22,"123888");User u3 =new User("wangwu","王五",19,"123666");// 3、创建一个ArrayList集合存储多个对象 (ArrayList集合内部已经实现了序列化接口)ArrayList<User> data = new ArrayList<User>();data.add(u1);data.add(u2);data.add(u3);// 4、序列化对象到文件中去oos.writeObject(data);System.out.println("序列化对象成功!");} catch (Exception e) {e.printStackTrace();}}
}

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

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

相关文章

nginx rewrite地址重写

目录 常用的nginx正则表达式 location和rewrite的区别 一、location 1.location常用匹配类型 2.location匹配机制 3.实际工作中三大匹配规则 1.网站首页匹配 2.网站静态页面&#xff0c;通过前缀匹配或通用匹配在nginx服务器本地处理 3.网站动态页面&#xff0c;通过匹…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后&#xff0c;需要进行初始化数据库操作&#xff0c;对应PostgreSQL数据库中就是需要进行initdb后&#xff0c;才能对数据库进行启动。initdb的过程&#xff0c;其实就是创建数据库实例的过程&#xff0c;生成模板数据库和相应的目录、文件信息&a…

uniapp小程序限制微信群访问(图文教程)

我有一个微信小程序 “程序员实用资源” 我现在只想让我的微信群可以访问这个小程序的所有功能 所以我必须对我小程序的来源进行限制&#xff0c;让部分功能在正常访问的时候提示没有加群&#xff0c;不可访问&#xff0c;只有从群内点击进入小程序的时候才可以访问这部分功能…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注&#xff0c;它通过识别和定位图像中的目标对象&#xff0c;提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

ESP32蓝牙串口通讯

文章目录 一、前言二、代码三、运行 一、前言 ESP32支持经典蓝牙和低功耗蓝牙&#xff08;BLE&#xff09;,经典蓝牙可在计算机上模拟出一个串口&#xff0c;使得ESP32可以以串口的方式和计算机通信。 二、代码 #include "BluetoothSerial.h"String device_name …

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

软考中级证在手里,感觉白躺家里了?

软考中级&#xff0c;最适合考的专业是《系统集成项目管理工程师》&#xff0c;特别适合零基础的人&#xff01; 2022年中级职称的报名条件和要求非常宽松&#xff0c;即使没有学历、零基础和相关工作经验也可以考试&#xff01;&#xff01;&#xff01; 一、职称的含金量 …

docker 中 File Sharing 和Volumes 的区别

在 Docker 中&#xff0c;File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中&#xff0c;但它们的用途和实现方式有一些重要的区别&#xff1a; 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能&#xff0c;允许你将主机文件系…

中国最厉害的改名大师颜廷利:食物的真正人生意义是识悟

在探索人生意义的深邃征途中&#xff0c;我们本应以“识悟”为航标&#xff0c;不断扬帆远航&#xff0c;以实现自我的升华。然而&#xff0c;当回望人世繁华&#xff0c;古往今来&#xff0c;无论男女老少&#xff0c;似乎都在“食物”的陪伴下&#xff0c;徘徊往复&#xff0…

计算机网络复习

2024年whut 概述 1.计算机网络的目标&#xff1a;信息传输和资源共享 2.网络协议的要素&#xff08;必考&#xff09;&#xff1a; 语法&#xff1a;数据信息和控制信息的结构或格式 语义&#xff1a;要发出何种控制信息&#xff0c;完成何种动作&#xff0c;做出何种响应 同…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

监控局域网电脑屏幕的办法,最简单的三种方法,好用!

在现代企业管理和家庭教育环境中&#xff0c;对局域网内电脑屏幕进行有效监控成为了保障信息安全、提升工作效率和监督行为规范的重要手段。 监控局域网电脑屏幕不仅可以帮助管理者了解员工的工作状态&#xff0c;确保资源的合理使用&#xff0c;还能在一定程度上预防潜在的网…

银行卡归属地查询-银行卡归属地接口-银行卡归属地API

接口简介&#xff1a;通过银行卡号查询国内外银行名称、银行卡卡种、卡品牌以及银行卡发卡省份和城市&#xff0c;支持借记卡和部分贷记卡的发卡省市查询。 若银行卡是农村信用社&#xff0c;归属地无法区分到城市&#xff0c;只能到省份 接口地址&#xff1a;https://www.wapi…

CentOS 7 安装MySQL以及常见问题解决

访问网站&#xff1a;http://repo.mysql.com 找到适配CentOS 7版本的MySQL 的YUM仓库包rpm文件&#xff0c;如下图 下载后&#xff0c;找到安装包的位置 空白处右键&#xff0c;选择在终端打开 查看当前目录下文件 # 安装MySQL 5.7的YUM仓库包rpm -ivh mysql57-community-rele…

中科数安 | 加密管理系统

中科数安提供的加密管理系统是一套全面而高效的数据安全解决方案&#xff0c;旨在保护企业核心文件资料的安全。该系统结合了多种先进的技术手段和管理策略&#xff0c;确保企业数据在存储、传输和使用过程中都得到严格的保护。 www.weaem.com 以下是中科数安加密管理系统的主要…

固定式土壤墒情监测仪—土壤状况进行长期跟踪和分析

TH-TS600 固定式土壤墒情监测仪是一种专门用于长期、连续、自动监测土壤墒情的设备。能够实时监测土壤的水分、温度、湿度等关键参数&#xff0c;确保农民和管理者能即时获取土壤状况信息&#xff0c;便于及时做出农业决策。由于是自动监测&#xff0c;数据采集的准确性和可靠性…

[答疑]订单、预约单的流水号是冗余属性吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 陈磊 2024-6-12 20:40 老师好&#xff01;我学习了软件方法的类图内容&#xff0c;也已经认真做题了&#xff0c;现有一个问题想请老师解惑。 像订单、预约单这样的单据生成的时候&a…

铁砧帝国延迟高?铁砧帝国延迟严重这样解决

铁砧帝国是一款少见的多人在线游戏&#xff0c;游戏能支持上千名玩家建立帝国并互相作战。而且这款游戏在细节方面也做足准备&#xff0c;设计了攻城梯和攻城锤等设备&#xff0c;以攻破坚固的城墙和要塞&#xff0c;不过具体获取方法就需要玩家自己摸索。因为最近开放了测试申…

【免费API推荐】:满足您的开发需求,加速项目上线

免费API助力项目开发&#xff0c;为开发者们提供了强大的支持和工具。这些API提供了各种功能和服务&#xff0c;能够帮助项目开发者们快速构建出高质量的应用。无论是地理位置服务、支付接口、社交媒体集成还是图像识别&#xff0c;这些免费API为项目开发者们提供了丰富的功能和…

Cortex-A510——Cache

Cortex-A510——Cache 小狼http://blog.csdn.net/xiaolangyangyang 1、Cortex-A510 Cache组织结构 以cache-size为32k&#xff0c;cache-line为32Byte为例&#xff1a; 组相连&#xff08;常用结构&#xff09;&#xff1a;4-way&#xff0c;256-set直接映射&#xff1a;相当于…