Bom, procurei pelo fórum algum tópico com problema parecido, não encontrei, resolvi então criar um para buscar ajuda de vcs.
Estou engatinhando com java, e estou desenvolvendo um programinha que tenho pronto em vb6, mas estou refazendo ele em java, muito bem, meu problema é , esse programa fornece um JFilechooser, o usuário escolhe um arquivo,o programa mapeia unidades de alguns pcs na rede, e faz a copia do arquivo selecionado pelo usuário nesses mapeamentos, essa rotina já funciona com perfeição, o meu problema é que, quando eu copio arquivos com espaços em branco no nome (ex: c:\meu arquivo de teste.txt) com FileChannel, ele me retorna um java.lang.InterruptedException, cópias com arquivos de nomes sem espaço em branco funcionam normalmente, minhas dúvidas: nesse caso eu preciso desenvolver uma rotina que trate os espaços nos arquivos, ou há outro jeito???, eu andei pesquisando bastante na documentação da java.nio.channels.FileChannel e não consegui (entender ou encontrar uma solução).
eis um pedaço do código
...
public static void main(String[] args) throws IOException{
/*eu criei a classe prova mais acima do código, que cria um JFileChooser onde o usuário seleciona um arquivo para a copia
e joga o caminho (.getPath();) na variável caminho, e criei tmb uma variável arq_sel com o nome do arquivo, essas variaveis
estão declaradas como public static na classe prova que não colei aqui no código por não achar necessário, já que isso já está funcionando normalmente.)
Prova.escolherArquivos();
try {
//váriavel que age como contador das unidades mapeadas, começando com a unidade g:
char var ='g';
//variável que age como contador dos ip dos pcs a serem mapeados.
int ip =18;
while (ip<=31 && var<='g'){
//if para pular o mapeamento no pc com ip final 24, pois não é necessário realizar o mapeamento dele
if(ip==24){
ip++;
}
else{
String map ="net use "+ var +": \\10.2.8."+ ip +"\c$";
String destino = ""+ var + ":\Documents and Settings\master\Desktop\"+ arq_sel +"";
//executa o comando no prompt do windows e mapeia as unidades
Runtime.getRuntime().exec(map);
//faz a copia dos arquivos
//a variavel caminho está declarada no código como public static na classe prova que é minha classe principal e seu valor vem do JFileChooser
FileChannel orig = new FileInputStream(caminho).getChannel();
FileChannel dest = new FileOutputStream(destino).getChannel();
dest.transferFrom(orig, 0,orig.size());
orig.close();
dest.close();
var++;
ip++;
}
}
}
catch(IOException e){
e.printStackTrace();
}
}
Bem amigos, espero que não tenha sido muito confuso, e como eu disse estou começando com java, sugestões, ensinamentos e “puxões de orelha” são muito bem vindos!!! , abraços …vlw.
Nunca vi isso.
Há uns meses eu fiz um projetinho pra facilitar a vida com operações de IO, e utilizei as classes do pacote java.nio inúmeras vezes. Nunca vi esse problema.
Aliás, testei agora com um arquivo com espaço no nome, e o problema não aconteceu. Meu código para cópia de arquivo é exatamente igual ao que você postou.
Detalhe é que eu duvido muito que a exceção que você postou tenha a ver de fato com os espaços em branco no nome do arquivo.
Talvez tenha sido só uma coincidência, e o problema está em outro trecho do seu código.
o que eu estou achando estranho é que , o problema não acontece quando o arquivo não tem espaços no nome, ele roda normalmente, faz a copia do arquivo com sucesso, o problema só ocorre quando o arquivo tem um ou mais espaços, quanto a excessão só postei pois foi o que aparece…rs
Não postei no código anterior, falta de atenção minha, mas ele também informa acesso negado, mas já de antemão, tenho permissão total em ambos os diretórios, o arquivo não está sendo utilizado por ninguem e por nenhum outro processo, acontecem dúvidas frequentes com esse erro (acesso negado) no filechannel e problema geralmente está na falta de colocar o nome do arquivo de destino no FileOutputStream, que não é o caso, já verifiquei isso
java.io.FileNotFoundException: C:\Documents and Settings\Administrador\Meus documentos\semiotica aplicada02.pdf (Acesso negado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileInputStream.(FileInputStream.java:66)
at Prova.main(Prova.java:54)
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at sun.java2d.Disposer.run(Disposer.java:125)
at java.lang.Thread.run(Thread.java:619)
código completo :
import java.io.*;
import java.nio.channels.FileChannel;
import javax.swing.*;
public class Prova {
// variável que contém o caminho (origem) absoluto do arquivo a ser copiado.
static String caminho;
//variável que contém o nome do arquivo para o file channel
static String arq_sel;
public static void escolherArquivos() throws IOException{
File[] arquivos = null;
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("Escolha o(s) arquivo(s)...");
fc.setDialogType(JFileChooser.OPEN_DIALOG);
fc.setApproveButtonText("OK");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setMultiSelectionEnabled(true);
int resultado = fc.showOpenDialog(fc);
if (resultado == JFileChooser.CANCEL_OPTION){
System.exit(1);}
arquivos = fc.getSelectedFiles();
for(File f : arquivos){
caminho = f.getCanonicalPath();
arq_sel = f.getName();
}
}
public static void main(String[] args) throws IOException{
Prova.escolherArquivos();
try {
char var ='g';
int ip =18;
while (ip<=18 && var<='t'){
if(ip==24){
ip++;
}
else{
String map ="net use "+ var +": \\10.2.8."+ ip +"\c$";
String destino = ""+ var + ":\Documents and Settings\master\Desktop\"+ arq_sel +"";
System.out.println(map);
System.out.println(destino);
Runtime.getRuntime().exec(map);
FileChannel orig = new FileInputStream(caminho).getChannel();
FileChannel dest = new FileOutputStream(destino).getChannel();
dest.transferFrom(orig, 0,orig.size());
orig.close();
dest.close();
var++;
ip++;
}
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
bom , lembrando mais uma vez, como sou iniciande, derrepente eu coloquei algo a mais ou a menos que não seja tão necessário, caso sim, perdõe… kkkk, e desde já agradeço a força galera… abraços
Seu problema não é com FileChannel mas com Windows.
Digite o comando correspondente (net use g: \blablebli\bloblu\program files\microsoft office) e veja que não vai funcionar, por causa dos malditos espaços… Para funcionar direito, você precisa pôr aspas nos lugares certos. Tente ver se funciona na linha de comando, e depois implemente isso em um programa.
o mapeamento funciona perfeitamente, tanto que são criadas todas as unidades, mas o que vc falou tem sentido, mas não acontece no meu caso, é no momento da copia mesmo.e mais uma vez digo, o programa roda normalmente, do inicio ao fim, sem erros, e o arquivo chega nos pc, quanto seleciono arquivos com espaços entre o nome,
porém me veio uma dúvida, a maioria desses arquivos que copio, tem extensões incomuns ( ou seja, não se trata de .doc, ou .txt), alguns são arquivos vindos de outro software que tem uma extensão de arquivo propria, isso poderia causar problemas no filechannel será? eu tenho que dizer a ele quais extensão vou ultilizar na cópia ??? acho que não né?
a) Você chegou a checar se o mapeamento foi mesmo efetuado? Não vi nenhum tratamento de erro.
b) Se o arquivo superar algumas centenas de megabytes, você não deve usar transferFrom desse jeito que está aí. Você precisa quebrar esse processo em etapas. Em particular, não se pode copiar um arquivo de mais de 2GB só com um unico transferFrom.
A) chequei da forma mais simples possível: é so abrir o meu computador e verificar , fiz isso após rodar o programa, e todas as unidades do g: até o t: estão mapeadas. uma coisa é certa, ainda inclui na rotina a exclusão dos mapeamentos, mas eu tenho um script em batch que eu executo após executar o programa para fazer isso.
B)Ja sabia sobre tamanhos, por isso usei o Filechannel simples do jeito que está pois os arquivos não passam de 5 mb
mas mesmo assim, obrigado pela força entanglement…abraços,
percebi o seguinte, que o problema parece estar relacionado a extensão do arquivo, pois testando exaustivamente, com vários arquivos, o erro acontece quando estou copiando arquivos pdf, e de extensões mais incomuns, tipo .srb, .llz( que são extensões próprias de um software que temos aqui). e que quando insiro parenteses no nome de qualquer arquivo de qualquer extensão, ele chega a copiar o arquivo, mas mostra a excessão.
entanglement, acho só para funcionar por enquanto e colocar o aplicativo pra rodar em produção, vou usar Runtime.getruntime.exec(xcopy …);, a princípio, já logo de cara pensei nisso, porém não fiz pois queria aprender como o java trata manipulação de arquivos e operação de IO, ai com o tempo vou tentar descobrir onde eu estou errando com o FileChannel, eu estou lendo mais aprofundamente sobre ele na documentação. mas vlw ajuda kra, …
mas então rod.attack agora quanto a linha 54 referida no erro, não tinha percebido ela kra, porém só vou conseguir ver amanha, to na facul e os servidores agora a noite , onde trabalham vão passar por manutenção, então, não sei ainda te responder com exatidão o que tem nela, mas amanha de manha eu posto, pra ver se conseguimos matar essa, obrigado pela paciencia e pelas dicas , vlw kras…abraços