Dados incorretos ao salvar um JarFile

2 respostas
squall926

Boa tarde!
Estou desenvolvendo um programa de controle financeiro e estou tento problemas quando tento ler um arquivo dentro de um .jar e salvar o mesmo em disco.
Segue o codigo:

//esse é parte do codigo.

//esse f é o arquivo que vou salvar em disco, os dados q vou salvar nele são os lidos do .jar
File f = new File("BancoDeDados.mdb");
            if(!f.exists()){
                f.createNewFile();
                Jaris jar = null;
                String jarFilename = getJarFileName();
                jar = new Jaris(jarFilename);
                //esse arquivo dentro do jar q quero salvar fo "f(file)";
                InputStream is = jar.getInputStream("BancoDeDados.mdb");
   
                BufferedOutputStream fOut = null;
                try{
                    fOut = new BufferedOutputStream(new FileOutputStream(f));
                    byte[] buffer = new byte[32 * 1024];
                    int bytesRead = 0;
                    while((bytesRead = is.read()) != -1){
                        fOut.write(buffer,0,bytesRead);
                    }
                }finally{
                    fOut.close();
                    is.close();
                }

quando rodo, acontece que ele cria um arquivo invalido. O arquivo que estou lendo tem 140k de dados, o que o programa cria tem 2Mb.
Alguem pode me ajudar?
Grato!!!

2 Respostas

T

Atenção: dentro da medida do possível, NUNCA use o método "read" que retorna um int e não tem parâmetros, que é o que você usou. Ele é usado para ler um BYTE de cada vez. Você precisa usar o método "read" que recebe um byte[]. Esse consegue ler vários bytes de cada vez.

fOut = new BufferedOutputStream(new FileOutputStream(f));  
    byte[] buffer = new byte[32 * 1024];  
    int bytesRead = 0;  
    while((bytesRead = is.read(buffer)) > 0){  
        fOut.write(buffer,0,bytesRead);  
    }

Eu sou mais preguiçoso e costumo escrever assim, até para evitar confusão:

fOut = new BufferedOutputStream(new FileOutputStream(f));  
    byte[] buffer = new byte[32 * 1024];  
    for (int bytesRead = is.read(buffer); bytesRead > 0; bytesRead = is.read (buffer)) {
        fOut.write(buffer,0,bytesRead);  
    }
squall926

Vlw, isso resolveu meu problema!!!

Obrigado

Criado 27 de outubro de 2008
Ultima resposta 27 de out. de 2008
Respostas 2
Participantes 2