Acessar arquivo jpeg pelo jar

A minha aplicação depende de um arquivo jpeg. Como faço para quando gerar o executavel dessa aplicação e ela rodar na maquina do usuario eu fazer com q esse jpeg seja acessado?

[code]// retorna uma URL (pode ser usado em um ImageIcon por exemplo)
getClass().getResource( “/pacote1/pacote2/pacoteN/arquivo.jpg” );

// ou

// retorna um InputStream
getClass().getResourceAsStream( “/pacote1/pacote2/pacoteN/arquivo.jpg” );[/code]

[]´s

Mas, como é q eu faço pra “jogar” essa imagem na máquina do usuario?

[quote=davidbuzatto][code]// retorna uma URL (pode ser usado em um ImageIcon por exemplo)
getClass().getResource( “/pacote1/pacote2/pacoteN/arquivo.jpg” );

// ou

// retorna um InputStream
getClass().getResourceAsStream( “/pacote1/pacote2/pacoteN/arquivo.jpg” );[/code]

[]´s[/quote]

David, como eu faria para acessar um recurso desta maneira, se minha aplicação fosse distribuída como uma biblioteca?

Eu criei uma biblioteca de comunicação com webservices, e disponibilizo algumas classes que leem arquivos dentro dela mesma. Gostaria de distribuir estes arquivos dentro de pacotes, e depois lelos, mas simplesmente, o getResourceAsStream retorna null.

Cheguei a tentar fazer a leitura, colhendo o contexto de classe, já que minha aplicação vai rodar como biblioteca em outra, mas não consigo acessar os arquivos dentro do pacote dela…

return Thread.currentThread().getContextClassLoader().getResourceAsStream("/pacote1/pacote2/pacote3/arquivo.xsd");

Me recomenda algo?

Crie um pacote dentro do seu projeto só para armazenar as imagens e faça como o davidbuzatto falou. :wink:

Assim a imagem já estará dentro do seu .jar e aí é só ler a imagem.

ops… funciona tb pra txt?
eh soh eu jogar as minha simagens e txt dentro dessa pasta??

então, funciounou para o documento jpg, mas é para o txt? eu tenho uma JTextArea, onde eu seto texto com um arquivo txt. Como eu faço?
Pq para o jpg eu fiz:

icon = new ImageIcon(getClass().getResource( "/meusArquivos/figura_sobre.jpg" )); // onde meusArquivos é um pacote q eu criei

Agora como faço pra um JTextArea??
Na verdade queria atribuir o conteudo desse txt a uma string…

Eu tô fazendo do sehuinte jeito:

private JScrollPane scroll; 
private JTextArea area;

  area=new JTextArea();
  area.setBackground(Color.WHITE);
  area.setText(getText());
  area.setFont(new Font("Arial",Font.PLAIN,11));
  area.setEditable(false);
  scroll = new JScrollPane(area,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  scroll.setLocation(10, 50);
  scroll.setVisible(true);
  scroll.setSize(365, 700);
  add(scroll);
        
   }

public String getText() throws IOException{
        String caminho="";
        String resultado;
        String texto="";
        Read read = new Read();
        caminho=convertStreamToString(getClass().getResourceAsStream("/meusArquivos/manual.txt"));
        read.openFile(caminho);
        resultado= read.readNextLine(); // onde read.nextLine lê linha por linha do meu documento txt
         while(resultado!=null){
             texto=texto+resultado+"\n";
             resultado=read.readNextLine();
         }
        return texto;
    }

public String convertStreamToString(InputStream is) throws IOException {
        if (is != null) {
            Writer writer = new StringWriter();
            char[] buffer = new char[1024];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            } finally {
                is.close();
            }
            return writer.toString();
        } else {
            return "";
        }
    }

mas acontece esses erros:
(A sintaxe do nome do arquivo, do nome do diretório ou do rótulo do volume está incorreta)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ele chega a ler meu arquivo txt, mas a cada linha lida ele coloca um erro.
Alguém sabe o que está acontecendo?

eu mudei o código um pouco:

public String getText() throws IOException{
        String caminho="";
        String resultado;
        String texto="";
        Read read = new Read();
        caminho=getClass().getResource("/meusArquivos/teste.txt").toString();
        //caminho=caminho.replaceAll("/", "//");
        System.out.println(caminho);
        read.openFile(caminho);
        resultado= read.readNextLine();
         while(resultado!=null){
             texto=texto+resultado+"\n";
             resultado=read.readNextLine();
         }
        
        return texto;
    }

Na verdade tirei o metodo convertStreamToString, mas acontece o erro:
(A sintaxe do nome do arquivo, do nome do diretório ou do rótulo do volume está incorreta)
O que é isso?

[quote=oitathi]eu mudei o código um pouco:

public String getText() throws IOException{
        String caminho="";
        String resultado;
        String texto="";
        Read read = new Read();
        caminho=getClass().getResource("/meusArquivos/teste.txt").toString();
        //caminho=caminho.replaceAll("/", "//");
        System.out.println(caminho);
        read.openFile(caminho);
        resultado= read.readNextLine();
         while(resultado!=null){
             texto=texto+resultado+"\n";
             resultado=read.readNextLine();
         }
        
        return texto;
    }

Na verdade tirei o metodo convertStreamToString, mas acontece o erro:
(A sintaxe do nome do arquivo, do nome do diretório ou do rótulo do volume está incorreta)
O que é isso?[/quote]

Utilize a classe BufferedReader para fazer leitura de arquivos, exemplo:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(arquivo), "ISO-8859-1")); String texto = null; while((texto = reader.readLine()) != null){ System.out.println(texto); }

e no caminho utilize a classe File ao invés da String.