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

2023-10-28

申明:本人于公众号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 建立客户端,由客户端发起连接并且发送内容,服务端收到后,发送一条信息告诉客户端已经收到消息,并且把收到的消息存到本地。

    代码实现


                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

玩转Java IO流:轻松读写文件、网络 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • mysql使用IP地址访问失败

    mysql使用IP地址访问失败 ERROR 1045 28000 Access denied for user root WIN JATIACT91UR localdomain using password YES mysql h loca
  • 小熊派学习1

    1 写代码时xxx c为业务代码 xxx gn为编译脚本 2 头文件ohos init h 提供用于在服务开发期间初始化服务和功能的条目 不必深入理解 3 截图代码中最后一句 必须有APP FEATURE INIT Hello World
  • Mysql 统计最近七天内的数据并分组

    己做项目 想要做有关管理页面的相关报表 其中有一张图表 采用折线图的方式 表示用户增减趋势 显示最近七天内 每天的用户新增数量 第一步 查询一定范围内的数据 数量 查询最近一天的数据 select from table where to d
  • 智能合约部署Error: exceeds block gas limit undefined

    在学习区块链时 我们按照某些文章的教程 使用 Browser solidity 在 Go Ethereum上进行智能合约部署时 可能会出现Error exceeds block gas limit undefined的报错信息 表示当前合约
  • GitLab服务器修改管理员用户root密码

    我们搭建好GitLab服务 打开页面后 需要输入用户名密码 但它们是什么呢 初始管理员用户为root 密码在安装过程中已随机生成并保存在 etc gitlab initial root password中 有效期24小时 我们可以自己去查找
  • 【知网研学】使用方法

    目录 前言 一 下载知网研学途径 二 使用步骤 1 导入文档 2 论文内笔记标记 3 对论文内容复制 说明 前言 注 本文对 知网研学 该软件的使用方法包括下载 导入文档 编辑论文等的详细解说 一 下载知网研学途径 1 浏览器搜索进行下载
  • 入门FFmpeg编程 --Android

    1 前言 FFmpeg是一个强大的音视频处理库 但是通常接触时以命令形式较多 本篇文章讲了FFmpeg相关api的使用 尤其是它强大的过滤器filter库的使用 1 1 能学到什么 Android下集成FFmpeg 使用avcodec解码库
  • 如何辨别ChatGPT是不是真的

    随着ChatGPT爆红 国内陆续出现了几个所谓的 ChatGPT 反向代理站点 乍一试回答似乎还挺靠谱 但它们真的是ChatGPT吗 本文以其中一个站点为例 对其真伪进行辨别 其实最多只需要问两个问题 基本上就可以做出判断了 1 你是谁 2
  • 为什么说区块链共享的不仅仅是数据?

    数据共享是人与生俱来的需求 比如 在咖啡馆谈人生理想 执笔书写文字等等 这些都是普通人用来和他人交流信息的重要方式 互联网的出现 打破了数据共享在地域和时间方面的限制 它可以让不同人在地球的不同位置进行即时交流 电子邮件 网上即时通讯等技术
  • 单片机及C语言入门

    一 什么是单片机 将CPU芯片 存储器芯片 I O接口芯片和简单的I O设备 小键盘 LED显示器 等装配在一块印刷电路板上 再配上监控程序 固化在ROM中 就构成了一台单片微型计算机 简称单片机 由于单片机在使用时 通常处于测控系统的核心
  • go+gSoap+onvif学习总结:7、进行镜头调焦、聚焦和预置点的增删改查

    cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 文章目录 cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 1 前言 2 gSoap生成c代码框架 3 完成c代码实例并测试
  • 接口测试小知识

    1 什么是接口 电脑 USB 投影仪等 数据传输 软件 统称为API application program interface 支付宝支付 微信提现和充值 银联支付接口 鉴权码 token key appkey 接口包括 内部接口和外部接
  • deblurGAN-v2 去模糊深度学习算法。

    https blog csdn net weixin 42784951 article details 100168882 论文 https arxiv org pdf 1908 03826 pdf 代码 https github com
  • 算法基础课:第二讲——数据结构

    文章目录 单链表 算法思想 注意点 模板 例题 AC代码 双链表 算法思想 注意点 模板 例题 AC代码 栈 算法思想 模板 例题 AC代码 队列 算法思想 模板 例题 AC代码 单调栈 作用 算法思想 模板 例题 AC代码 单调队列 作用
  • Java中灵活获取excel中的数据

    在java当中获取excel数据 获取每一列数据 每一行数据 在这里例子是将每一行数据获取出来 并带着表头数据返回 代码 具体实现逻辑在代码注释当中可以参见 public static List
  • 杨桃的Python进阶讲座16——数组array(六)一维数组和二维数组的索引和取值(配详细图解)

    本人CSDN博客专栏 https blog csdn net yty 7 Github地址 https github com yot777 在进阶讲座8中讲过数组 矩阵 的维度 我们再看看多维矩阵的索引和取值方法 一维数组的索引和取值 和列
  • C语言计算两个整数之和

    要求输入2个整数A和B 然后输出它们的和 输入格式 输入在一行中给出整数A和B 输出格式 输出A B的值 输入样例 在这里给出一组输入 例如 3 5 结尾无空行 输出样例 在这里给出相应的输出 例如 8 结尾无空行 include
  • 简析 JavaScript报错 Uncaught TypeError Cannot read properties of null (reading ‘...‘) at new

    JS报错 如下图 报错原因 引入JS的位置错误 为什么位置错误 JS 在页面渲染 生成 之前就执行了代码 发现获取不到页面元素 解决方法 放到页面代码下面 body内部或者下部 随意吧
  • Python爬虫从0到1(完结篇)——增量式爬虫

    本篇是基础爬虫专栏的最后一篇文章 有关进阶爬虫技术的内容现已开始更新 但不会每一篇都会在此处发布 有需要的可直接加群了解 废话不多说 直接进入今天的文章内容 增量式爬虫 基本定义 增量式爬虫就是一个能够在网站原有数据的基础上采集最新公开的一
  • 玩转Java IO流:轻松读写文件、网络

    申明 本人于公众号Java筑基期 CSDN先后发当前文章 标明原创 转载二次发文请注明转载公众号 另外请不要再标原创 注意违规 字符流和字节流 在Java中 IO 输入输出 操作涉及字符流和字节流 它们是两种不同的抽象类 用于处理不同类型的