Gravar e ler arquivos no banco

Galera estou tendando gravar um arquivo de texto (pdf, txt ou uma imagem de extensão tif)
Estou usando o tipo de dados bytea
quando vou inserir neste campo dou um insert e passo para o campo um array de bytes, quando dou um select no pgadminIII aparece no campo que gravei o seguinte = [B@955b34;
Quando leio do banco via java e mando imprimir para arquivo ele escreve para o arquivo = [B@955b34 e não o conteudo do arquivo original

Codigo usado para inserir a imagem ou arquivo onde buffer é o array de bytes

String sql = "", sql1 = "";
            if(buffer.length > 1){ // se o string de bytes for maior que um ou existir, insere a imagem.
               sql = "insert into tbl_contrato values('"+cod+"','"+empresa+"','"+tipo+"','"+dataEmissao+"','"+dataEncerramento+"','"+nomeCliente+"','"+buffer+"','"+extensao+"','"+nomeArquivo+"')";

Codigo usado para ler os bytes e quem vem uma serie de caracteres loucos.
Onde rs.getBytes(7) tenta recuperar os bytes.

try {
    Statement st = conexao.createStatement();
    ResultSet rs;
    String sql = "select c.cod_contrato, c.cod_empresa, c.tipo_contrato, c.data_emissao, c.data_encerramento, c.nome_cliente, c.contrato_escaneado, c.extensao, c.nome_arquivo, e.nome_empresa  from tbl_contrato as c , tbl_empresa as e where c.cod_empresa = e.cod_empresa and cod_contrato = '"+codContrato+"'";                    
     rs = st.executeQuery(sql);
     if(rs.next()){
        contrato = new Contrato( rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getBytes(7), rs.getString(8), rs.getString(9), rs.getString(10));
            }

Alguem sabe o que pode estár errado?

Opa,

tente assim:

String sql = "INSERT INTO x (x, y, z) VALUES (?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInteger(1, x);
pstmt.setString(2, y);
stmt.setBinaryStream(1, infile, infile.available());
pstmt.executeUpdate();

onde infile é do tipo inputStream.

:okok: