getResourceAsStream()

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 !!

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

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

.