97

How do I open a file with the default associated program in Java? (for example a movie file)

Zach Scrivena
  • 29,073
  • 11
  • 63
  • 73
Frederic Morin
  • 8,733
  • 4
  • 28
  • 27
  • 1
    If you are using `JavaFX` go [here](https://stackoverflow.com/questions/50774910/gethostservices-showdocument-in-a-fxml-file/50775157#50775157) or [here](https://stackoverflow.com/questions/33094981/javafx-8-open-a-link-in-a-browser-without-reference-to-application). – SedJ601 Oct 19 '18 at 14:34

4 Answers4

161

You can use Desktop.getDesktop().open(File file). See the following question for other options: "[Java] How to open user system preffered editor for given file?"

Community
  • 1
  • 1
Zach Scrivena
  • 29,073
  • 11
  • 63
  • 73
  • 1
    I keep getting this exception when trying with a movie file but it work with an image file (bmp): java.io.IOException: Failed to open file:/D:/vidz/2006-04-02.wmv. Error message: The parameter is incorrect. – Frederic Morin Feb 15 '09 at 19:30
  • Can you provide your code in the question? Also, which OS and Java version are you using? – Zach Scrivena Feb 15 '09 at 19:36
  • what I don't understand is that it work with images... anyway I'm using Java 1.6.0.06 and here's the code: File file = new File(MoviePlay.getInstance().getBasePath(), movieFile.getPath()); try { Desktop.getDesktop().open(file); } catch(ex) { ... } – Frederic Morin Feb 17 '09 at 02:03
  • oh and btw, file.exist() == true – Frederic Morin Feb 17 '09 at 02:04
  • @Blade: Could you try file.getCanonicalFile() to see if there's a difference? – Zach Scrivena Feb 17 '09 at 03:13
  • I get this message instead: java.io.IOException: Failed to open file:/D:/vidz/2006-04-02.wmv. Error message: The parameter is incorrect. – Frederic Morin Feb 24 '09 at 20:29
  • 5
    I know it's been a long time but... the problem was my machine. The default program assiciation in my Windows XP are not ok and I'm having issue in other programs. I tried with other machines since then and this method work just fine ! Accepted ! – Frederic Morin Apr 04 '09 at 01:33
  • 7
    Adding to this old answer; `.edit()` can also be used if the purpose of opening is for editing. Some systems have different default applications for viewing and editing; `.open()` will open the viewer. – Jason C Mar 17 '14 at 02:50
2

few examples to open files with default program

Example 1 : Runtime.getRuntime().exec("rundll32.exe shell32.dll ShellExec_RunDLL " + fileName);
Example 2 : Runtime.getRuntime().exec("rundll32.exe url.dll FileProtocolHandler " + fileName);
Example 3 : Desktop.getDesktop().open(fileName);


alternative...

Runtime.getRuntime().exec(fileName.toString());
Runtime.getRuntime().exec("cmd.exe /c Start " + fileName);
Runtime.getRuntime().exec("powershell.exe /c Start " + fileName);
Runtime.getRuntime().exec("explorer.exe " + fileName);
Runtime.getRuntime().exec("rundll32.exe SHELL32.DLL,OpenAs_RunDLL " + fileName);

Or....

public static void openFile(int selecType, File fileName) throws Exception {

    String[] commandText = null;

    if (!fileName.exists()) {
        JOptionPane.showMessageDialog(null, "File not found", "Error", 1);
    } else {

        switch (selecType) {
            case 0:
                //Default function
                break;
            case 1:
                commandText = new String[]{"rundll32.exe", "shell32.dll", "ShellExec_RunDLL", fileName.getAbsolutePath()};
                break;
            case 2:
                commandText = new String[]{"rundll32.exe", "url.dll", "FileProtocolHandler", fileName.getAbsolutePath()};
                break;
            case 3:
                commandText = new String[]{fileName.toString()};
                break;
            case 4:
                commandText = new String[]{"cmd.exe", "/c", "Start", fileName.getAbsolutePath()};
                break;
            case 5:
                commandText = new String[]{"powershell.exe", "/c", "Start", fileName.getAbsolutePath()};
                break;
            case 6:
                commandText = new String[]{"explorer.exe", fileName.getAbsolutePath()};
                break;
            case 7:
                commandText = new String[]{"rundll32.exe", "shell32.dll", "OpenAs_RunDLL", fileName.getAbsolutePath()}; //File open With
                break;
        }

        if (selecType == 0) {
            Desktop.getDesktop().open(fileName);
        } else if (selecType < 8) {
            Process runFile = new ProcessBuilder(commandText).start();
            runFile.waitFor();
        } else {
            String errorText = "\nChoose a number from 1 to 7\n\nExample : openFile(1,\"" + fileName + "\")\n\n";
            System.err.println(errorText);
            JOptionPane.showMessageDialog(null, errorText, "Error", 1);
        }

    }

}
0

SwingHacks has a solution for older versions of Java.

I think they used the Runtime object to execute the 'start' command on windows and there is a similar command on the mac.

l_39217_l
  • 2,090
  • 1
  • 13
  • 15
-9

Here you go:

File myFile = new File("your any type of file url");
FileOpen.openFile(mContext, myFile);

Create a different class within the package:

// code to open default application present in the handset


public class FileOpen {

    public static void openFile(Context context, File url) throws IOException {
        // Create URI
        File file=url;
        Uri uri = Uri.fromFile(file);

        Intent intent = new Intent(Intent.ACTION_VIEW);
        // Check what kind of file you are trying to open, by comparing the url with extensions.
        // When the if condition is matched, plugin sets the correct intent (mime) type, 
        // so Android knew what application to use to open the file
        if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
            // Word document
            intent.setDataAndType(uri, "application/msword");
        } else if(url.toString().contains(".pdf")) {
            // PDF file
            intent.setDataAndType(uri, "application/pdf");
        } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
            // Powerpoint file
            intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
            // Excel file
            intent.setDataAndType(uri, "application/vnd.ms-excel");
        } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) {
            // WAV audio file
            intent.setDataAndType(uri, "application/x-wav");
        } else if(url.toString().contains(".rtf")) {
            // RTF file
            intent.setDataAndType(uri, "application/rtf");
        } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) {
            // WAV audio file
            intent.setDataAndType(uri, "audio/x-wav");
        } else if(url.toString().contains(".gif")) {
            // GIF file
            intent.setDataAndType(uri, "image/gif");
        } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
            // JPG file
            intent.setDataAndType(uri, "image/jpeg");
        } else if(url.toString().contains(".txt")) {
            // Text file
            intent.setDataAndType(uri, "text/plain");
        } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
            // Video files
            intent.setDataAndType(uri, "video/*");
        } else {
            //if you want you can also define the intent type for any other file

            //additionally use else clause below, to manage other unknown extensions
            //in this case, Android will show all applications installed on the device
            //so you can choose which application to use
            intent.setDataAndType(uri, "*/*");
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intent);
    }
}
Eli Sadoff
  • 7,173
  • 6
  • 33
  • 61
Vaibhav Joshi
  • 145
  • 1
  • 5