Melhor maneira de abrir um documento em Java?
Pergunta
Tenho usado o seguinte código para abrir documentos do Office, PDF, etc.em minhas máquinas Windows usando Java e está funcionando bem, exceto por algum motivo, quando um nome de arquivo o incorporou em vários espaços contíguos, como "Arquivo[SPACE][SPACE]Test.doc".
Como posso fazer isso funcionar?Não sou avesso a enlatar todo o código ...mas prefiro não substituí-la por uma biblioteca de terceiros que chame JNI.
public static void openDocument(String path) throws IOException {
// Make forward slashes backslashes (for windows)
// Double quote any path segments with spaces in them
path = path.replace("/", "\\").replaceAll(
"\\\\([^\\\\\\\\\"]* [^\\\\\\\\\"]*)", "\\\\\\\"$1\"");
String command = "C:\\Windows\\System32\\cmd.exe /c start " + path + "";
Runtime.getRuntime().exec(command);
}
EDITAR: Quando eu o executo com o arquivo errado, o Windows reclama de encontrar o arquivo.Mas...quando executo a linha de comando diretamente da linha de comando, ela funciona perfeitamente.
Solução
Se você estiver usando Java 6, você pode simplesmente usar o método aberto de java.awt.Desktop para iniciar o arquivo usando o aplicativo padrão da plataforma atual.
Outras dicas
Não tenho certeza se isso vai te ajudar muito ...Eu uso Java 1.5+ Construtor de Processos para iniciar scripts de shell externos em um programa java.Basicamente eu faço o seguinte:(embora isso possa não se aplicar porque você não deseja capturar a saída dos comandos;você realmente quer iniciar o documento - mas talvez isso desencadeie algo que você possa usar)
List<String> command = new ArrayList<String>();
command.add(someExecutable);
command.add(someArguemnt0);
command.add(someArgument1);
command.add(someArgument2);
ProcessBuilder builder = new ProcessBuilder(command);
try {
final Process process = builder.start();
...
} catch (IOException ioe) {}
O problema pode ser o comando "iniciar" que você está usando, em vez da análise do nome do arquivo.Por exemplo, isso parece funcionar bem na minha máquina WinXP (usando JDK 1.5)
import java.io.IOException;
import java.io.File;
public class test {
public static void openDocument(String path) throws IOException {
path = "\"" + path + "\"";
File f = new File( path );
String command = "C:\\Windows\\System32\\cmd.exe /c " + f.getPath() + "";
Runtime.getRuntime().exec(command);
}
public static void main( String[] argv ) {
test thisApp = new test();
try {
thisApp.openDocument( "c:\\so\\My Doc.doc");
}
catch( IOException e ) {
e.printStackTrace();
}
}
}