Java IO流的使用

news2024/11/26 2:31:38

IO流概述

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。下图是一个描述输入流和输出流的类层次图:

Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

IO流的分类 

按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)。

按数据流的流向不同分为:输入流,输出流。

按流的角色的不同分为:节点流,处理流。

Java的IO流共涉及40多个类,实际上大多规则,都是从如下4个抽象基类派生的。由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

IO流体系

节点流和处理流

节点流:直接从数据源或目的地读写数据

处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

InputStream & OutStream

FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取非文本数据之类的原始字节流。

序号方法及描述
1public int read() throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
2public int read(byte[] b) throws IOException
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。
3public int read(byte[] b, int off, int len) throws IOException
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。 
4public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
5public int available() throws IOException
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。
6protected void finalize()throws IOException
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。

FileOutputStream 从文件系统中的某个文件中获得输出字节。FileOutputStream 用于写出非文本数据之类的原始字节流。

序号方法及描述
1public void write(int b) throws IOException
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。
2public void write(byte[] b) throws IOException
将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
3

public void write(byte[] b,int off,int len) throws IOException

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

4

public void flush() throws IOException

刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。

5public void close() throws IOException
关闭此文件输入流并释放与此流有关的所有系统资源。
6protected void finalize() throws IOException
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。

Reader & Writer

要读取字符流,需要使用 FileReader。

序号方法及描述
1public int read() throws IOException
读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1。
2public int read(char[] cbuf) throws IOException
将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。  
3public int read(char[] cbuf,int off,int len) throws IOException
将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。 
4public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。

要写出字符流,需要使用 FileWriter。

序号方法及描述
1public void write(int c) throws IOException
写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即写入0 到 65535 之间的Unicode码。
2public void write(char[] cbuf) throws IOException
写入字符数组。
3

public void write(char[] cbuf,int off,int len) throws IOException

写入字符数组的某一部分。从off开始,写入len个字符。

4

public void write(String str) throws IOException

写入字符串。

5

public void write(String str,int off,int len) throws IOException

写入字符串的某一部分。

6

public void flush() throws IOException

刷新该流的缓冲,则立即将它们写入预期目标。

5public void close() throws IOException
关闭此文件输入流并释放与此流有关的所有系统资源。

节点流(文件流)

读取文件

1.建立一个流对象,将已存在的一个文件加载进流。

FileReader fr = new FileReader(new File("Test.txt"));

2.创建一个临时存放数据的数组。

char[] ch = new char[1024];

3.调用流对象的读取方法将流中的数据读入到数组中。

fr.read(ch);

4. 关闭资源。

fr.close();

示例

FileReader fr = null;
try {
    fr = new FileReader(new File("c:\\test.txt"));
    char[] buf = new char[1024];
    int len;
    while ((len = fr.read(buf)) != -1) {
        System.out.print(new String(buf, 0, len));
    }
} catch (IOException e) {
    System.out.println("read-Exception :" + e.getMessage());
} finally {
    if (fr != null) {
        try {
            fr.close();
        } catch (IOException e) {
            System.out.println("close-Exception :" + e.getMessage());
        } 
    } 
}

写入文件

1.创建流对象,建立数据存放文件。

FileWriter fw = new FileWriter(new File("Test.txt"));

2.调用流对象的写入方法,将数据写入流。

fw.write("爪哇菌来了,快跑啊!");

3.关闭流资源,并将流中的数据清空到文件中。

fw.close();

示例

FileWriter fw = null;
try {
    fw = new FileWriter(new File("Test.txt"));
    fw.write("爪哇菌来了,快跑啊!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fw != null)
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        } 
}

注意点

        定义文件路径时,注意:可以用“/”或者“\\”。
        在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文件将被覆盖。
        如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖,在文件内容末尾追加内容。
        在读取文件时,必须保证该文件已存在,否则报异常。
        字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
        字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。

缓冲流

为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。

缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:

        BufferedInputStream 和 BufferedOutputStream
        BufferedReader 和 BufferedWriter

当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。

当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。

向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流。flush()方法的使用:手动将buffer中内容写入文件。

关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流。如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出。

BufferedReader br = null;
BufferedWriter bw = null;
try {
    // 创建缓冲流对象:它是处理流,是对节点流的包装
    br = new BufferedReader(new FileReader("d:\\test\\source.txt"));
    bw = new BufferedWriter(new FileWriter("d:\\test\\dest.txt"));
    String str;
    while ((str = br.readLine()) != null) { // 一次读取字符文本文件的一行字符
        bw.write(str); // 一次写入一行字符串
        bw.newLine(); // 写入行分隔符
    }
    bw.flush(); // 刷新缓冲区
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 关闭IO流对象
    try {
        if (bw != null) {
            bw.close(); // 关闭过滤流时,会自动关闭它所包装的底层节点流
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        if (br != null) {
            br.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

转换流

转换流提供了在字节流和字符流之间的转换。Java API提供了两个转换流:

        InputStreamReader:将InputStream转换为Reader
        OutputStreamWriter:将Writer转换为OutputStream

字节流中的数据都是字符时,转成字符流操作更高效。 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。

InputStreamReader

实现将字节的输入流按指定字符集转换为字符的输入流。需要和InputStream“套接”。

构造器:

        public InputStreamReader(InputStream in)
        public InputSreamReader(InputStream in,String charsetName)

Reader isr = new InputStreamReader(System.in, "gbk");

OutputStreamWriter

实现将字符的输出流按指定字符集转换为字节的输出流。需要和OutputStream“套接”。

构造器:

        public OutputStreamWriter(OutputStream out)
        public OutputSreamWriter(OutputStream out,String charsetName)

 

public void testMyInput() throws Exception {
    FileInputStream fis = new FileInputStream("dbcp.txt");
    FileOutputStream fos = new FileOutputStream("dbcp5.txt");
    InputStreamReader isr = new InputStreamReader(fis, "GBK");
    OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
    BufferedReader br = new BufferedReader(isr);
    BufferedWriter bw = new BufferedWriter(osw);
    String str = null;
    while ((str = br.readLine()) != null) {
        bw.write(str);
        bw.newLine();
        bw.flush();
    }
    bw.close();
    br.close();
}

标准输入、输出流

System.in和System.out分别代表了系统标准的输入和输出设备。默认输入设备是 键盘,输出设备是 显示器。

System.in的类型是InputStream;System.out的类型是PrintStream,它是OutputStream的子类FilterOutputStream 的子类。

重定向:通过System类的setIn,setOut方法对默认设备进行改变。

        public static void setIn(InputStream in)
        public static void setOut(PrintStream out)

示例:

从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续进行输入操作,直至当输入“e”或者“exit”时,退出程序。

System.out.println("请输入信息(退出输入e或exit):");
// 把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = null;
try {
    while ((s = br.readLine()) != null) { // 读取用户输入的一行数据 --> 阻塞程序
        if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)) {
            System.out.println("安全退出!!");
            break; 
        }
        // 将读取到的整行字符串转成大写输出
        System.out.println("-->:" + s.toUpperCase());
        System.out.println("继续输入信息");
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (br != null) {
            br.close(); // 关闭过滤流时,会自动关闭它包装的底层节点流
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

打印流

实现将基本数据类型的数据格式转化为字符串输出。

PrintStream和PrintWriter:

        提供了一系列重载的print()和println()方法,用于多种数据类型的输出;

        PrintStream和PrintWriter的输出不会抛出IOException异常;

        PrintStream和PrintWriter有自动flush功能;

        PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节;

        在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类; 

        System.out返回的是PrintStream的实例。

PrintStream ps = null;
try {
    FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));
    // 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)
    ps = new PrintStream(fos, true);
    if (ps != null) {// 把标准输出流(控制台输出)改成文件
        System.setOut(ps);
    }
    for (int i = 0; i <= 255; i++) { // 输出ASCII字符
        System.out.print((char) i);
        if (i % 50 == 0) { // 每50个数据一行
            System.out.println(); // 换行
        } 
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (ps != null) {
        ps.close();
    } 
}

数据流

为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。

数据流有两个类:DataInputStream 和 DataOutputStream(用于读取和写出基本数据类型、String类的数据),分别“套接”在 InputStream 和 OutputStream 子类的流上。

DataInputStream中的方法

序号方法及描述
1boolean readBoolean()         读取布尔值
2byte readByte()        读取字节
3char readChar()        读取字符
4float readFloat()        读取单精度浮点数
5double readDouble()        读取双精度浮点数
6short readShort()        读取短整数
7long readLong()        读取长整数
8int readInt()        读取整数
9String readUTF()        读取UTF字符
10void readFully(byte[] b)

DataOutputStream中的方法

将上述的方法的read改为相应的write即可。

DataOutputStream dos = null;
try { // 创建连接到指定文件的数据输出流对象
    dos = new DataOutputStream(new FileOutputStream("destData.dat"));
    dos.writeUTF("我爱爪哇菌"); // 写UTF字符串
    dos.writeBoolean(false); // 写入布尔值
    dos.writeLong(1234567890L); // 写入长整数
    System.out.println("写文件成功!");
} catch (IOException e) {
    e.printStackTrace();
} finally { // 关闭流对象
    try {
        if (dos != null) {
            // 关闭过滤流时,会自动关闭它包装的底层节点流
            dos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
}
DataInputStream dis = null;
try {
    dis = new DataInputStream(new FileInputStream("destData.dat"));
    String info = dis.readUTF();
    boolean flag = dis.readBoolean();
    long time = dis.readLong();
    System.out.println(info);
    System.out.println(flag);
    System.out.println(time);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (dis != null) {
        try {
            dis.close();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    } 
}

对象流

ObjectInputStream和OjbectOutputSteam

用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

序列化:用ObjectOutputStream类保存基本类型数据或对象的机制。
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制。

ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。

对象的序列化

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。

序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是JavaEE 平台的基础。

如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现 Serializable 或 Externalizable 接口之一。否则,会抛出NotSerializableException异常。

serialVersionUID

凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:

private static final long serialVersionUID;

serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。

如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID 可能发生变化。故建议,显式声明。

简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。

使用对象流序列化对象

若某个类实现了 Serializable 接口,该类的对象就是可序列化的:

        创建一个 ObjectOutputStream;
        调用 ObjectOutputStream 对象的 writeObject(对象) 方法输出可序列化对象;
        注意写出一次,操作flush()一次;

反序列化:

        创建一个 ObjectInputStream;
        调用 readObject() 方法读取流中的对象;

如果某个类的属性不是基本数据类型或 String 类型,而是另一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的Field 的类也不能序列化。

//序列化:将对象写入到磁盘或者进行网络传输。
//要求对象必须实现序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.txt"));
Person p = new Person("爪哇菌", 18, "中华门");
oos.writeObject(p);
oos.flush();
oos.close();
//反序列化:将磁盘中的对象数据源读出。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.txt"));
Person p1 = (Person)ois.readObject();
System.out.println(p1.toString());
ois.close();


RandomAccessFile类

RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DataInput、DataOutput 这两个接口,也就意味着这个类既可以读也可以写。

RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。

        支持只访问文件的部分内容;
        可以向已存在的文件后追加内容;

RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:

        long getFilePointer():获取文件记录指针的当前位置;
        void seek(long pos):将文件记录指针定位到 pos 位置;

构造器:

        public RandomAccessFile(File file, String mode) 
        public RandomAccessFile(String name, String mode) 

创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:

        r:以只读方式打开
        rw:打开以便读取和写入
        rwd:打开以便读取和写入;同步文件内容的更新
        rws:打开以便读取和写入;同步文件内容和元数据的更新

如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。

//读取文件内容
RandomAccessFile raf = new RandomAccessFile(“test.txt”, “rw”);
raf.seek(5);
byte [] b = new byte[1024];
int off = 0;
int len = 5;
raf.read(b, off, len);
String str = new String(b, 0, len);
System.out.println(str);
raf.close();
//写入文件内容
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
raf.seek(5);
//先读出来
String temp = raf.readLine();
raf.seek(5);
raf.write("xyz".getBytes());
raf.write(temp.getBytes());
raf.close();


 

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

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

相关文章

SQLite数据库介绍以及安装

SQLite简介 轻量化&#xff0c;易用的嵌入式数据库&#xff0c;用于设备端的数据管理&#xff0c;可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备&#xff0c;更加复杂 SQLite是一个无服务器的数据库&#xff0c;是自包含的。这也称为嵌入式数据库&#xff0c…

栈--C语言实现数据结构

本期带大家一起用C语言实现栈&#x1f308;&#x1f308;&#x1f308; 一、栈的概念&#x1f30e; 栈是一种常见的数据结构&#xff0c;它遵循后进先出&#xff08;Last In, First Out&#xff09;的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。 栈由一个连续的内…

前端:运用html+css+js模仿京东上商品图片区域放大特效

前端:运用htmlcssjs模仿京东上商品图片区域放大特效 1. 前言2. 前端界面3. js实现鼠标移入效果4. 实现代码 1. 前言 最近在网页端浏览京东上的商品时&#xff0c;觉得上面的那张gif图片上实现的特效不错&#xff0c;于是自己打算使用htmlcssjs技术来实现一下上述特效效果&#…

【Ceph】Ceph集群应用详解

Ceph集群应用详解 1. 资源池Pool管理1.1 查看Pool集群信息的三种方式1.2 删除Pool资源池 2.创建CephFS文件系统MDS接口2.1 创建cephfs2.2 基于内核的客户端挂载2.3 基于fuse工具方式的客户端挂载 3.创建Ceph块存储系统RBD接口3.1 删除镜像3.2 还原镜像3.3 在线扩容3.4 回滚镜像…

flutter开发实战-卡片翻转动画效果Transform+IndexedStack+rotateAnimation

flutter开发实战-实现卡片翻转动画效果 之前开发中遇到了商品卡片翻转&#xff0c;商品正面是商品图片、商品名称&#xff1b;背面是商品价格&#xff0c;需要做卡片翻转动画。 动画实现即&#xff1a;在一段时间内&#xff0c;快速地多次改变UI外观&#xff1b;由于人眼会产生…

Ext JS中定义和使用类Ext JS风格的html 按钮

Ext JS 的按钮样式如下: 按钮的背景色默认为应用的主色调或是灰色系, 也可以通过样式设置按钮的背景色, 详细可以参考: Ext JS 如何设置工具栏按钮和一般按钮保持统一样式 但是, 在实际开发的场景中有可能某些按钮是不能通过Ext JS的Button 类进行创建的, 但是页面效果…

第三章:内存管理——C++的内存管理方式

系列文章目录 文章目录 系列文章目录前言C/C内存分布C语言中动态内存管理方式面试题 C内存管理模式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数new和delete的实现原理内置类型自定义类型 定位new表达式(placement-new)常见面试题mallo…

JDBC 驱动程序类型

什么是JDBC驱动程序&#xff1f; JDBC驱动程序在JDBC API中实现了已定义的接口&#xff0c;用于与数据库服务器进行交互。 例如&#xff0c;使用JDBC驱动程序&#xff0c;您可以通过发送SQL或数据库命令&#xff0c;然后使用Java接收结果来打开数据库连接并与其进行交互。 J…

el-date-picker 宽度溢出浏览器问题

原文链接&#xff1a; el-date-picker 宽度溢出浏览器问题 问题由来 <el-date-picker v-model"Time" type"datetimerange"range-separator"至"start-placeholder"年/月/日 时:分:秒"end-placeholder"年/月/日 时:分:秒"…

通过迁移加速计划迁移到亚马逊云科技

公司出于许多不同的原因迁移到云。也许他们需要关闭一个老化的数据中心。或者&#xff0c;他们正在寻找太昂贵或太难在内部构建和维护的新功能。无论出于何种原因&#xff0c;在开始规划迁移之前&#xff0c;他们还有另一个问题需要回答&#xff1a;哪种云服务适合他们的需求&a…

基于互一致性学习的半监督医学图像分割

文章目录 Mutual Consistency Learning for Semi-supervised Medical Image Segmentation摘要本文方法实验结果 Mutual Consistency Learning for Semi-supervised Medical Image Segmentation 摘要 提出了一种新的互一致性网络(MC-Net)来有效地利用未标记数据进行半监督医学…

修复git diff正文中文乱码

Linux git diff正文中文乱码 在命令行下输入以下命令&#xff1a; $ git config --global core.quotepath false # 显示 status 编码 $ git config --global gui.encoding utf-8 # 图形界面编码 $ git config --global i18n.commit.encoding utf-8 # …

安装linux子系统时,出现的问题

目录 一、事故原因&#xff1a;适配linux子系统问题 二、事故问题&#xff1a;wsl版本问题 一、事故原因&#xff1a;适配linux子系统问题 事故全文&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Err…

springboot sentinel 安装 整合 样例-分布式/微服务流量控制

sentinel控制台安装 下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases 本次版本&#xff1a;1.8.6 后台启动&#xff1a; nohup java -Dserver.port7080 -Dcsp.sentinel.dashboard.serverlocalhost:7080 -Dproject.namesentinel-dashboard -jar sentinel-…

基于文本内容的垃圾短信识别实战

1、实战的背景与目标 背景&#xff1a; 垃圾短信形式日益多变&#xff0c;相关报告可以在下面网站查看 360互联网安全中心&#xff08;http://zt.360.cn/report/&#xff09; 目标&#xff1a; 基于短信文本内容&#xff0c;建立识别模型&#xff0c;准确地识别出垃圾短信…

【LeetCode热题100】打卡第38天:课程表实现前缀树

文章目录 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树⛅前言 课程表&#x1f512;题目&#x1f511;题解 实现前缀树&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树 ⛅前言 大家好&#xff0c;我是…

udx实现揭秘之---------udx的慢启动带宽探测

我们都知道bew wnd*1000/rtt 当慢启动的时候&#xff0c;每收一个ack,可以这样调整发送速度当前sendspeed sendspeed mss/rtt.并且更新wnd->wnd1. udx的变形版本是sendspeed checksize/rtt; 但是这种增加速度太快&#xff0c;在到达临界点的时候&#xff0c;很容易击…

低功耗设计:为可持续发展带来能源效率的突破

引言&#xff1a; 低功耗设计是面向电子设备和系统的一种设计理念&#xff0c;旨在降低设备的能耗和功耗&#xff0c;提高能源利用效率。在当前节能环保的背景下&#xff0c;低功耗设计成为了电子行业的热门话题&#xff0c;它对于延长电池寿命、提高设备性能和减少能源消耗具有…

选读SQL经典实例笔记08_区间查询

1. 计算同一组或分区的行之间的差 1.1. 最终结果集 1.1.1. sql DEPTNO ENAME SAL HIREDATE DIFF ------ ---------- ---------- ----------- ----------10 CLARK 2450 09-JUN-1981 -255010 KING 5000 17-NOV-1981 370010 …

20 - 队列 - 链队列——队列的链式表示和实现

前面我们学习了 先进先出、后进后出 的线性表- 队列,并且我们是使用数组进行了实现,那么这节课我们来使用链表来实现队列,即链队列! 队列的定义 队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端…