Java >> Java tutorial >  >> Tag >> byte

Størrelsen på byte-array bliver dobbelt, når den hentes fra Postgres-databasen

Jeg bruger JSF2.0, jetty server og Postgres database. Jeg ønsker at gemme mp3-fil i databasen i byte array formet. Jeg uploader byte-arrayet af mp3-fil. Men når jeg henter samme byte-array fra databasen, får jeg byte-array af dobbelt størrelse, og derfor virker min mp3-fil ikke så godt.

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);
}

Output:

Upload byte array størrelse:384440

Hentet byte array størrelse:768879

Jeg ved ikke hvorfor det sker. Jeg gemmer byte-array og på næste linje henter jeg den. Men jeg får byte-array af dobbelt størrelse. Sig til, hvis du har brug for flere detaljer.

Svar

Når man beskæftiger sig med binære data i Postgres, er det vigtigt at bruge korrekt databinding.

For det første skal datakolonnen være af typen BYTEA . Er det tilfældet?

For at gemme data skal du bruge forberedte erklæringer og sørge for at ringe til 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();

For at hente data skal du også bruge forberedte udsagn og bruge 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();

Se mere her.


Java tag