PostGresql, BLOB, Input/OutputStream, setBinaryStream
Bonjour à tous!
Dans le cadre d'un projet personnel, je me tape la tête sur un problème
que je n'arrive pas à résoudre.
Mon but est d'insérer un .wav dans une colonne bytearea d'une table Postgresql,
et l'opération inverse, à savoir lire le BLOB et l'exporter dans un second fichier .wav...
Le problème est que la taille de mon fichier bis est quasiment le double, et j'ai beau chercher, je ne trouve pas pourquoi, j'ai la vague intuition que le problème vient de l'insertion en base...
le code de l'insertion
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
statement.execute("TRUNCATE TABLE musique");
//Preparation du champ data
File fichier = new File("test.wav");
System.out.println("Taille fichier: " + fichier.length());
InputStream in = new FileInputStream(fichier);
//Insertion dans la base
ps = connection.prepareStatement("INSERT INTO musique (title,id_album,tracknumber,id_artist,id_genre,date,data) VALUES (?,?,?,?,?,?,?)");
ps.setString(1, "Premier titre"); // title
ps.setInt(2, 1); // id_album
ps.setInt(3, 1); // tracknumber
ps.setInt(4, 1); // id_artist
ps.setInt(5, 1); // id_genre
ps.setTimestamp(6, null); // date
//ps.setBlob(7, in, (int) fichier.length()); //marche pas avec jdbc>3.0
ps.setBinaryStream(7, in, (int) fichier.length());
ps.execute();
ps.close();
in.close();
rs.close();
statement.close();
connection.close(); |
et celui du Select et export:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
String titre = "Premier titre";
resultset = statement.executeQuery("SELECT title, data FROM musique WHERE title = '" + titre + "' LIMIT 1");
resultset.next();
// System.out.println("Les lignes dans la base: ");
// System.out.println(" TITLE = " + resultset.getString("title"));
// System.out.println(" DATA = " + new String(resultset.getBytes("data"), 0, 32));
InputStream in = resultset.getBinaryStream("data");
File fichier_sortie = new File("testrecup.wav");
OutputStream out = new FileOutputStream(fichier_sortie);
//Premier essai
byte buffer[] = new byte[512 * 1024];
int nbLecture;
while ((nbLecture = in.read(buffer)) != -1) {
out.write(buffer, 0, nbLecture);
}
System.out.println("Taille fichier sortie: " + fichier_sortie.length());
out.flush();
out.close();
in.close();
resultset.close();
statement.close();
connection.close(); |
et la sortie:
Code:
1 2 3 4 5 6 7
|
run:
TEST
Titre: Premier titre
Taille fichier: 50168204
Taille fichier sortie: 100336407
BUILD SUCCESSFUL (total time: 8 seconds) |
Est-ce quelqu'un voit quelque chose qui cloche?
D'avance merci :ccool: