玩转Java IO流:轻松读写文件、网络

news2024/11/16 13:55:08

申明:本人于公众号Java筑基期,CSDN先后发当前文章,标明原创,转载二次发文请注明转载公众号,另外请不要再标原创 ,注意违规

字符流和字节流

在Java中,IO(输入输出)操作涉及字符流和字节流。它们是两种不同的抽象类,用于处理不同类型的数据。

下面我会对字符流和字节流进行简单的解释:

  1. 字节流(Byte Stream)

    • 字节流是以字节为单位进行读写数据的IO流。

    • InputStreamOutputStream是字节流的抽象类。

    • 字节流适用于处理二进制数据,例如图像、音频、视频文件等。

    • 示例:

    • FileInputStream用于从文件读取字节数据

      public static void main(String[] args) {
              String filePath = "D:\\xxx\\resources\\readme.txt";
      ​
              try (FileInputStream fis = new FileInputStream(filePath)) {
                  byte[] buffer = new byte[1024]; // 缓冲区大小,用于存储读取的字节数据
                  int bytesRead; // 每次读取的字节数
      ​
                  // 使用 while 循环读取文件中的字节数据
                  while ((bytesRead = fis.read(buffer)) != -1) {
                      // 在这里处理读取的字节数据
                      // 注意:buffer 中的最后几个字节可能是无效数据,需要根据 bytesRead 的值来确定实际有效的字节数
                      for (int i = 0; i < bytesRead; i++) {
                          // 处理字节数据,例如打印每个字节的值
                          System.out.print(buffer[i] + " ");
                      }
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

    • FileOutputStream用于将字节数据写入文件。

      public class OutputMain {
          public static void main(String[] args) {
              String filePath = "D:\\xxx\\resources\\readme.txt";
              byte[] data = "Hello, FileOutputStream!".getBytes(); // 要写入文件的字节数据
      ​
              try (FileOutputStream fos = new FileOutputStream(filePath)) {
                  fos.write(data); // 将字节数据写入文件
                  System.out.println("数据写入成功!");
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }

       

    • ByteArrayInputStreamByteArrayOutputStream来读写文件

      public static void main(String[] args) {
          String sourceFilePath = "D:\\xxx\\resources\\readme.txt";
          String destinationFilePath = "D:\\xxx\\resources\\write.txt";
      ​
          try (FileInputStream fis = new FileInputStream(sourceFilePath);
               ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
      ​
              // 使用一个缓冲区来读取文件内容
              byte[] buffer = new byte[1024];
              int bytesRead;
      ​
              // 读取文件内容并写入 ByteArrayOutputStream 中
              while ((bytesRead = fis.read(buffer)) != -1) {
                  baos.write(buffer, 0, bytesRead);
              }
      ​
              // 将 ByteArrayOutputStream 中的内容写入另一个文件
              try (ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                   FileOutputStream fos = new FileOutputStream(destinationFilePath)) {
      ​
                  // 使用一个缓冲区来写入文件内容
                  byte[] writeBuffer = new byte[1024];
                  int bytesWritten;
      ​
                  // 从 ByteArrayInputStream 中读取内容并写入文件
                  while ((bytesWritten = bais.read(writeBuffer)) != -1) {
                      fos.write(writeBuffer, 0, bytesWritten);
                  }
      ​
                  System.out.println("文件内容写入成功!");
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
      }

  2. 字符流(Character Stream)

    • 字符流是以字符为单位进行读写数据的IO流。

    • ReaderWriter是字符流的抽象类。

    • 字符流适用于处理文本数据,例如文本文件中的字符数据。

    • 字符流会自动处理字符的编码和解码,支持指定字符集进行数据读写。

    • 示例:

    • FileReader用于从文件读取字符数据

      public static void main(String[] args) {
          String filePath = "D:\\xxx\\resources\\readme.txt";
      ​
          try (FileReader fileReader = new FileReader(filePath)) {
              int data; // 用于存储每次读取的字符数据
      ​
              // 使用 while 循环读取文件中的字符数据
              while ((data = fileReader.read()) != -1) {
                  // 在这里处理读取的字符数据
                  // 注意:data 是一个 int 值,代表读取的字符的 ASCII 码
                  char character = (char) data; // 将 int 转换为 char
                  System.out.print(character);
              }
              System.out.println();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }

       

    • FileWriter用于将字符数据写入文件。

      public static void main(String[] args) {
          String filePath = "D:\\xxx\\resources\\readme.txt";
          String data = "Hello, FileWriter!"; // 要写入文件的字符数据
      ​
          try (FileWriter fileWriter = new FileWriter(filePath)) {
              fileWriter.write(data); // 将字符数据写入文件
              System.out.println("数据写入成功!");
          } catch (IOException e) {
              e.printStackTrace();
          }
      }

    • BufferedReaderBufferedWriter 它们提供缓冲功能,提高IO性能

      public static void main(String[] args) {
              String sourceFilePath = "D:\\xxx\\resources\\readme.txt";
              String destinationFilePath = "D:\\xxx\\resources\\write.txt";
      ​
              try (BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath));
                   BufferedWriter writer = new BufferedWriter(new FileWriter(destinationFilePath))) {
      ​
                  String line; // 用于存储每次读取的行数据
      ​
                  // 使用 while 循环读取文件中的每一行数据
                  while ((line = reader.readLine()) != null) {
                      // 在这里处理读取的行数据
                      // 例如,可以在写入文件时添加额外的内容
                      String processedLine = "Processed: " + line;
                      writer.write(processedLine);
                      writer.newLine(); // 写入一个换行符,以分隔不同行的数据
                  }
      ​
                  System.out.println("文件内容写入成功!");
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

总结:

  • 字节流适用于处理二进制数据,以字节为单位读写。

  • 字符流适用于处理文本数据,以字符为单位读写,并自动处理字符的编码和解码。

  • 通常情况下,如果处理文本数据,使用字符流更加方便,因为它会自动处理字符编码的问题,而字节流通常用于处理非文本的二进制数据。

对象序列化

对象序列化是将对象转换成字节序列的过程,以便可以将其保存到文件中或通过网络传输。

在Java中,通过实现 Serializable 接口,可以使一个类成为可序列化的,也就是可以被序列化为字节流。序列化后的字节流可以保存到文件、数据库或进行网络传输,而在需要时,可以通过反序列化将字节流还原成原始的Java对象。

实现对象序列化的步骤:

  1. 让类实现 Serializable 接口,该接口是一个标记接口,没有需要实现的方法。

    class MyClass implements Serializable {
        
        private String name;
        
        private int age;
    ​
        private transient String tel;
    ​
        public MyClass(String name, int age,String tel) {
            this.name = name;
            this.age = age;
            this.tel = tel;
        }
    ​
        public String getName() {
            return name;
        }
    ​
        public int getAge() {
            return age;
        }
    ​
        public String getTel() {
            return tel;
        }
    }

    Serializable 是一个标记接口(marker interface),它没有任何方法需要实现。当一个类实现了 Serializable 接口时,表示该类的对象可以被序列化。

    在某些情况下,我们希望在序列化过程中排除某些敏感信息或不需要序列化的数据。在成员变量声明前加上 transient 关键字,可以将该成员变量标记为瞬态(transient),表示它不参与对象的序列化。在反序列化时,这些成员变量的值将被初始化为默认值(对于基本数据类型是0,对于对象引用是null)。

  2. 在类中定义需要保存的成员变量和方法。

    // 创建一个示例对象,假设它是一个可序列化的类的实例
    MyClass obj = new MyClass("John Doe", 30,"123456789");
  3. 使用 ObjectOutputStream 将对象序列化为字节流。

    String filePath = "D:\\xxx\\resources\\readme.txt";
    FileOutputStream fos = new FileOutputStream(filePath);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    // 将对象写入文件,实现对象的序列化
    oos.writeObject(obj);
  4. 使用 ObjectInputStream 将字节流反序列化为原始的Java对象。

    FileInputStream fis = new FileInputStream(filePath);
    ObjectInputStream ois = new ObjectInputStream(fis)
    // 从文件读取对象,实现对象的反序列化
    MyClass obj = (MyClass) ois.readObject();
    // 对象已经反序列化为原始的Java对象,可以使用它了
    System.out.println("反序列化后的对象:");
    System.out.println("Name: " + obj.getName());
    System.out.println("Age: " + obj.getAge());
    System.out.println("Tel: " + obj.getTel());

输出:

 

除了tel以外,其他的确实是序列化进去了。

字符集和编码

在Java中,字符集(Character Set)和编码(Encoding)是涉及文本字符处理的重要概念。在Java中,字符集(Character Set)和编码(Encoding)是涉及文本字符处理的重要概念。

字符集(Character Set): 字符集是一组字符的集合,它将字符映射到唯一的整数值,也称为字符编码点(Code Point)。每个字符都有一个唯一的字符编码点,字符集中的字符编码点是固定的。

在Java中,char 类型代表一个16位的Unicode字符,因此Java的字符集采用的是Unicode字符集,即字符编码点的范围是0x0000至0xFFFF。Unicode字符集允许覆盖几乎所有的世界语言和符号。

编码(Encoding): 编码是将字符编码点映射成字节序列的过程。由于计算机中处理的是二进制数据,因此文本字符需要转换成字节才能在计算机中存储和传输。

UTF-8和UTF-16是两种常见的Unicode编码方案:

  1. UTF-8: UTF-8(8-bit Unicode Transformation Format)是一种可变长度的编码方案。它使用1至4个字节表示一个Unicode字符,对于常用的ASCII字符,UTF-8只使用1个字节,而对于非ASCII字符,使用多个字节进行编码。UTF-8编码在存储和传输文本时节省空间,因为它对于英文字符使用较少的字节。

  2. UTF-16: UTF-16(16-bit Unicode Transformation Format)是一种固定长度的编码方案。它使用2或4个字节表示一个Unicode字符。UTF-16编码对于大部分字符使用2个字节,而对于一些辅助字符,使用4个字节进行编码。

在Java中,默认的编码方案取决于平台和系统的设置,通常情况下,Java使用UTF-8编码来处理文本数据,但可以通过设置特定的编码方式来控制文本的读写和传输。

例如,在使用 FileReaderFileWriter 读写文本文件时,默认使用的是系统的字符集,可以通过指定字符集来明确使用UTF-8或其他编码方式:

// 使用UTF-8编码读写文件
try (FileReader fileReader = new FileReader("file.txt", StandardCharsets.UTF_8);
     FileWriter fileWriter = new FileWriter("file.txt", StandardCharsets.UTF_8)) {
    // 处理文本数据
} catch (IOException e) {
    e.printStackTrace();
}

// 使用UTF-8编码读写文件
try (FileReader fileReader = new FileReader("file.txt", StandardCharsets.UTF_8);
     FileWriter fileWriter = new FileWriter("file.txt", StandardCharsets.UTF_8)) {
    // 处理文本数据
} catch (IOException e) {
    e.printStackTrace();
}

总结:

  • 字符集是一组字符的集合,将字符映射到唯一的整数值(字符编码点)。

  • 编码是将字符编码点映射成字节序列的过程。

  • Java中采用的字符集是Unicode字符集,字符类型char代表一个16位的Unicode字符。

  • UTF-8是可变长度编码,UTF-16是固定长度编码,两者都是Unicode编码方案。

Java IO

Java NIO(New I/O)是Java提供的一种新的I/O操作方式,相较于传统的Java IO(也称为IO流或Stream)更为灵活和高效。

Java NIO引入了通道(Channel)和缓冲区(Buffer)的概念,使得可以通过非阻塞的方式进行数据读写操作。

  1. 通道(Channel): 通道是Java NIO中用于进行数据传输的抽象。它表示一个连接到文件、套接字或其他IO资源的开放连接。通过通道,可以在缓冲区和IO设备之间直接传输数据,而无需通过中间的IO流。通道是双向的,可以用于读取和写入数据。

    在Java NIO中,常用的通道包括 FileChannel(用于文件IO)、SocketChannel(用于TCP网络通信)、ServerSocketChannel(用于TCP服务器)和 DatagramChannel(用于UDP网络通信)。

  2. 缓冲区(Buffer): 缓冲区是用于存储数据的对象。数据从通道读取到缓冲区,或从缓冲区写入到通道。缓冲区提供了一种高效的方式来管理数据,可以在内存中预先分配空间,并支持直接在内存中进行数据操作。使用缓冲区进行数据传输可以避免频繁的系统调用,提高数据传输的效率。

    在Java NIO中,缓冲区是一个数组,可以是基本数据类型的数组(如 ByteBufferCharBufferShortBuffer 等)或对象数据类型的数组(如 ObjectBuffer)。不同类型的缓冲区适用于不同的数据类型。

通常,数据通过缓冲区来读取和写入。当从通道读取数据时,数据会被读取到缓冲区中;当写入数据到通道时,数据会从缓冲区写入。

Java NIO的基本使用步骤如下:

  1. 创建一个通道(Channel)对象,连接到数据源(如文件或网络套接字)。

    String sourceFilePath = "D:\\IDEA_Work\\LinkCV\\src\\main\\resources\\write.txt";
    String destinationFilePath = "D:\\IDEA_Work\\LinkCV\\src\\main\\resources\\readme.txt";
    FileInputStream fis = new FileInputStream(sourceFilePath);
    FileOutputStream fos = new FileOutputStream(destinationFilePath);
    FileChannel sourceChannel = fis.getChannel();
    FileChannel destinationChannel = fos.getChannel()
    

    这里首先是打开源文件和目标文件的通道。

  2. 创建一个缓冲区(Buffer)对象,用于存储要读取或写入的数据。

    // 创建一个缓冲区
    ByteBuffer buffer = ByteBuffer.allocate(1024);

    然后创建一个缓冲区

  3. 将数据从通道读取到缓冲区中(读操作)或将数据从缓冲区写入到通道中(写操作)。

    while (sourceChannel.read(buffer) != -1) {
    	//读取或写入
    }

    并在循环中从源通道读取数据到缓冲区

  4. 处理读取或写入的数据。

    // 切换缓冲区为读模式
    buffer.flip();
    
    // 将缓冲区的数据写入目标通道
    destinationChannel.write(buffer);

    再将缓冲区的数据写入目标通道

  5. 关闭通道和缓冲区。

    // 清空缓冲区以便继续读取
    buffer.clear();

    最后关闭通道释放资源

完整代码:

package com.java.CharacterStream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class IOMain {
    public static void main(String[] args) {
        String sourceFilePath = "D:\\xxx\\resources\\write.txt";
        String destinationFilePath = "D:\\xxx\\resources\\readme.txt";

        try (FileInputStream fis = new FileInputStream(sourceFilePath);
             FileOutputStream fos = new FileOutputStream(destinationFilePath);
             FileChannel sourceChannel = fis.getChannel();
             FileChannel destinationChannel = fos.getChannel()) {

            // 创建一个缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            // 从源通道读取数据到缓冲区
            while (sourceChannel.read(buffer) != -1) {
                // 切换缓冲区为读模式
                buffer.flip();

                // 将缓冲区的数据写入目标通道
                destinationChannel.write(buffer);

                // 清空缓冲区以便继续读取
                buffer.clear();
            }

            System.out.println("文件复制完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在Java NIO(New I/O)中,FileChannelSocketChannelServerSocketChannel是用于文件和网络I/O操作的核心类

它们分别对应文件IO和网络IO的通道。

  1. FileChannelFileChannel 是用于文件IO的通道,通过它可以直接在文件和缓冲区之间进行数据传输。它提供了高效的文件读写功能,并支持对文件的定位操作。

    常用的方法包括:

    • read(ByteBuffer dst):从通道读取数据到缓冲区。

    • write(ByteBuffer src):将缓冲区的数据写入到通道。

    • position(long newPosition):设置通道的当前位置。

    • size():返回通道关联文件的大小。

    • truncate(long size):截断文件大小。

    • transferTo(long position, long count, WritableByteChannel target):将通道数据传输到另一个通道。

      String sourceFilePath = "D:\\IDEA_Work\\LinkCV\\src\\main\\resources\\write.txt";
      String destinationFilePath = "D:\\IDEA_Work\\LinkCV\\src\\main\\resources\\readme.txt";
      // 使用FileChannel进行文件复制
      try (FileInputStream fis = new FileInputStream(sourceFilePath);
           FileOutputStream fos = new FileOutputStream(destinationFilePath);
           FileChannel sourceChannel = fis.getChannel();
           FileChannel destinationChannel = fos.getChannel()) {
      
          ByteBuffer buffer = ByteBuffer.allocate(1024);
      
          while (sourceChannel.read(buffer) != -1) {
              buffer.flip();
              destinationChannel.write(buffer);
              buffer.clear();
          }
      
          System.out.println("文件复制完成!");
      } catch (Exception e) {
          e.printStackTrace();
      }

  2. SocketChannelSocketChannel 是用于TCP网络通信的通道,它可以连接到远程服务器,并实现非阻塞的读写操作。它支持异步非阻塞I/O,可通过 Selector 来实现多路复用。

    常用的方法包括:

    • connect(SocketAddress remote):连接到远程服务器。

    • read(ByteBuffer dst):从通道读取数据到缓冲区。

    • write(ByteBuffer src):将缓冲区的数据写入到通道。

    • finishConnect():完成通道连接的操作。

    public static void main(String[] args) {
        try (SocketChannel socketChannel = SocketChannel.open()) {
            // 连接到服务器端的ServerSocketChannel
            socketChannel.connect(new InetSocketAddress("localhost", 8080));
            System.out.println("连接到服务器端...");
    
            // 向服务器端发送数据
            String message = "Hello, server!";
            ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
            socketChannel.write(buffer);
            System.out.println("向服务器端发送数据:" + message);
    
            // 接收服务器端的响应
            ByteBuffer responseBuffer = ByteBuffer.allocate(1024);
            int bytesRead = socketChannel.read(responseBuffer);
            if (bytesRead != -1) {
                responseBuffer.flip();
                byte[] responseData = new byte[responseBuffer.remaining()];
                responseBuffer.get(responseData);
                String responseMessage = new String(responseData);
                System.out.println("从服务器端接收到响应:" + responseMessage);
            } else {
                System.out.println("服务器端关闭了连接。");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

  3. ServerSocketChannelServerSocketChannel 是用于TCP服务器的通道,它可以监听客户端的连接请求,并返回对应的 SocketChannel 来进行通信。

    常用的方法包括:

    • bind(SocketAddress local):绑定服务器的本地地址。

    • accept():接受客户端的连接请求,返回对应的 SocketChannel

      // 使用SocketChannel进行网络通信
      try (ServerSocketChannel serverChannel = ServerSocketChannel.open()) {
          serverChannel.bind(new InetSocketAddress(8080));
          System.out.println("服务器已启动,监听端口8080...");
      ​
          while (true) {
              SocketChannel clientChannel = serverChannel.accept();
              System.out.println("接受来自客户端的连接:" + clientChannel.getRemoteAddress());
      ​
              ByteBuffer buffer = ByteBuffer.allocate(1024);
      ​
              while (clientChannel.read(buffer) != -1) {
                  buffer.flip();
                  clientChannel.write(buffer);
                  buffer.clear();
              }
      ​
              clientChannel.close();
          }
      } catch (Exception e) {
          e.printStackTrace();
      }

    发散一下想法,作为思考题:开发一个需求,使用 ServerSocketChannel 建立服务端,使用SocketChannel 建立客户端,由客户端发起连接并且发送内容,服务端收到后,发送一条信息告诉客户端已经收到消息,并且把收到的消息存到本地。

    代码实现


                

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

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

相关文章

TCP三次握手与四次断开

TCP三次握手机制 三次握手是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。 1、客户端发送建立TCP连接的请求报文&#xff0c;其…

IDEA设置快捷操作

步骤&#xff1a; 1、 2、 3、 4、 然后直接用就可以啦 常用的接口测试模板&#xff1a; given().contentType(JSON).body($requestBody$).log().all().when().post($path$).then().log().all().statusCode(200);given().contentType(ContentType.JSON).body().log().all().w…

使用低代码平台提高生产力

一、前言 低代码平台的概念很火爆&#xff0c;产品也是鱼龙混杂。 对于开发人员来说&#xff0c;在使用绝大部分低代码平台的时候都会遇到一个致命的问题&#xff1a;我在上面做的项目无法得到源码&#xff0c;完全黑盒。一旦我的需求平台满足不了&#xff0c;那就是无解。 与其…

面试热题(无重复字符的最长子串)

无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 解法一&#xff1a; public int lengthOfLonge…

UE4/5 PoseDriver 动画蓝图节点使用

PoseDriver节点可以进行Pose的比对&#xff0c;从而针对不同Pose生成不同权重数值&#xff0c;权重数值可应用至MorphTarget上使动画更加逼真&#xff0c;或应用至角色挂件上&#xff0c;制作出类惯性或弹簧的附加效果。 1.创建Pose 这里创建Box作为演示&#xff0c;下图大Bo…

【更新】119所院校考研重点勾画更新预告!

截至目前&#xff0c;我已经发布了47篇不同院校的择校分析。发布了87套名校信号考研真题以及119所不同院校的考研知识点重点勾画。 另外为了更好服务已经报名的同学&#xff0c;24梦马全程班也到了收尾的阶段。即将封班&#xff01;需要报名的同学抓紧啦&#xff01; 去年开始…

4-百度地图

4-百度地图 一 百度地图 1 前期准备 H5端和PC端,对接百度提供JavaScript API。 移动端,对接百度android SDK或ios SDK (1)打开百度地图开放平台 地址:https://lbsyun.baidu.com/ (2)选中开发文档——JavaScript Api 按照文档步骤开通百度开放平台并申请密钥 2 展示地…

Mysql5.8 Windows安装

1、下载安装包 MySQL :: Download MySQL Community Server 下载后解压到某个文件夹 2、配置环境变量 3.创建my.ini文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirE:\\software\\mysql\\mysql-8.0.11-winx64 # 切记此处一定要用双斜杠\\&#xff0c;…

小白到运维工程师自学之路 第六十三集 (dockerfile安装sshd、httpd、nginx)

一、概述 Dockerfile的指令根据作用可以分为两种&#xff0c;构建指令和设置指令。构建指令用于构建image&#xff0c;其指定的操作不会在运行image的容器上执行&#xff1b;设置指令用于设置image的属性&#xff0c;其指定的操作将在运行image的容器中执行。 1、FROM 镜像:T…

Profinet转Modbus RTU从站模式的配置流程

兴达易控Profinet转Modbus RTU从站模式的配置流程需要按照以下步骤进行。首先&#xff0c;确保Profinet主站和Modbus RTU从站的设备之间有正确的连接&#xff0c;包括电气连接和网络连接。然后&#xff0c;在Profinet主站上设置适当的通信参数。 下面是具体操作&#xff1a;创…

electron+vue+ts窗口间通信

文章目录 一. 目的二.逻辑分析三. 代码示例 "types/node": "^20.3.1","vitejs/plugin-vue": "^4.1.0","vueuse/electron": "^10.2.1","electron": "^25.2.0","electron-packager":…

python基础2——数据类型

文章目录 一、字符串处理1.1 占位符1.2 拼接符1.3 统计字符串长度1.4 切片取值1.5 内置字符串处理方法 二、组合数据类型2.1 列表2.2 元组2.3 集合2.4 字典 三、数据类型转换 一、字符串处理 1.1 占位符 可以使用%s占位符在字符串中引用变量。 1.有两种写法。 name "qi…

Git笔记--Ubuntu上传本地项目到github

目录 1--基本配置 2--本地上传 1--基本配置 ① 创建ssh-key cd ~/.sshssh-keygen -t rsa -C "邮箱地址"② 查看并关联ssh-key gedit id_rsa.pub 复制内容&#xff0c;在 GitHub 中依次点击 Settings -> SSH and GPG keys -> New SSH key&#xff0c;将 id…

iperf3

iperf3输出的参数的信息 interval 发送一次数据的间隔 transfer 传输速率 kBytes s---秒 Bitrate bit比特。rate速率。bitrate比特率。比特率是指信息传播的速率。 Retr retry---重传 链接 cwnd 拥塞串口大小 jitter 抖动时间 lost/total lost--丢失的包 tot…

C++ 结构体和联合体

1.结构体 结构体是一种特殊形态的类&#xff0c;它和类一样&#xff0c;可以有自己的数据成员和函数成员&#xff0c;可以有自己的构造函数和析构函数&#xff0c;可以控制访问权限&#xff0c;可以继承&#xff0c;支持包含多态&#xff0c;结构体定义的语法和类的定义语法几…

10.VS2022打包应用程序成安装包

VS2022利用Microsoft Visual Studio Installer Projects打包应用程序,生成安装包 1.安装Microsoft Visual Studio Installer Projects 1.1 打开扩展搜索Microsoft Visual Studio Installer Projects安装 1.2 安装完之后需要重启启动一下VS 2.创建安装项目 2.1 解决方案-》…

修改文件格式(查看文件拓展名)

很多时候我们直接把txt文件重命名为xxx.c或者别的文件格式&#xff0c;文件类型依然会是txt&#xff0c;文件名并不会变成我们想要的xxx.c&#xff0c;而是xxx.c.txt&#xff0c;也就是下面这个样子 给大家介绍2种方法去解决这个问题 目录 1.另存为新格式 2.显示文件拓展名 1…

【网络编程】五种网络IO模式

对于一次IO访问&#xff08;以read为例&#xff09;&#xff0c;数据会先被拷贝到操作系统内核的缓冲区中&#xff0c;然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说&#xff0c;当一个read操作发生时&#xff0c;会经历两个阶段&#xff1a; 1、等待数据准…

解决一个Sqoop抽数慢的问题,yarn的ATSv2嵌入式HBASE崩溃引起

新搭建的一个Hadoop环境&#xff0c;用Sqoop批量抽数的时候发现特别慢&#xff0c;我们正常情况下是一个表一分钟左右&#xff0c;批量抽十几个表&#xff0c;也就是10分钟的样子&#xff0c;结果发现用了2个小时&#xff1a; 查看yarn日志 发现有如下情况&#xff1a; 主要有两…

SIFT算法原理:SIFT算法详细介绍

前面我们介绍了Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。…