Estou enfrentando um problema para inserir dados de arquivos textos em um banco de dados postgre. Acontece o seguinte:
PSQLException: Zero bytes não podem ocorrer em parâmetros de cadeia de caracteres
Quando eu abro o arquivo texto no java realmente existe um caracter inválido (daqueles que aparecem como um quadradinho), existe alguma maneira de eu retirar todos esses caracteres antes de gravar o arquivo no banco de dados?
mas é que eu não acesso os arquivos, eles são enviados pelos usuários via WEB para o servidor.
De la eu leio os arquivos e gravo no Banco de Dados.
Não tem como eu saber quais caracters inválidos podem vir, por isso minha idéia era tirar todos os caracteres que não são UTF-8 para depois gravar no banco.
Eu faço a conversão deles com Jaxb, lógico que da erro. Mas mesmo assim eu preciso gravar todo arquivo recebido em uma tabela de LOG. A coluna desta tabela é tipo String.
Eles são sempre XML e sempre em UTF-8 ou eles podem estar em alguma outra codificação (tipo Windows-1252)? (Pelo que você esta falando pode ser que esses tais arquivos XML possam ter sido criados “manualmente” - e nesse caso vai dar alguns problemitas mesmo)
Ai é que ta eles realmente podem vir em outra codificação.
Mas ai vai dar problema de parser no JAXB e o sistema não vai prosseguir com o processamento. O que está totalmente certo, pois os clientes são obrigados a enviar em UTF-8;
O que acontece é que quando ocorre essa falha eu preciso gravar o arquivo recebido em um log (no banco de dados). E esse maldita coluna é texto e não BLOB.
Não existe um jeito nem que eu tenha que fazer alguma coisa assim:
for(int i = 0; i < texto.length(); i++){
if( ! isUTF8Valido(texto.charAt(i))) //não grava esse caracter
}
Esse método isUTF8Valido(char) existe algum jeito de cria-lo, existe algum teste que eu possa fazer com o caracter para saber se é um UTF-8 válido?
Ah, só vou fazer um comentário. Por acaso o arquivo que o usuário pode subir pode ser muito grande, tão grande que não caiba numa coluna String do banco de dados? (Note que não conheço o PostgreSQL portanto não sei se existe ou não algum limite para isso). Se puder ser grande, então não vale a pena todo esse esforço, Ache um diretório onde você possa copiar esse arquivo errado, e ponha na tal coluna só o nome do arquivo.
O arquivo não pode ser grande não, tem uma validação pra isso.
Na verdade o arquivo não é enviado via upload existe um programa Swing que envia e ele valida.