Como ler arquivos MP3 e MPEG e salva-los em outro diretorio

Existe um modo de ler arquivos MP3 e salva-los em outro diretorio.
Pesquisei no google quase todo o exemplos com txt tentei usa-los com mp3
mas os arquivos que salvei todos se danificaram.
Desde já agradeço.

[quote=Daniel.F]Existe um modo de ler arquivos MP3 e salva-los em outro diretorio.
Pesquisei no google quase todo o exemplos com txt tentei usa-los com mp3
mas os arquivos que salvei todos se danificaram.
Desde já agradeço.[/quote]

Vc não precisa ler o arquivo para o copiar.
Vc precisa u sar a classe File que é uma referencia ao arquivo.
Para mover o arquivo basta usar o metodo rename dessa classe.
Para criar um outro arquivo em outro lugar vc precisa usar as classes FileInputStream e FileOutputStream
(ou a API de canais) para fazer a copia.

Mas o problema que eu não coloquei é que este arquivo
será serializado via soket.
Portanto acho que referencia ao arquivo será perdida.

Procura sobre o pacote java.nio (Acho que tem algo nos artigos do GUJ)

Vera que é muita mais fáçil fazer isso.

O codigo abaixo faz a copia de qualquer arquivo para qualquer diretorio que você queira !

public boolean gravar(InputStream in, String fileName) throws Exception{		
		boolean gravado = false;
		String destino = "C://";
		
		try {
			BufferedInputStream bufferIn = new BufferedInputStream(in);
			
			File file = new File(destino + fileName);
			file.createNewFile();
			
			OutputStream bos = new FileOutputStream(file);
			
			int teste = 0;
			while ((teste = bufferIn.read()) != -1) {
				bos.write(teste);		
            }			
			
			in.close();
			bufferIn.close();
			bos.close();
			
			gravado = true;
			
		} catch (Exception e) {
			throw new Exception(getClass().getSimpleName() + " : " + e.getMessage()); 
		}	
		
		return gravado;
	}	

Onde a variavel (String destino = “C://”; ) corresponde ao diretorio !

[quote=Daniel.F]Mas o problema que eu não coloquei é que este arquivo
será serializado via soket.
Portanto acho que referencia ao arquivo será perdida.[/quote]

Você tem que copiar o arquivo para o socket em uma máquina. E na outra máquina copiar do soket para o arquivo.
A operação de copia pode ser feita assim:


	public static void copy(InputStream in , OutputStream out) throws IOException{
		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
	}

Esta versão funciona, mas não é muito eficiente. Uma versão usando Channel seria melhor.
O ponto é que vc tem um método para copiar entre um input e um output.

No codigo da máquina que envia o arquivo


File file = new File("caminho/para/o/arquivo/de/origem");
Socket socket = ... 

copy(new FileInputStream(file), socket.getOutputStream());

no codigo da máquina que recebe

File file = new File("caminho/para/o/arquivo/de/destino");
Socket socket = ... 

copy(socket.getInputStream(),new FileOutputStream(file));

É só isso, mas vc tem que entender o conceito de Stream e a diferença entre um inputStream e um outputStream.

Eu não estou casa agora vou tentar todas essas alternativas eu agradeço muito .
Mas se não me engano InputStream é abstrata
como eu vou instancia-la?

[quote=Daniel.F]Eu não estou casa agora vou tentar todas essas alternativas eu agradeço muito .
Mas se não me engano InputStream é abstrata
como eu vou instancia-la?[/quote]

Não precisa. Vc obtem uma instancia do socket ou usando FileInputStrem().

Tinha me esquecido que FileInputStream é subclasse de
InputStream