java中怎么存储二进制

va中存储二进制数据可使用byte数组、ByteBuffer类,或通过JDBC的PreparedStatement将二进制数据存入数据库。

Java中,存储二进制数据有多种方式,具体取决于数据的规模、用途以及存储位置等因素,以下是一些常见的存储二进制数据的方法:

java中怎么存储二进制

使用基本数据类型存储二进制数据

数据类型 存储容量 描述 示例
byte 1字节 有符号的字节类型,范围是从 -128到127,通常用于存储较小的二进制数据,如ASCII字符或标志位。 byte b = 100; // 二进制表示为 01100100
short 2字节 有符号的短整数类型,范围是从 -32768到32767,可用于存储较小的二进制数据,或在需要两个字节的情况下使用。 short s = 30000; // 二进制表示为 01110101 00101100
int 4字节 有符号的整数类型,范围是从 -231到231-1,常用于存储较大的二进制数据,如文件大小或网络数据包大小。 int i = 67108864; // 二进制表示为 1111 1111 10000 0000 0000 0000 0000 0000 (十六进制表示为 FF FF FF FF)
long 8字节 有符号的长整数类型,范围是从 -263到263-1,用于存储更大的二进制数据。 long l = 9223372036854775807L; // 最大值

使用ByteBuffer存储二进制数据

ByteBuffer是Java中专门用于处理二进制数据的类,它提供了一种灵活且安全的方式来存储和操作二进制数据。

  • 创建ByteBuffer:可以通过多种方式创建ByteBuffer,如分配指定大小的缓冲区、从字节数组包装等。

    • ByteBuffer buffer = ByteBuffer.allocate(1024); // 分配1KB的缓冲区
    • byte[] bytes = {1, 2, 3, 4};
    • ByteBuffer buffer = ByteBuffer.wrap(bytes); // 用字节数组包装成ByteBuffer
  • 写入二进制数据:使用put()方法将各种类型的数据写入缓冲区。

    • buffer.put((byte) 10); // 写入一个字节
    • buffer.putShort((short) 100); // 写入一个短整数
    • buffer.putInt(1000); // 写入一个整数
    • buffer.putLong(100000L); // 写入一个长整数
    • buffer.putFloat(3.14f); // 写入一个浮点数
    • buffer.putDouble(3.1415926); // 写入一个双精度浮点数
    • buffer.putChar('A'); // 写入一个字符
  • 读取二进制数据:使用get()方法从缓冲区读取数据,读取时需要注意缓冲区的位置(position)和限制(limit)。

    • byte b = buffer.get(); // 读取一个字节
    • short s = buffer.getShort(); // 读取一个短整数
    • int i = buffer.getInt(); // 读取一个整数
    • long l = buffer.getLong(); // 读取一个长整数
    • float f = buffer.getFloat(); // 读取一个浮点数
    • double d = buffer.getDouble(); // 读取一个双精度浮点数
    • char c = buffer.getChar(); // 读取一个字符

将二进制数据存储到文件中

在Java中,可以使用InputStream和OutputStream及其子类来读写二进制文件。

  • FileInputStream和FileOutputStream:这是最基本的用于读写二进制文件的类,它们以字节为单位进行读写操作,将一个文件的内容复制到另一个文件:

    try (FileInputStream fis = new FileInputStream("source.txt");
       FileOutputStream fos = new FileOutputStream("target.txt")) {
      int byteRead;
      while ((byteRead = fis.read()) != -1) {
          fos.write(byteRead);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  • DataInputStream和DataOutputStream:这两个类可以在二进制文件中读写基本数据类型,如int、double等,将一个整数和一个双精度浮点数写入文件:

    java中怎么存储二进制

    try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
      dos.writeInt(100);
      dos.writeDouble(3.1415926);
    } catch (IOException e) {
      e.printStackTrace();
    }

    对应的读取操作如下:

    try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
      int i = dis.readInt();
      double d = dis.readDouble();
      System.out.println("i = " + i + ", d = " + d);
    } catch (IOException e) {
      e.printStackTrace();
    }
  • BufferedInputStream和BufferedOutputStream:为了提高读写性能,可以使用带缓冲的流,它们会在底层创建一个缓冲区,减少实际的磁盘读写次数。

    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.txt"));
       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("target.txt"))) {
      int byteRead;
      while ((byteRead = bis.read()) != -1) {
          bos.write(byteRead);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  • RandomAccessFile:这个类既可以读写二进制文件,又可以实现随机访问,它可以在文件的任意位置进行读写操作,而不仅仅是顺序读写,向文件的指定位置写入数据:

    try (RandomAccessFile raf = new RandomAccessFile("file.bin", "rw")) {
      raf.seek(10); // 将文件指针移动到第10个字节处
      raf.writeInt(100); // 写入一个整数
    } catch (IOException e) {
      e.printStackTrace();
    }

将二进制数据存储到数据库中

在Java中,可以使用JDBC将二进制数据存储到数据库中,不同的数据库有不同的二进制数据类型,如MySQL中的BLOB类型。

  • 连接数据库:首先需要加载数据库驱动并建立与数据库的连接,连接MySQL数据库:

    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
  • 准备SQL语句:使用PreparedStatement来执行SQL语句,并通过setBinaryStream()方法将二进制数据设置到SQL语句的参数中,将一个文件插入到数据库中:

    String sql = "INSERT INTO my_table (binary_column) VALUES (?)";
    try (PreparedStatement stmt = conn.prepareStatement(sql)) {
      File file = new File("D:\idm_download\萤火之森.mp3");
      try (InputStream in = new FileInputStream(file)) {
          stmt.setBinaryStream(1, in, (int) file.length());
          int result = stmt.executeUpdate();
          if (result > 0) {
              System.out.println("音频文件写入成功!");
          } else {
              System.out.println("音频文件写入失败!");
          }
      }
    } catch (SQLException | IOException e) {
      e.printStackTrace();
    }
  • 读取数据库中的二进制数据:通过ResultSet的getBinaryStream()方法可以读取数据库中的二进制数据,并将其写入到文件中或其他处理。

    java中怎么存储二进制

    String sql = "SELECT binary_column FROM my_table WHERE id = ?";
    try (PreparedStatement stmt = conn.prepareStatement(sql)) {
      stmt.setInt(1, 1);
      try (ResultSet rs = stmt.executeQuery()) {
          if (rs.next()) {
              try (InputStream in = rs.getBinaryStream("binary_column");
                   FileOutputStream fos = new FileOutputStream("D:\output\萤火之森_copy.mp3")) {
                  int byteRead;
                  while ((byteRead = in.read()) != -1) {
                      fos.write(byteRead);
                  }
              }
          }
      }
    } catch (SQLException | IOException e) {
      e.printStackTrace();
    }

相关问答FAQs

  • 问题1:Java中的ByteBuffer和byte数组有什么区别?如何选择合适的方式来存储二进制数据?

  • 回答:ByteBuffer和byte数组都可以用于存储二进制数据,但它们有一些区别,byte数组是一个固定大小的字节序列,一旦创建,其大小就不能改变,而ByteBuffer是一个更灵活的缓冲区,它可以动态地调整可读写的位置,并且提供了更多的方法来操作二进制数据,如按不同数据类型读写、切换读写模式、设置字节顺序等,如果只是简单地存储和读取固定大小的二进制数据,byte数组可能就足够了;但如果需要更复杂的操作,如在不同位置读写数据、处理多种数据类型等,ByteBuffer会更合适。

  • 问题2:在使用JDBC将二进制数据存储到数据库时,为什么推荐使用PreparedStatement而不是Statement?

  • 回答:使用PreparedStatement有多个优点,它可以防止SQL注入攻击,因为参数值是通过绑定变量的方式设置的,而不是直接拼接在SQL语句中,这样可以有效避免恶意用户通过输入特殊字符来破坏SQL语句的结构,PreparedStatement在执行多次相同的SQL语句时,可以提高性能,数据库服务器会对PreparedStatement进行预编译,生成执行计划并缓存起来,下次执行相同的语句时,只需要传入参数即可,不需要重新编译SQL语句,从而减少了数据库的开销,PreparedStatement可以更方便地处理不同类型的参数,包括二进制数据、字符串、数字等,通过set方法可以准确地将参数设置到SQL语句中,避免了类型

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/61952.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年7月15日 00:43
下一篇 2025年7月15日 00:48

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN