2013-09-14 1 views
1

Я хочу открыть файл в моей программе java, но я не могу заставить его работать. Я хотел бы, чтобы моя программа работала на всех платформах, но особенно в ubuntu.Java открытый файл с другой программой

Вот что у меня есть:

private void openFileChoser() { 
    JFileChooser chooser = new JFileChooser("."); 
    int returnVal = chooser.showOpenDialog(getParent()); 
    if(returnVal == JFileChooser.APPROVE_OPTION) { 
     openFile(chooser.getSelectedFile().getAbsolutePath()); 
    } else { 
     System.out.println("Aucun fichier choisi"); 
    } 
} 

/*** 
* ouverture du fichier : 
* @param name 
*/ 
private void openFile(String name) { 
    System.out.println("Ouverture du fichier: " + 
      name); 
    try { 
     Runtime.getRuntime().exec(new String[]{name}); 
     //Desktop.getDesktop().open(new File(name)); //doesn't work on ubuntu 13.04 

    } catch (Exception e) { 
     System.err.println("Erreur d'ouverture du fichier : "+name); 
     e.printStackTrace(); 
    } 
} 

Я пытался открыть файл: /home/user/IdeaProjects/androidresourcehelper/test.xls

И я получил исключение:

java.io.IOException: Cannot run program "/home/user/IdeaProjects/androidresourcehelper/test.xls": error=13, Permission denied 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041) 
    at java.lang.Runtime.exec(Runtime.java:617) 
    at java.lang.Runtime.exec(Runtime.java:485) 
    at com.vaxapp.android.ressources.parser.AppContentPane.openFile(AppContentPane.java:118) 
    at com.vaxapp.android.ressources.parser.AppContentPane.openFileChoser(AppContentPane.java:104) 
    at com.vaxapp.android.ressources.parser.AppContentPane.actionPerformed(AppContentPane.java:96) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:708) 
    at java.awt.EventQueue$4.run(EventQueue.java:706) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
Caused by: java.io.IOException: error=13, Permission denied 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022) 
    ... 42 more 

Интересно, как я мог указать программу для открытия EXCEL-файла. Идеальным было бы получить список программ, доступных в системе, чтобы открыть этот тип файлов, например, если Windows excel доступен для открытия с этим, но если мы на ubuntu, например, чтобы использовать открытый офис, а на Mac использовать что-то еще. Где я могу найти информацию о том, как это сделать?

мне удалось открыть файл XML:

Runtime.getRuntime().exec(new String[]{"gedit","strings.xml}); 

но будет работать только, если установлен Gedit, и я не уверен, что он будет работать на окнах. Теперь мне нужно только открыть xls и xml-файлы. Заранее спасибо

EDIT:

Благодаря намеком Питера и эта ссылка: How do I programmatically determine operating system in Java?

мне удалось создать это временное решение:

private void openFile(String path) { 
    System.out.println("Ouverture du fichier: " + 
      path); 
    try { 
     Tools.OsType osType = Tools.getOsType(); 
     if (osType == Tools.OsType.LINUX) { 
      Tools.FileType fileType = Tools.getFileType(path); 
      if(fileType == Tools.FileType.XML) { 
       Runtime.getRuntime().exec(new String[]{"gedit",path}); 
      } else if(fileType==Tools.FileType.CALC) { 
       openXlFile(path); 
      } else { 
       System.err.println("Extension inconnue"); 
      } 
     } else { 
      Desktop.getDesktop().open(new File(path)); 
     } 
    } catch (Exception e) { 
     System.err.println("Erreur d'ouverture du fichier : "+path); 
     e.printStackTrace(); 
    } 
} 

//localc == libre office 
//oocalc == open office 
    private void openXlFile(String path) throws IOException { 
    try { 
     Runtime.getRuntime().exec(new String[]{"localc",path}); 
    } catch (Exception e) { 
     Runtime.getRuntime().exec(new String[]{"oocalc",path}); 
    } 
} 

ответ

5

Desktop.open() только работает, если система знает, какое приложение открывается по умолчанию для этого типа файла. Если это неправильно настроено, это не то, что вы можете исправить из Java. Вы можете обойти это, угадывая, какую программу следует использовать, как вы это делали, но реальное решение - правильно настроить вашу ОС.

+0

thks для вашего ответа, но как мне настроить ОС, любой намек на Linux? Есть ли способ узнать, было ли это настроено или нет? Моя программа будет зависеть от того, что пользователь установил это, но как бы я знал? Автоматически настроена ли она на Windows и Mac? – vallllll

+0

Это настройка, когда программа установлена. Вы не можете нести ответственность за настройку os. Настройка ассоциаций файлов - это то, что мне нужно для Google. –