JavaEE 初阶篇-深入了解 I/O 高级流(缓冲流、交换流、数据流和序列化流)

news2024/10/6 8:33:18

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 缓冲流概述

        1.1 缓冲流的工作原理

        1.2 使用缓冲流的步骤

        1.3 字节缓冲流于字符缓冲流的区别

        1.4 字节缓冲流的实例

        1.5 字符缓冲流的实例

        2.0 转换流概述

        2.1 字符输入转换流的实例( InputStreamReader 类)

        2.2 字符输出转化流的实例(OutputStreamWriter 类)

        3.0 打印流概述

        3.1 字节打印流(PrintStream 类)

        3.2 字符打印流(PrintWrite 类)

        4.0 数据流概述

        4.1 数据输出流(DataOutputStream 类)

        4.2 数据输入流(DataInputStream 类)

        5.0 序列化流概述

        5.1 对象字节输出流(ObjectOutputStream 类)

        5.2 对象字节输入流(ObjectInputStream 类)


        1.0 缓冲流概述

        缓冲流(Buffered Stream)来提高 I/O 操作的效率,缓冲流是对字节流和字符流的一种封装,通过缓冲区来减少 I/O 操作的次数,从而提高程序的运行效率。缓冲流的实现类有 BufferedInputStream、BufferedOutputStream、BufferedReader 和 BufferedWriter 。

        1.1 缓冲流的工作原理

        在读取数据时,缓冲流会将数据先读入缓冲区,等到缓冲区满或者达到一定条件时,再将缓冲区中的数据一次性写入到目标设备中;在写入数据时,缓冲流会将数据先写入缓冲区,等到缓冲区满或者达到一定条件时,再将缓冲区中的数据一次性写入到目标设备中。

        1.2 使用缓冲流的步骤

        1)创建字节流或者字符流对象。

        2)将字节流或字符流对象作为参数创建缓冲流对象。

        3)通过缓冲流对象进行数据读取获取写入操作

        4)关闭缓冲流对象,同时会自动关闭底层的字节流或字符流对象。

        1.3 字节缓冲流于字符缓冲流的区别

        1)字节缓冲流会在内存中分配一个大小为 8 KB 的缓冲区来存储数据。这个缓冲区会在读取或写入数据时起到缓冲作用,减少对底层输入流或输出流的直接访问,提高读写效率。

        2)字符缓冲流会在内存中分配 8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。

        3)字符缓冲流特有方法:

        public String readLine() throws IOException:读取一行字符数据,以换行符为结束标志,返回读取的字符串(不包括换行符)。

        public void newLine() throws IOException:写入一个换行符,根据系统的换行符规范来写入换行符。

        1.4 字节缓冲流的实例

        1)字节输出缓冲流来进行写文件操作

代码如下:

import java.io.*;

public class BufferedOut {
    public static void main(String[] args) throws IOException {
        OutputStream os = new FileOutputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_25\\src\\MyIO\\Text.text");
        //将低级流转化为高级流
        BufferedOutputStream bos = new BufferedOutputStream(os);
        bos.write('a');
        bos.write('b');
        bos.write('c');
        bos.write('d');
        bos.write('f');
        bos.write('g');

        //关闭高级流,系统就会自动关闭低级流
        bos.close();
    }
}

运行结果:

        2)字节输入缓冲流来进行读文件操作

代码如下:

import java.io.*;

public class BufferedIs {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_25\\src\\MyIO\\Text.text");
        //将低级流转化为高级流
        BufferedInputStream bis = new BufferedInputStream(is);
        int len;
        while ((len = bis.read()) != -1){
            System.out.print((char) len);
        }
    }
}

运行结果:

        1.5 字符缓冲流的实例

        1)字符输出缓冲流来进行写文件操作。

代码如下:

import java.io.*;

public class BufferedW {
    public static void main(String[] args) throws IOException {
        //先创建字符流(低级流)
        Writer writer = new FileWriter("D:\\software\\code\\2023_java\\2023_java_code\\code_24_25\\src\\MyIO\\Text.text");
        //将低级流转化为高级流
        BufferedWriter bw = new BufferedWriter(writer);
        //开始写文件操作
        bw.write("字符缓冲流内部的缓冲区大小通常是比较合适的,一般在 8 KB 到 16 KB 之间。");
        //刷新数据
        bw.flush();
        //换行操作
        bw.newLine();
        bw.write("这个大小是经过实际测试和性能优化的,能够在提高读写效率的同时,又不会占用过多的内存。");
        //操作完毕之后,需要关闭资源,关闭高级流,低级流也会自动关闭的。
        bw.close();
    }
}

运行结果:

        2)字符输入缓冲流进行将文件的内容进行打印

代码如下:

import java.io.*;

public class BufferedR {
    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("D:\\software\\code\\2023_java\\2023_java_code\\code_24_25\\src\\MyIO\\Text.text");
        BufferedReader br = new BufferedReader(reader);

        //开始读文件操作
        String len;
        while ((len = br.readLine()) != null){
            System.out.println(len);
        }
        //结束程序需要关闭资源
        br.close();
    }
}

运行结果:

        2.0 转换流概述

        在 Java 中,字符流和字节流之间存在着转换的需求。字符流用于处理文本数据,而字节流用于处理二进制数据。转换流提供了 InputStreamReader 和 OutputStreamWriter 两个类,用于将字节流转换为字符流或将字符流转换为字节流。

        InputStreamReader 类从字节流中读取数据,并根据指定的字符编码将字节数据转换为字符数据;OutputStreamWriter 类将字符数据按照指定的字符编码转换为字节数据并写入到字节流中。

转换流的主要作用包括:

        1)字节流和字符流之间的转换:转换流可以方便地将字节流转换为字符流,或将字符流转换为字节流。

        2)字符编码和解码:转换流可以指定字符编码,用于将字节数据转换为字符数据或将字符数据转换为字节数据。

        3)处理文本数据:转换流通常用于处理文本数据,提供了更方便的字符操作方法。

        2.1 字符输入转换流的实例( InputStreamReader 类)

        简单来说,InputStreamReader 将读取的字节流转化为字符流,并且如果读取的是用 GBK 编码集进行编码的,在 UTF 环境下进行编码时,则需要指定用 GBK 编码集进行编码。

代码如下:

import java.io.*;

public class demo1 {
    public static void main(String[] args) throws FileNotFoundException {
        try(InputStream inputStream = new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\ExchangeStreams\\Text");

            //将读取的文件字节流转化为字符流,并指定用GBK编码集进行编码
            Reader inputStreamReader = new InputStreamReader(inputStream,"GBK");
            //再将其转化为缓冲流
            BufferedReader br = new BufferedReader(inputStreamReader);
        ){
            String str;
            while ((str = br.readLine()) != null){
                System.out.println(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

        2.2 字符输出转化流的实例(OutputStreamWriter 类)

        简单来说,把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。就是将字节输出流转换为字符输出流,并且按指定的编码集编码输出。

代码如下:

import java.io.*;

public class demo2 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\ExchangeStreams\\T");
            //将字节输出流转化为字符输出转换流
            Writer osw = new OutputStreamWriter(outputStream,"GBK");
            //再将字符输出转化流升级为缓冲流
            BufferedWriter bw = new BufferedWriter(osw);
        ) {
            bw.write("在这个美丽的世界里,每一天都是新的开始。阳光洒在大地上,微风拂过脸庞,让人感受到生命的美好。");
            bw.newLine();
            bw.write("无论遇到怎样的困难和挑战,我们都要勇敢面对,坚定前行。生活充满了无限可能,让我们抓住每一个机会,追逐自己的梦想。");
            bw.newLine();
            bw.write("愿每个人都能拥有快乐与幸福,享受生活的点滴美好。");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

        3.0 打印流概述

        打印流 :PrintStream 和 PrintWriter 是 Java I/O 中的高级流,用于将各种数据类型格式化并输出到目标设备,如控制台、文件或网络连接。PrintStream 和 PrintWriter 提供了方便的方法来输出各种数据类型,包括基本数据类型、字符串、对象等。

        简单来说:打印什么内容,就会输出什么内容。

        3.1 字节打印流(PrintStream 类)

构造方法:

        1)public PrintStream(OutputStream/File/String):打印流直接通向字节输出流/文件/文件路径。

        2)public PrintStream(String fileName,Charset charset):可以指定写出去的字符编码。

        3)public PrintStream(OutputStream out,boolean autoFlush):可以指定实现自动刷新。

        4)public PrintStream(OutputStream out,boolean autoFlush,String encoding):可以指定实现自动刷新,并可指定字符的编码。

常用的方法:

        1)public void println(xxx):打印任意类型的数据出去。

        2)public void write(int / byte[] / byte[] 一部分):可以支持写字节数据出去。

代码演示:

import java.io.IOException;
import java.io.PrintStream;

public class MyPrintStream {
    public static void main(String[] args) {
        try(PrintStream printStream = new PrintStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Print\\TT")
        ){
            //打印啥就会输出啥
            printStream.println(111);
            printStream.println( );
            printStream.println('A');
            printStream.println("你好世界");
            printStream.println("你好小鸭");
            printStream.println();
            printStream.println("你好小扳");

            //支持输出字节数据
            printStream.write(98);
            printStream.write('A');
            printStream.write("你好小狗".getBytes());

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

运行结果:

        3.2 字符打印流(PrintWrite 类)

构造方法:

        1)public PrintWrite(OutputStream/File/String/Write):打印流直接通向字节输出流/文件/文件路径/字符输出流。

        2)public PrintWrite(String fileName,Charset charset):可以指定写出去的字符编码。

        3)public PrintWrite(OutputStream out/Write,boolean autoFlush):可以指定实现自动刷新。

        4)public PrintWrite(OutputStream out,boolean autoFlush,String encoding):可以指定实现自动刷新,并可指定字符的编码。

常用的方法:

        1)public void println(xxx):打印任意类型的数据出去,打印什么就输出什么内容。

        2)public void write(int/String/char[]/...):可以支持写字符数据出去。

代码演示:

import java.io.IOException;
import java.io.PrintWriter;

public class MyPrintWrite {
    public static void main(String[] args) {
        try(PrintWriter printWriter = new PrintWriter("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Print\\TT")){
            printWriter.println(1);
            printWriter.println("你好鸭小鸭");
            printWriter.println("你好鸭小猫");
            printWriter.println("你好鸭小狗");
            printWriter.println();
            printWriter.println("A");
            printWriter.println('a');
            printWriter.println("你好鸭小板");

            //还支持字符输入流
            printWriter.write(98);
            printWriter.write("A");
            printWriter.write("你好鸭小童");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

运行结果:

补充:如果需要追加数据,则需要用到低级流对象作为高级流的参数,低级流构造器中第二个参数 true 可以实现数据追加。

代码如下:

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class MyPrintWrite {
    public static void main(String[] args) {
        try(PrintWriter printWriter = new PrintWriter(new FileWriter("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Print\\TT",true))){
            printWriter.println(1);
            printWriter.println("你好鸭小鸭");
            printWriter.println("你好鸭小猫");
            printWriter.println("你好鸭小狗");
            printWriter.println();
            printWriter.println("A");
            printWriter.println('a');
            printWriter.println("你好鸭小板");

            //还支持字符输入流
            printWriter.write(98);
            printWriter.write("A");
            printWriter.write("你好鸭小童");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

运行结果:

        4.0 数据流概述

        数据流是 Java I/O 中的一种特殊流,用于读取或写入原始数据类型(如 int、double、char 等)而不是字节或字符。数据流提供了方便的方法来读取和写入基本数据类型,避免了手动进行数据类型转换的繁琐工作。

        在 Java 中,数据流主要包括 DataInputStream 和 DataOutputStream。它们分别是字节数据流和字符数据流的装饰器,可以包装其他输入流或输出流,以便读取或写入基本数据类型。

        适用于网络通信和文件操作:数据流常用于网络通信和文件操作中,方便地读取和写入基本数据类型。

        4.1 数据输出流(DataOutputStream 类)

构造方法:

        public DataOutputStream(OutputStream out):创建新数据输出包装基础的字节输出流。

常用的方法:

        1)public final void writeByte(byte v):将 byte 类型的数据写入基础的字节输出流。

        2)public final void writeInt(int v):将 int 类型的数据写入基础的字节输出流。

        3)public final void writeDouble(Double v):将 double 类型的数据写入基础的字节输出流。

        4)public final void writeUTF(String str):将字符串数据以 UTF-8 编码成字节写入基础的字节输出流。

        5)public void write(int/byte[]/byte[] 一部分):支持写字节数据出去。

代码演示:

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class MyDataInOutStream {
    public static void main(String[] args) {
        //先创建低级输出流
        try(OutputStream os = new FileOutputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Data\\DataText");
            //再继续转化为高级流
            DataOutputStream dos = new DataOutputStream(os);
        ){
            dos.writeByte(1);
            dos.writeInt(333);
            dos.writeDouble(333.01);
            dos.writeUTF("你好鸭小蜜蜂!!!!");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

运行结果:

        需要注意的是:这是正常的情况而不是乱码,这是一个特殊的存储方法,可以理解为将类型和内容进行了“打包”。主要是为了,方便取数据而不是给程序员看的。

        4.2 数据输入流(DataInputStream 类)

        用于读取数据输出流写出去的数据。注意读取的顺序应该跟写数据的顺序保持一致。

构造方法:

        public DataInputStream(InputStream is):创建新数据输入流包装基础的字节输入流。

常用的方法:

        1)public final byte readByte():读取字节数据返回。

        2)public final int readInt():读取 int 类型的数据返回。

        3)public final double readDouble():读取 double 类型的数据返回。

        4)public final String readUTF():读取字符串(UTF-8)数据返回。

        5)public int read(byte[]):支持字节数据进来。

代码演示:

import java.io.*;

public class MyDataInputStream {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Data\\DataText");
            DataInputStream dis = new DataInputStream(inputStream);
        ){
            byte b = dis.readByte();
            System.out.println(b);
            int i = dis.readInt();
            System.out.println(i);
            double dl = dis.readDouble();
            System.out.println(dl);
            String str = dis.readUTF();
            System.out.println(str);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

运行结果:

        5.0 序列化流概述

        序列化流是 Java I/O 中的一种特殊流,用于将对象转换为字节序列以便存储或传输,或将字节序列转换回对象。序列化流主要用于实现对象的持久化存储和网络传输。

        在 Java 中,常用的序列化流包括 ObjectOutputStream 和 ObjectInputStream。它们可以分别用于将对象写入输出流并序列化为字节流,以及从输入流中读取字节流并反序列化为对象。

特点:

        将对象转换为字节序列:序列化流可以将 Java 对象转换为字节序列,以便存储在文件中或通过网络传输。

        反序列化:序列化流也可以将字节序列反序列化为对象,恢复对象的状态。

        注意:对象如果需要序列化,必须实现序列化接口( Serializable )。

        5.1 对象字节输出流(ObjectOutputStream 类)

        可以把 Java 对象进行序列化,把 Java 对象存入到文件中去。

构造方法:

        public ObjectOutputStream(OutputStream out):创建对象字节输出流,包装基础的字节输出流。

常用方法:

        public final void writeObject(Object o):把对象写出去。

代码演示:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class MyObjectOutputStream {
    public static void main(String[] args) {
        try(//先创建一个低级输出流
            OutputStream os = new FileOutputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Object\\ObjectText");
            //创建序列化流
            ObjectOutputStream oos = new ObjectOutputStream(os);
            ){
            //将用户对象写入到文件中
            User user = new User("小蜜蜂","001",18,"123456");
            oos.writeObject(user);
            System.out.println("序列化创建成功!!!");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

        注意:以上的情况不是出现乱码,是属于正常情况。将对象写进文件中,不是给人看的,为了方便取数据。

        5.2 对象字节输入流(ObjectInputStream 类)

        把 Java 对象进行反序列化:把存储再文件中的 Java 对象读入到内存中来。

构造方法:

        public ObjectInputStream(InputStream is):创建对象字节输入流,包装基础的字节输入流。

常用的方法:

        public final Object readObject():把存储在文件中的 Java 对象读出来。

代码演示:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class MyObjectInputStream {
    public static void main(String[] args) {
        try(
            //低级输出流//再利用低级流作为参数来创建对象输出流
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Object\\ObjectText"));){
            User user = (User) ois.readObject();
            //将对象进行输出
            System.out.println(user);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

        假设:需求进行序列化的时候,不能将密码进行序列化操作,则可以用 transient 修饰成员变量。

        这样就序列化的时候,不会将密码这个成员变量进行序列化操作。

代码演示:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class MyObjectOutputStream {
    public static void main(String[] args) {
        try(//先创建一个低级输出流
            OutputStream os = new FileOutputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Object\\ObjectText");
            //创建序列化流
            ObjectOutputStream oos = new ObjectOutputStream(os);
            ){
            //将用户对象写入到文件中
            User user = new User("小蜜蜂","001",18,"123456");
            oos.writeObject(user);
            System.out.println("序列化创建成功!!!");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class MyObjectInputStream {
    public static void main(String[] args) {
        try(
            //低级输出流//再利用低级流作为参数来创建对象输出流
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_4_26\\src\\Object\\ObjectText"));){
            User user = (User) ois.readObject();
            //将对象进行输出
            System.out.println(user);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

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

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

相关文章

MySQL函数之单行函数

1.前言 我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是被 DBMS 同时支持的。比…

MySQL基础知识——MySQL索引

深入浅出索引 索引的意义 索引的意义:在大量数据中,加速访问少量特定数据; 使用索引的前提条件: 1)索引块数量小于数据块数量; 2)索引键有序,故可以使用二分查找等高效的查找方式&…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中,我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径,但是锁着一次读取配置的增多,不可避免的出现了一个问题:我们如何来监控多个日志文件,这样原来的tailFile模块相对于当下场景就…

前端到全栈进阶之“前端框架”

从前端入门到全栈-系列介绍 你会学到什么? 可能学不到什么东西,该系列是作者本人工作和学习积累,用于复习 系列介绍 现在的 Web 前端已经离不开 Node.js,我们广泛使用的 Babel、Webpack、工程化都是基于 Node 的,各…

【Linux】驱动_2_字符驱动

1. Linux设备分类 字符设备: 指应用程序按字节/字符来读写数据的设备。通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务,通常不支持随机存取数据。字符设备在实现时大多不使用缓存器。系统直接从设备读/写每一个字符。块设备: 通常支持随机存取…

【程序分享1】LAMMPS + OVITO + 晶体缺陷识别 + 点缺陷 + 分子动力学模拟

分享2个分子动力学模拟相关的程序。 1. 一种识别体心立方晶体缺陷的新方法。 2. 无后处理的分子动力学模拟中的并行点缺陷识别: lammps的计算和转储方式 。 感谢论文的原作者! 第1个程序 关键词: 1. Atomistic simulations, 2. Molecular dynamics…

让客服工作开挂的8个客服办公高效率神器

做客服工作,经常需要写文案,做图片做视频,还要能快捷回复客户,都需要有靠谱的客服办公软件支持,本文介绍了8个高效神器,希望能帮到做客服的亲 前言 做客服工作,在回答客户咨询的同时&#xff0…

2024.4.28 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、总体流程 5、网络结构 5.1、损失函数 5.2、Confidence Maps 5.3、Part Affinity Fields(PAFs) 5.4、多人的PAFs 6、实验 7、结论 深度学习 yolov8实现目标检测和人体姿态估计 Yolov8网络结构 yaml…

【亲测可用】配置镜像源

文章目录 配置镜像源1. 手动添加镜像源2. 永久配置(推荐)方法1:方法2 : 小结 配置镜像源 配置镜像源会让资源下载的更快一些 我实验了一下,都成功了的方法,推荐给你们 1.手动添加 2.永久配置 前提是你的…

好看到爆炸的弹窗公告源码

源码介绍 好看到爆炸的弹窗公告源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看到爆炸的弹窗公告源码

新标准日本语初下 课后练习作业

新版标准日本语初下 第二十五課 これは明日会議で使う資料です 第二十五課 これは明日会議で使う資料です 24-04-26 練習25-1-1 例…

Vuforia AR篇(四)— AR虚拟按钮

目录 前言一、创建虚拟按钮二、创建脚本三、效果 前言 在当今互联网和移动设备普及的背景下,**增强现实(AR)**技术正迅速成为连接现实世界与数字信息的重要桥梁。AR虚拟按钮作为这一技术的创新应用,不仅提供了一种全新的用户交互…

[极客大挑战 2019]Upload、[ACTF2020 新生赛]Upload、[MRCTF2020]你传你呢

[极客大挑战 2019]Upload 打开环境&#xff0c;是上传一句话木马的题 先上传1.php试试&#xff0c;发现不可以 试试改后缀为phtml&#xff0c;提示语句中不能包含<?&#xff0c;只能改木马&#xff1a; <script language"php">eval($_POST[line]);</sc…

ListView、RecycleView、动画、单位、ViewPager

ListView列表 老版本 public View oldGetView(int position, View convertView, ViewGroup parent) {//返回每一个item//拿到布局if (convertViewnull)convertView LayoutInflater.from(context).inflate(R.layout.my_list_view, parent, false);//find会耗时需要优化TextVi…

YOLOv8核心原理深度解析

YOLOv8源码地址: https://github.com/ultralytics/ultralytics 一、简介: 根据官方描述,Yolov8是一个SOTA模型,它建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性,使其成为实现目标检测、图像分割、姿态估计等任务的最佳选择。其具体…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…

项目管理中常用的三个工具:甘特图、看板、燃尽图

在日常项目管理的实践中&#xff0c;为了更有效地追踪项目进度、优化资源配置和提高团队协作效率&#xff0c;管理者常常会借助一些工具来辅助工作。这些工具的本质在于将抽象复杂的项目管理任务具象化、简单化&#xff0c;以更直观、方便的方式呈现出来。 以下介绍项目管理中…

Git--基础学习--面向企业--持续更新

一、基础学习 1.1基本命令 //查询基础信息 git config --global --list //选取合适位置创建 mkdir 文件名 //创建文件夹 //全局配置 git config --global user.email "****e***i" git config --global user.name "*** K****"//--------------------进入…

Linux系统编程---线程同步

一、同步概念 同步即协同步调&#xff0c;按预定的先后次序运行。 协同步调&#xff0c;对公共区域数据【按序】访问&#xff0c;防止数据混乱&#xff0c;产生与时间有关的错误。 数据混乱的原因&#xff1a; 资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线…

新建云仓库

1.GitHub新建云仓库&#xff1a; LICENSE:开源许可证&#xff1b;README.md:仓库说明文件&#xff1b;开源项目&#xff1b;cocoaPodsName.podspec: CocoaPods项目的属性描述文件。 2.Coding新建云仓库&#xff1a; 备注&#xff1a; Coding新建项目&#xff1a;