getResourceAsStream()

23 respostas
J

Pessoal, estou tentando pegar o caminho de um .xml que está dentro de um .jar, no entanto nao consigo. Tive dando uma olhada aqui no forum e provavelmente precisarei dessa linha de codigo abaixo :

InputStream is = getClass().getClassLoader().getResourceAsStream("/relatorios/relatorio.xml");

Minha duvida eh : Como vou pegar, a partir desse código acima, o caminho desse relatorio.xml ?

valeu !!!

23 Respostas

D

Você quer o caminho?
getResource() então.

J

danieldestro:
Você quer o caminho?
getResource() então.

Eu já tentei …

String Diretorio = getClass().getResource("/relatorios//relatorio.xml").getPath();

Mas dá um erro de io, dizendo que não existe o arquivo /relatorios/relatorio.xml

Acho q esse metodo, getResource(), pega o caminho absoluto e no meu caso acho que deveria ser o caminho relativo, pois o relatorio.xml encontra-se num .jar.

valeu !!

D

Tenta tirar a barra inicial do caminho, ou colocar ponto e barra. Eu sempre apanho com isso.

J

Já tentei tirar a barra inicial, mas deu erro !! Como seria essa sua sugestao de ponto e barra ???

valeu !!

D

String Diretorio = getClass().getResource("./relatorios/relatorio.xml").getPath();

J

Tentei tb, mas não deu certo !!! Cara tu tem certeza que está certo da forma que eu estou fazendo ??

valeu !!

D

Olha o que eu fiz:

Teste.java
import java.io.*;

public class Teste {
  public Teste() {
    try {
		System.out.println(this.getClass().getResource("teste.xml").getPath());
		InputStream is = this.getClass().getResourceAsStream("teste.xml");
		byte b[] = new byte[128];
		while( is.read(b) > 0 ) {
			System.out.println(new String(b));
		}
		is.close();
    } catch( Exception e ) {
      e.printStackTrace();
    }
  }

  public static void main( String[] args ) {
    new Teste();
  }
}
MANIFEST.MF
Main-Class: Teste
Classpath:
Compilando...
javac Teste.java
Criando JAR...
jar cvfm t.jar MANIFEST.MF Teste.* teste.xml
Rodando...
java -jar t.jar

Funcionou!

J

Essa tua linha

System.out.println(this.getClass().getResource("teste.xml").getPath());

ta imprimindo o q ?? Seria algo desse tipo :

file:/home/paulo/workspace/Almoxarifado/lib/Relatorio.jar!/relatorios/relatorio.xml

Onde Almoxarifado eh a pasta onde meu projeto foi criado e Relatorio.jar o meu jar que eu quero acessar !
Na minha aplicação eu executo um comando igual ao q está dentro do seu System.out.println(), mas quando eu pego a saida desse comando e passo para uma classe tentar acessar o relatorio.xml retorna um erro dizendo que nao consegue acessar o relatorio.xml.

PS : O q eh aquele Teste. * que vc coloca na hora de criar o jar ??

valeu pela ajuada cara !!!

D

A única maneira de você pegar o conteúdo do seu XML dentro do JAR é usando o getResourceAsStream(), diretamente NÃO DÁ.

E o Teste.* inclui o Teste.class e o Teste.java.

J

danieldestro:
A única maneira de você pegar o conteúdo do seu XML dentro do JAR é usando o getResourceAsStream(), diretamente NÃO DÁ.
E o Teste.* inclui o Teste.class e o Teste.java.

Daniel, vou dá uma explicada na minha estrutura para vê se o q eu estou tentando fazer é possível. Coloquei Relatorio.class e relatorio.xml dento de Relatorio.jar, a estrutura do Relatorio.jar está assim :

/relatorios/almoxarifado/Relatorio.class
/relatorios/almoxarifado/relatorio.xml

Coloquei Relatorio.jar no classpath e até aqui tudo blz. Agora, para o Relatorio.class executar eu preciso passar como parametro o caminho do relatorio.xml. Estou tentando pegar esse caminho atraves do seguinte comando :

String Diretorio = getClass().getResource("/relatorios/almoxarifado/relatorio.xml").getPath();

Ai, ao passar esse caminho como parametro, ele dá um erro dizendo q nao consegue encontrar o relatorio.xml.
Isso q eu estou tentando fazer eh possivel nao eh ??

valeu !

D

Já que está no mesmo nível (diretório) do seu xml:
String Diretorio = getClass().getResource(“relatorio.xml”).getPath();

J

danieldestro:
Já que está no mesmo nível (diretório) do seu xml:
String Diretorio = getClass().getResource(“relatorio.xml”).getPath();

Tentei tb , mas nao deu certo ! Deu esse erro : java.lang.NullPointerException

valeu !

D

Cara, se antes não dava null pointer é pq achava o arquivo no seu JAR.
E como eu disse, não é possível acessar (ler) o arquivo do modo que estava pensando. Para pegar o conteúdo TEM QUE SER com getResourceAsStream(), ou então deixa o arquivo fora do jar.

J

Eu não quero pegar o conteudo, mas sim o caminho !! Depois que eu pegar o caminho eu vou passar para o Relatorio.class que de posse do caminho poderar compilar e executar o relatorio.xml.

eh isso mesmo ??

D

Para finalizar. ISSO NÃO É POSSÍVEL.

Passa o conteúdo do XML então, seja em InputStream ou String ou byte, ou sei-lá-o-que.

J

Valeu cara pela ajuda !! Vou ver outra forma aqui de fazer ! No meu caso nao darai certo passar o conteudo nao, poi s meu .class tem que receber o caminho.

valeu !!

C

Eu uso assim na minha aplicação.

package br.com.system.server;

import ....;

class Server
{
...
URL url = this.getClass().getResource( "/br/com/system/log4j.xml" );
...
}

Eu tive problemas para colocar outros JARs e DLLs dentro do JAR de execução, o getResource acessava mas não conseguia acessar. Eu resolvi criando um rotina para copiar esses arquivos para o TEMP e dai usá-los.

[]s

Chulao

J

Na verdade Chulao eu tava querendo recuperar o caminho de dentro de um .jar e não de um diretorio como vc está fazendo, mas de qq forma valeu cara !!

falou !!

C

Deixa eu explicar o que eu estou fazendo para ver se é isso mesmo que você quer.

Eu tenho o JAR da minha aplicação, dentro dela eu tenho uma pasta lib onde eu tenho alguns JAR’s e DLL’s. Eu tenho uma outra estrutura br/com/system/… que é o meu package e dentro do meu package eu tenho vários arquivos XML’s de configuração espalhados.

O getResource sempre funcionou quando eu estava desenvolvendo a aplicação (Eclipse), mas quando eu empacotei o JAR eu tive o mesmo problema.

Para carregar os arquivos XML’s eu não tive problemas, eu simplesmente uso

URL file = this.getClass().getResource("/br/com/system/log4j.xml");

O que pode apresentar problemas é que se você estiver rodando o JAR em um diretório que contenha espaços, como, “arquivos de programas” ele vai retornar um endereço que não vai funcionar (pelo menos eu não consegui), então eu uso

getResource("..").getFile().replaceAll("%20", " ");

Carregar arquivos dentro do JAR funciona sim. Eu tenho DLL’s e JAR’s de outros módulos todos eles empacotados juntos e a minha aplicação reconhece todos eles, alguns diretos outros através do truque de copiar para o temp.

Qualque coisa me passe o código e eu tento ver aqui.

[]s

Chulao

J

Cara tive falando com o daniel e ele falou não ser possível o q eu estou tentando fazer !! Dá uma olhada, eu descrevi a minha estrututra na mensagem de numero 11.

valeu !!

D

Arquivos dentro de um JAR não podem ser acessados via URL ou PATH, somente via getResource.

C

Olá.

Acredito que o getResource facilita a nossa vida, mas se você souber o caminho do JAR e o path interno você consegue criar um objeto URL que irá conseguir carregar o arquivo dentro do JAR.

Exemplo:

package relatorios.almoxarifado;

import java.io.IOException;
import java.net.URL;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

/**
 * @author juliano.lao
 */
public class Relatorio
{
	private static final String configName = "/relatorios/almoxarifado/relatorio.xml";
	private Properties status = new Properties();
	
	public Relatorio() 
			throws InvalidPropertiesFormatException, IOException
	{
		init(1);
	}

	public Relatorio(int type) 
			throws InvalidPropertiesFormatException, IOException
	{
		init(type);
	}

	private void init(int type) 
			throws InvalidPropertiesFormatException, IOException
	{
		URL config;
		
		switch ( type )
		{
			case 1 :
				System.out.println("Tipo 1");
				
				config = this.getClass().getResource( configName );
				
				System.out.println("Config File : " + config.getFile().replaceAll("%20", " ") );
				
				status.loadFromXML( config.openStream() );
				break;
				
			case 2 :
				System.out.println("Tipo 2");
				
				config = new URL(
this.getClass().getResource( configName ).getProtocol(),  
this.getClass().getResource( configName ).getHost(),  
this.getClass().getResource( configName ).getFile().replaceAll("%20", " ") );
				
				System.out.println("Config File : " + config.getFile().replaceAll("%20", " ") );
				
				status.loadFromXML( config.openStream() );
				break;
				
		}
	}
	
	public URL getFile()
	{
		return this.getClass().getResource( configName );
	}
	
	public void status()
	{
		System.out.println("Status : " + status);
	}
	
	public static void main(String[] args) 
			throws InvalidPropertiesFormatException, IOException
	{
		Relatorio rel = new Relatorio();
		
		rel.status();
	}
	
}

Arquivo XML dentro do diretório almoxarifado

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<entry key="status">Funcionou</entry>
</properties>

Classe para testar

package teste;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;

import relatorios.almoxarifado.Relatorio;

/**
 * @author juliano.lao
 */
public class Carregar
{
		public Carregar()
		{
		}
		
		public void load()
		{
			try
			{
				System.out.println("");
				System.out.println("Load");
				Relatorio rel = new Relatorio();
				
				rel.status();
			}
			catch (InvalidPropertiesFormatException e)
			{
				e.printStackTrace();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		
		public void reload()
		{
			try
			{
				System.out.println("");
				System.out.println("Reload");
				Relatorio rel = new Relatorio(2);
				
				rel.status();
			}
			catch (InvalidPropertiesFormatException e)
			{
				e.printStackTrace();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		
		public void copy(String name) 
				throws InvalidPropertiesFormatException, IOException
		{
			File file = new File(name);
			
			FileOutputStream fout = new FileOutputStream(file);
			BufferedOutputStream out = new BufferedOutputStream( fout );
			
			Relatorio rel = new Relatorio();

			BufferedInputStream in = new BufferedInputStream( rel.getFile().openStream() );
			
			int buf;
			
			while ( (buf=in.read()) != -1 )
			{
				out.write(buf);
			}
			
			out.flush();
			
			out.close();
			

			in.close();
		}
		
		public static void main(String[] args) 
				throws InvalidPropertiesFormatException, IOException
		{
			Carregar carregar = new Carregar();
			
			carregar.load();
			
			carregar.reload();
			
			carregar.copy("novo.xml");
		}
}

Ant

<project name="Relatorios" basedir="." default="jar">
	
	<property name="src.dir"		value="src"/>
	<property name="bin.dir"		value="bin"/>
	<property name="jar.relatorio.name"	value="Rel.jar"/>
	<property name="jar.teste.name"		value="Teste.jar"/>
	
	<target name="jar" depends="compile">
		<jar destfile="${jar.relatorio.name}">
			<fileset dir="${bin.dir}">
			    <include name="relatorios/**"/>
			</fileset>
		</jar>

		<jar destfile="${jar.teste.name}">
			<fileset dir="${bin.dir}">
			    <include name="teste/**"/>
			</fileset>
		</jar>

	</target>
		
	<target name="compile">
		<javac srcdir="${src.dir}" destdir="${bin.dir}" />
	</target>
	
</project>

run.bat

java -cp Teste.jar;Rel.jar teste.Carregar

pause

Resultado dentro do Eclipse

Load
Tipo 1
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}

Reload
Tipo 2
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Tipo 1
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml

Resultado no console DOS

Load
Tipo 1
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}

Reload
Tipo 2
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Tipo 1
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml

Acredito que é possível sim acessar um arquivo dentro de um JAR usando URL, eu faço isso nas minhas aplicações para acessar os arquivos XML de configuração e as bibliotecas em DLL e SO.

[]s

Chulao

R

.

Criado 23 de fevereiro de 2005
Ultima resposta 24 de fev. de 2005
Respostas 23
Participantes 4