segunda-feira, 12 de novembro de 2012

Criação de Arquivos em Memória

Outro dia, estava com um problema para criar arquivos em Java.

Claro, muita gente vai dizer usar o File f = new File("nomeArquivo.extencao")

Mas meu problema era que eu precisa jogar para o Servlet para então o usuário salva-lo em sua máquina, fazendo da maneira anterior, um arquivo (lixo) seria criado no Server, que não ajudaria em nada para mim. 

Então nas minhas buscas encontrei uma solução usando classes do pacote java.io.* ByteArrayOutputStream, OutputStreamWriter, BufferedWriter

Segue abaixo solução:

            ...

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(out);
            BufferedWriter bw = new BufferedWriter(osw);
            
            bw.write( "Escrevendo no arquivo");
            bw.close;

            ...


Despois disso, vc deve seguir os demais passos, se usar servlet ficaria assim:

          HttpServletResponse response = (HttpServletResponse)   FacesContext.getCurrentInstance().getExternalContext().getResponse();

        ServletOutputStream output;

        ...     
  
        //colocar código anterior

        ...
        output = response.getOutputStream();
        response.setContentType("application/x-download");
        response.setHeader("Content-Disposition", "attachment; filename=arquivo.extensao");
           
            output.write(out.toByteArray());
           
            output.flush();
            output.close();


PostgreSQL e Constraints Case Insensitive

A um tempo atrás tive alguns problemas para encontrar algo que resolvesse um problema constante em muitas aplicações. Resolver duplicações de resgistros com constraints.

Em minhas buscas pela net encontrei várias coisas, que cheguei a implementar porém, não me foram muito bem, até que cheguei a uma solução que me ajudou muito. Que foi simplesmente usar índices para validação de constraints. Bom, para quem não sabe, PostgreSQL (PG), diferentes de outros SGBD's (SQL Server, por exemplo), os atributos do tipo String são armazenados de forma CASE SENSITIVE, ou seja, faz distinção entre maiúsculas e minúsculas.

Para contornar essa dificuldade, resolvi usar da seguinte forma:

CREATE TABLE pais
(
  id bigint NOT NULL,
  nome_pais character varying(255) NOT NULL,
  sigla character varying(3) NOT NULL,
  CONSTRAINT pais_pkey PRIMARY KEY (id )
);

CREATE UNIQUE INDEX UK_PAIS ON PAIS ( (lower(rtrim(ltrim(NOME_PAIS)))) );


Dessa forma o SGBD cria um índice verificando CASE INSENSITIVE.



Fonte: PostgrSQL: Documentation - Unique Indexes