Estou com problemas quando tento executar um audio em .jar

um avanço mas tenho uma pergunto de onde ele tirou tanto numero depois do 2? ksksksksk
image
pelo menos não aparece mais null

Isso é automático to tempFile. Ao criar um tempFIle, ele é criado na pasta temp do usuário do sistema operacional. Esse numero garante que não haverá outro arquivo com o mesmo nome e evita erros.

Agora esse erro deve ser por conta dessa parte:

b = stream2file(this.a).getPath();
System.out.println(stream2file(this.a).getPath());
URL url2 = new URL(b);

Em vez disso, faça assim:

File file = stream2file(this.a);
this.fileUrl = file.toURI().toURL();

Uma pergunta esse problema de ele não achar coisas que esta dentro do pacote també serve para imagens?

Sim, mas somente quando é executado através do JAR. Por isso é melhor usar getResourceAsStream em vez de getResource.

nossa kskskkssk vai demorar mais do que eu imaginava ksksk mas ok obrigado

E esse é o topico mais longo que eu ja vi skskksksks

mas do jeito que seu código está, já está quase pronto. Acredito que vá funcionar depois que vc fizer o ajuste que passei.

Alguem sabe como faz isso com imagem?

Mesma coisa, sempre que for ler um recurso de dentro do JAR, utilize o getResourceAsStream.

1 curtida

Faça como o @staroski disse, e depois de obter o InputStream, vc deve converter para um array de bytes (byte[]), assim: https://www.baeldung.com/convert-input-stream-to-array-of-bytes (várias formas de fazer isso nesse link)

1 curtida

obrigado

1 curtida

Eu fiz uns testes e como que eu vou conseguir conerter um inputStream para bytes[] com isso:

public void givenUsingPlainJava_whenConvertingAnInputStreamToAByteArray_thenCorrect()  throws 
IOException {
    InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
    byte[] targetArray = new byte[initialStream.available()];
    initialStream.read(targetArray);

    }

e também ja tentei converter em byte[] de outras formas mas não funcionou,
ja tentei converter em url também mas aconteceu alguma coisa que na hora do IOutilitys.copy(in, out); ele recebia null.

Eu costumo fazer com o método readBytes abaixo:

public byte[] readBytes(InputStream input) throws IOException {
	ByteArrayOutputStream output = new ByteArrayOutputStream();
	copy(input, output);
	return output.toByteArray();
}

public void copy(InputStream source, OutputStream target) throws IOException {
	byte[] buffer = new byte[8192];
	for (int read = -1; (read = source.read(buffer)) != -1; target.write(buffer, 0, read)) { /* corpo deste for é vazio mesmo */ }
	target.flush();
}

Então eu estou com o mesmo problema do som mas agora é com imagem, parece que é so fazer igual ao solção do som mas não é parece ser bem mais complicado pois quando eu compilo tento abrir o jar mostra o erro NullPointerException, e nesse caso o problema foi esse:

Exception in thread “main” java.lang.NullPointerException
at PacoteJogo.ImageLoader.copy(ImageLoader.java:114)
at PacoteJogo.ImageLoader.readBytes(ImageLoader.java:108)
at PacoteJogo.Jogo.Tela(Jogo.java:122)
at PacoteJogo.Main.main(Main.java:26)

de varios problemas com NullPointerException:

O InputStream que você está passando pro readBytes está null.

Posta seu fonte.

    InputStream inp2 = this.getClass().getResourceAsStream("../Sprites/Botão.png");
    byte[] readBytes1 = imageLoader.readBytes(inp2);//Note que o readBytes está dentro da classe ImageLoader
    ImageIcon bb2Im = new ImageIcon(readBytes1);
    JButton bb2 = new JButton(bb2Im);

Esse caminho está errado.

  1. Coloca o ser arquivo em uma pasta (ou pacote) que faça parte do classpath de sua aplicação.

  2. Assegure que esta pasta e arquivos estão dentro do JAR. (Qualquer coisa, posta como está a estrutura dentro do seu JAR)

  3. Não utilize .. no caminho, comece o caminho com / para procurar a partir da raíz do classpath.