Listar arquivos .txt de um pacote java

11 respostas
furacao123

Estou tentando listar os arquivos txt que um determinado pacote da minha aplicação possui, mas nao estou conseguindo acessar esses arquivos, estou tentando consultar o pacote da seguinte maneira

File fDir = new File(getClass().getResource("/pacote/dados/").toURI());

mas ao executar essa linha me retorna a seguinte exception

java.lang.IllegalArgumentException: URI is not hierarchical

eu sei que para carregar arquivos txt de dentro do jar eu preciso utilizar o InputStream, mas como eu consigo listar os nomes dos arquivos?

Pois a minha aplicação carrega esses arquivos dinamico.

11 Respostas

A

tenta dar uma lida nisto:

furacao123

[quote=amunis999]tenta dar uma lida nisto:

Entao ler um diretorio na maquina e listar os arquivos tranquilo, mas no meu caso tenho os arquivos txt dentro de um pacote no meu jar, por exemplo tenho varios arquivos…

2012-01-01.txt
2012-01-02.txt

esses arquivos sao colocados no projeto e compilados, quando executado eu tenho de carregar todos os arquivos de dentro do pacote da minha aplicação e verificar qual quero carregar, mas o problema esta em como verificar os arquivos de um pacote dentro do .jar

fernandopaiva

[quote=furacao123]

amunis999:
tenta dar uma lida nisto:

Entao ler um diretorio na maquina e listar os arquivos tranquilo, mas no meu caso tenho os arquivos txt dentro de um pacote no meu jar, por exemplo tenho varios arquivos…

2012-01-01.txt
2012-01-02.txt

esses arquivos sao colocados no projeto e compilados, quando executado eu tenho de carregar todos os arquivos de dentro do pacote da minha aplicação e verificar qual quero carregar, mas o problema esta em como verificar os arquivos de um pacote dentro do .jar

para ler arquivos dentro dos pacotes vc pode usar o InputStream, veja.

//arquivo.txt dentro do package betatest
este e um arquivo de teste dentro do package

//ler arquivo dentro do package
public class TesteArquivo {
    private InputStream fi;
    
    public TesteArquivo(){
        fi = getClass().getClassLoader().getResourceAsStream("betatest/arquivo.txt");
        Scanner s = new Scanner(fi);
        while(s.hasNext()){
            System.out.println(s.next()); //exibindo conteudo do arquivo
        }
    }
    
    public static void main(String[] args){
        new TesteArquivo();        
    }    
}

t+ e boa sorte.

furacao123

Consegui carregar os inputsstream e ler os arquivos txt no pacote pelo netbeans, agora quando tenho executar a aplicação, pelo jar nao encontra os arquivos, como tenho de marcar o diretorio em getResourceAsStream?

Tenho um jar principal e utiliza outro jar, onde tenho a classe e os arquivos, o diretorio é esse

model.versao.scripts.base.dados

e no getResourceAsStream esta assim

/model/versao/scripts/base/dados/

esta errado?

Bruno_Cunha

Não entendi…

Você quer carregar um JAR que está dentro de outro JAR?
Ou dinâmicamente instanciar classes dentro de um JAR?

Para ambos, você deve utilizar ClassLoaders.
http://www.guj.com.br/articles/124

Espero ter ajudado.
Se não for isso, tente explicar melhor seu problema…

furacao123

Vou explicar melhor, tenho um pacote model.versao.scripts.base.dados que contem varios arquivos .txt, pelo netbeans, consigo varrer todos os arquivos desse diretorio com o getResourceAsStream, mas quando eu compilo e executo a aplicação pelo .jar nao encontra os arquivos.

private void carregaDadosBase() {
        String path = "/model/versao/scripts/base/dados/";
        String linha = null;
        String str = "";
        try {
            logger.info("Carregando dados base para primeira execução do sistema.");
            InputStream is = getClass().getResourceAsStream(path);
            String[] arqs = ArquivoUtil.getNomeArquivosPacote(is);
            System.out.println("Numero arquivos encontrados: " + arqs.length);
            BufferedReader leitor = null;
            for (String file : arqs) {
                logger.info("Arquivo carregado: " + file);
                is = getClass().getResourceAsStream(path + file);
                leitor = new BufferedReader(new InputStreamReader(is));
                while ((linha = leitor.readLine()) != null) {
                    str += linha;
                    if (linha.endsWith(";")) {
                        executeNativeQuery(str);
                        str = "";
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
public static String[] getNomeArquivosPacote(InputStream is) throws IOException {
        List<String> lista = new ArrayList<String>();
        BufferedReader leitor = new BufferedReader(new InputStreamReader(is));

        String linha = null;
        while ((linha = leitor.readLine()) != null) {
            lista.add(linha);
        }
        leitor.close();

        return lista.toArray(new String[lista.size()]);
    }

no netbeans executando a aplicação funciona sem problemas, agora se eu executo pelo .jar nao funciona, o que esta errado?

A questao dos jars é o seguinte esses metodos estao em uma classe em determinado projeto, por exemplo projeto Model, estou fazendo os testes chamando uma main direto desse projeto, ok.

depois que funcionar pelo jar vou adicionar esse projeto em um outro projeto por exemplo ProjetoPrincipal adiciona o Model e utiliza os metodos de varredura de arquivos, nao cheguei ainda nessa parte porque nem diretamente no jar model esta funcionando, ja tentei com

Thread.currentThread().getContextClassLoader().getResourceAsStream

e nada tambem, ja estou sem ideias do pq desse problema.

fbl.lucas

Qual é o pacote da classe que contem o método carregaDadosBase?
Da uma olhada:
http://www.java-tips.org/java-se-tips/java.io/read-a-text-file-from-a-jar.html

furacao123

a classe que contem o metodo esta no seguinte pacote

model.versao

Qual é o pacote da classe que contem o método carregaDadosBase?
Da uma olhada:
http://www.java-tips.org/java-se-tips/java.io/read-a-text-file-from-a-jar.html

entao ler o arquivo diretamente eu consigo, o problema é na hora de listar os arquivos do pacote, isso é o mais estranho.

fbl.lucas

Ja tentou colocar seu path sem a ‘/’ no fim?

String path = "/model/versao/scripts/base/dados";
furacao123

sim mesmo assim ele nao lista os arquivos do pacote

Henrique.tenorio

try { java.io.InputStream in = getClass().getResourceAsStream("arquivo.txt"); java.io.Reader reader = new java.io.InputStreamReader(in); java.io.BufferedReader leitor = new java.io.BufferedReader(reader); String dados=" "; while ((dados = leitor.readLine()) != null) { retorno = ""+dados; } } catch (Exception ioe) { result = ""; }

Criado 15 de fevereiro de 2012
Ultima resposta 11 de abr. de 2012
Respostas 11
Participantes 6