1

マウス クリックでヘルプ PDF ファイルを開くことができるようにしたいのですが、PDF ファイルは に含まれています.jar(そして Eclipse にインポートされます)。

Help();mouseListener (windowbuilder 経由で追加) で呼び出しています。マウスイベントは正しく機能しています。私が抱えている問題は、PDF ファイルにアクセスする方法がわからないことですNullPointerException。報告を受け続けています。

私の現在のコードは;

if (Desktop.isDesktopSupported()) {
    try {     
        java.io.InputStream is = getClass().getResourceAsStream("/nullpdf.pdf");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        StringBuffer sb = new StringBuffer();
        String line;

        while ((line = br.readLine()) !=null){
            sb.append(line);
        }

        br.close();
        isr.close();
        is.close();
        File afile =new File(line);
        Desktop.getDesktop().open(afile);
    }

    catch (IOException ex) {
      System.out.println("NO PDF READER INSTALLED");
    }
}

nullpdf (IE "package/co/uk/TabSync/nullpdf.pdf") へのより完全なファイル パスも試しましたが、同じNullPointerExceptionでした。

コードを編集して一時ファイルを作成しましたが、まだ機能していません。

public void Help() {
         if (Desktop.isDesktopSupported()) {
              try {
String tempFile = "nullpdf";
              System.out.println(tempFile);
            File temp =File.createTempFile(tempFile, "/home/geeky/Desktop/nullpdf.pdf");
              Desktop.getDesktop().open(temp);
              }
              catch (IOException ex) {
                  ex.printStackTrace();
                  System.out.println("NO PDF READER INSTALLED");
              }
         }
    }

また、デスクトップ上の pdf ファイルへの絶対パスと、nullpdf.pdf だけを試しました。nullpdf.pdf だけを使用すると、何も表示されないリーフパッド ウィンドウが表示されます。デスクトップへの直接フ​​ァイル パスを試すと、次のようになります。

NO PDF READER INSTALLED
java.io.IOException: No such file or directory
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.checkAndCreate(File.java:1717)
    at java.io.File.createTempFile0(File.java:1738)
    at java.io.File.createTempFile(File.java:1850)

アプリケーションにファイルシステムへの書き込み許可を与えるために何かをする必要がありますか?

助けてくれてありがとう。

4

3 に答える 3

0
InputStream input = getClass().getResourceAsStream("/classpath/to/file");

にあるように、パスは " " で始まる必要/がありますclasspath。したがって、ファイルが にcom.testあり、ファイルがmyPDF.pdfである場合、パスは である必要があります/com/test/myPDF.pdf

于 2013-03-27T08:10:27.887 に答える
0
File afile =new File(line);
Desktop.getDesktop().open(afile);

上記のコードは、ファイルがディスクに物理的に書き込まれるまでファイルを開きません。ファイル書き込みコードを見逃しました。

の使い方File(line)が間違っています。File()コンストラクターはdataではなくfile pathStringを取ります。まずファイルにデータを書き込みます。そしてtoメソッドを渡しますcreate()Fileopen()

編集: また、ランダムな場所にファイルを作成する代わりに、一時ファイルを作成します

File temp = File.createTempFile(tempFile, ".pdf"); 

そこにデータを書き込んで渡すDesktop.open()

EDIT:2 *まず第一に、非プレーンテキスト ファイルにはリーダー/ライターを使用しないでください。PDFはプレーンテキストではありません。フォーマットされています。ストリームのみとして読む必要があります。* 以下のコードは機能します。ただし、必ずjarファイルに含めてください。Eclipse でこれを行う 1 つの方法は、project-properties>java-build-path>source に移動して、ここにフォルダーを追加し、その中に pdf ファイルを保持することです。

public void Help() {
        if (Desktop.isDesktopSupported()) {
            try {
            InputStream is = getClass().getResourceAsStream("/test.pdf");
            byte[] data = new byte[is.available()];
            is.read(data);
            is.close();
            String tempFile = "file";
            File temp = File.createTempFile(tempFile, ".pdf");
            FileOutputStream fos = new FileOutputStream(temp);
            fos.write(data);
            fos.flush();
            fos.close();
            Desktop.getDesktop().open(temp);
        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("NO PDF READER INSTALLED");
        }
    }
}

Ps: ファイルをディスクに書き込む方法は次のとおりですhttp://www.mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/

于 2013-03-27T08:10:38.417 に答える
0

このコードはこれを使用して適切に機能しています

try {
    // TODO add your handling code here:
    String path = jTextField1.getText();
    System.out.println(path);
    Path tempOutput = null;
    String tempFile = "myFile";
    tempOutput = Files.createTempFile(tempFile, ".pdf");
    tempOutput.toFile().deleteOnExit();
    InputStream is = getClass().getResourceAsStream("/JCADG.pdf");
    Files.copy(is,tempOutput,StandardCopyOption.REPLACE_EXISTING);
    if(Desktop.isDesktopSupported())
    {
        Desktop dTop = Desktop.getDesktop();
        if(dTop.isSupported(Desktop.Action.OPEN))
        {
            dTop.open(tempOutput.toFile());
        }
    }
} catch (IOException ex) {}
于 2016-02-23T01:53:48.467 に答える