有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Postgres数据库检索时,字节数组的java大小增加了一倍

我正在使用JSF2。0,jetty服务器和Postgres数据库。我想以字节数组的形式将mp3文件存储在数据库中。我上传了mp3文件的字节数组。但当我从数据库中检索相同的字节数组时,我得到的字节数组的大小是我的两倍,因为我的mp3文件不能正常工作

public void updateAnnouncementDetail(AnnouncementDetail announcementDetail) {
    System.out.println("Upload  byte array size:" + announcementDetail.getContent().length);
    Session sess=get Session();
    sess.beginTransaction();
    sess.save(announcementDetail);
    sess.getTransaction().commit();
    AnnouncementDetail detail;
    detail = retrieveAnnouncementDetailById(new AnnouncementDetailPK(announcementDetail.getAnnouncementDetailPK().getAnnouncement(), announcementDetail.getAnnouncementDetailPK().getLanguage()));
    System.out.println("Retrived byte array size:" + detail.getContent().length);
}

输出:

上传字节数组大小:384440

检索的字节数组大小:768879

我不知道为什么会这样。我正在存储字节数组,在下一行中我正在检索它。但我得到的字节数组大小是原来的两倍。如果你需要更多的细节,请告诉我


共 (2) 个答案

  1. # 1 楼答案

    博士后9。x bytea值的默认输出为十六进制。因此,请尝试:

    ALTER DATABASE database_name SET bytea_output = 'escape';

  2. # 2 楼答案

    在Postgres中处理二进制数据时,使用适当的数据绑定非常重要

    首先,数据列的类型必须为BYTEA。是这样吗

    要存储数据,请使用准备好的语句,并确保调用setBinaryStream()

    File file = new File("myimage.gif");
    FileInputStream fis = new FileInputStream(file);
    PreparedStatement ps = conn.prepareStatement(
        "INSERT INTO images VALUES (?, ?)"
    );
    ps.setString(1, file.getName());
    ps.setBinaryStream(2, fis, (int)file.length());
    ps.executeUpdate();
    ps.close();
    fis.close();
    

    要检索数据,还可以使用准备好的语句并使用getBytes()

    PreparedStatement ps = conn.prepareStatement(
        "SELECT img FROM images WHERE imgname = ?"
    );
    ps.setString(1, "myimage.gif");
    ResultSet rs = ps.executeQuery();
    while (rs.next()) {
        byte[] imgBytes = rs.getBytes(1);
        // use the data in some way here
    }
    rs.close();
    ps.close();
    

    请参阅更多here