3

私は、Windows または MacOS で使用するために配布される Java でいくつかのソフトウェアを開発しています。現在、iMac でプログラミングを行っています (Apple 固有の要件のため)。次の方法では、ヘルプファイル (.pdf) をリソースからドラッグしてローカルにコピーし、ローカル マシンで表示できるようにします。

private void mHelpActionPerformed(java.awt.event.ActionEvent evt) {                                      
    String sourceFile = "resources/BRC2Help.pdf";
    String destFile = "brc2help.pdf";
    File f = new File (destFile);
    if (!f.exists()) {
            try {
            URL url = ClassLoader.getSystemResource(sourceFile) ;
            InputStream is = url.openStream();
            OutputStream os = new FileOutputStream(destFile);
            byte[] b = new byte[2048];
            int length;
            while ((length = is.read(b)) != -1) {
                os.write(b, 0, length);
            }
            is.close();
            os.close();
            System.out.printf("loaded pdf file from resources: %d bytes\n",f.length());
            } catch (IOException ex) {System.out.printf("loadPDF: %s\n",ex);}
    } else {
        System.out.printf("%s exists: %d bytes\n",destFile,f.length());
    }

    try {
        if (f.exists()) {
                f.setReadable(true);
                if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(f);
            } else {
                System.out.println("Awt Desktop is not supported!");
            }
        }
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(this,
                String.format("%s\n",ex),
                "Helpfile Problem?",
                JOptionPane.ERROR_MESSAGE);
    }
}                                     

これはすべて Mac では十分に機能しますが、IOExceptionWindows 7 では次のようになります。

java.io.IOException: Failed to open file:/C:/Program%20Files/BRC2/brc2help.pdf. Error message: Access denied.

ここで何がうまくいかないのですか?.pdf ファイルを他の場所にコピーしようとしましたが、結果は同じです。

4

3 に答える 3

2

Windowsで実行する場合のプログラムの作業ディレクトリは何ですか?プログラムを実行しているユーザーコンテキストに、への書き込み権限がない可能性がありますc:\Program Files\

ファイルへのパスを指定しなかったのでc:\program files\brc\、プログラムの実行中はそれが作業ディレクトリであると想定しています。Program FilesWindows Vista以降、およびその他のディレクトリに書き込めるには、完全な管理者権限が必要です。

更新日:2012年7月1日

わかりました。プログラムをスタブしてメインクラスとして実行し、Desktop.getDesktop().open(f);Windows7でPDFファイルを開くことができました。EclipseがクラスファイルをコンパイルしたbinディレクトリにPDFファイルを手動で配置しました。

ここで、クラスファイルとpdfをのサブディレクトリに移動してc:\program files\、アクセス拒否の例外が発生するかどうかを確認する必要があります。

Desktop.getDesktop().open(f);ふむ、 PDFファイルが入っているときに開くことができましたc:\program files\test\。以下の出力を参照してください。

C:\Program Files\test>"\Program Files (x86)\Java\jre7\bin\java.exe" MyTestClass
brc2help.pdf exists: 943123 bytes

C:\Program Files\test>dir
 Volume in drive C is OS
 Volume Serial Number is 2035-793F

 Directory of C:\Program Files\test

07/01/2012  10:25 PM    <DIR>          .
07/01/2012  10:25 PM    <DIR>          ..
07/01/2012  09:55 PM           943,123 BRC2Help.pdf
07/01/2012  09:57 PM             2,391 MyTestClass.class
               2 File(s)        945,514 bytes
               2 Dir(s)  567,516,254,208 bytes free

どのJREを使用していますか?私のはjava version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08)

于 2012-07-01T19:03:44.753 に答える
0

私はHeatfanJohnに同意します、それは間違いなく許可の問題です。

コマンドラインから管理者としてJavaコードをコンパイルしてみてください。管理者としてcmd.exeを実行してから、コンパイル/実行を再試行してください。

于 2012-07-01T19:28:05.810 に答える
0

同じ問題が発生しています。原因はわかりませんが、解決策を見つけました。

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL \"" + StringEscapeUtils.escapeJava(f.getAbsolutePath()) + "\"");

これは Windows 専用であるため、デスクトップの方法が失敗した場合にのみ使用してください。

于 2014-12-06T23:28:13.453 に答える