Ajuda com um campo CLOB

2 respostas
mutley

Fala galera
tudo certo?

Eu tenho uma rotina em que o usuário cadastra um documento, escolhendo
o arquivo físico referente ao mesmo, ao persistir, eu gravo os bytes do arquivo
em um campo CLOB no Oracle.
Até esse ponto está gravando tudo certo. O meu problema, é quando eu preciso
buscar o conteúdo do campo CLOB e mostrar o conteúdo do arquivo na tela.

Estou fazendo a busca dos bytes e colocando-os em um novo arquivo
com o seguinte trecho de código:

Connection conn = DriverManager.getConnection
	("jdbc:oracle:oci:@192.168.2.96:1521:ORCL", info);
//info - são as propriedades da minha conexão com o banco de dados, como usuário, senha, entre outros.
conn.setAutoCommit(false);

Statement ps = conn.createStatement();				
ResultSet rs = ps.executeQuery("SELECT CONTEUDO FROM DOCUMENTO WHERE ID = 10");

while (rs.next()) {
	Clob clob = rs.getClob("CONTEUDO");
	File file = new File("C:\\Teste.pdf");
				
	InputStream fis = (InputStream)clob.getAsciiStream();
	InputStreamReader conversor = new InputStreamReader(fis);
	BufferedReader bf = new BufferedReader(conversor);
	FileOutputStream out = new FileOutputStream(file);
	boolean continua=true; String linha;
	while(continua){
		linha = bf.readLine();
		if (linha==null){
			continua=false;
		}else{
			out.write(linha.getBytes());
			//tive que incluir uma quebra de linha depois de cada uma senão ficava tudo na mesma linha e o Adobe Reader não reconhecia como PDF.
			out.write("\n".getBytes());						
		}
	}
	bf.close();
	fis.close();
	out.flush();
	out.close();
}

Depois disso o arquivo criado a partir dos bytes vindos do banco de dados está em branco.
Editei os arquivos pelo Notepad++ e comparei o conteúdo do arquivo original e do arquivo
que foi criado pelo java, e estão praticamente iguais.

Alguém já passou por algo parecido ou sabe como posso resolver isso?

Desde já agradeço.

2 Respostas

Abdon

Cara provavemente esse seu \n ta zuando o barato, eu tentaria ler o arquivo de mais baixo nivel, ao invez de vc criar um BufferedReader (que não é propria para ler bytes), crie buffer de bytes e os leia direto do InputStream com o metodo read, tomando os dividos cuidados que temos que tomar com IO, claro.

mutley

Tudo certo Ovelha,
primeiramente obrigado pela ajuda.
Assim, mudei a forma como estou fazendo, como você sugeriu, estou lendo
diretamente do InputStream, mas o que mudei foi que em vez de criar um arquivo
para depois apresentar na tela, estou mandando para a tela diretamente a partir dos
bytes lidos pelo InputStream, mas o conteúdo continua aparecendo em branco.

O meu código ficou assim agora:

while (rs.next()) {
	Clob clob = rs.getClob("CONTEUDO");		
	byte[] dados = new byte[1024*10];
	InputStream fis = (InputStream)clob.getAsciiStream();
				
    int offset = 0;
    int numRead = 0;
    while (offset < dados.length
		&& (numRead=fis.read(dados, offset, dados.length-offset)) >= 0) {
			offset += numRead;
	}
	fis.close();
	/* Este método é responsável por pegar os bytes lidos e apresentar
	 * na tela para o usuário. Recebe por parâmetro os bytes, o mimetype do arquivo, o nome do arquivo
	 * e o FacesContext para saber onde mandar.
	 * Esse método está funcionando corretamente quando o banco de dados é Firebird */
	Arquivo.bytesFromFile(dados, "application/pdf", "ArquivoTeste", fc);
}

Eu não sei mais o que fazer,
estou apanhando disso já faz uma semana.
Agradeço pela ajuda.

Criado 26 de janeiro de 2010
Ultima resposta 27 de jan. de 2010
Respostas 2
Participantes 2