5

私の質問:ファイルをディスクに保存せずに (システムの既定の [外部] プログラムで) ファイルを開くにはどうすればよいですか?

私の状況:リソースにファイルがあり、それらを最初にディスクに保存せずに表示したいと考えています。たとえば、ファイルがあり、最初にディスクに保存せずに、ファイルxmlを読み取るためのデフォルトのプログラムでユーザーのマシンで開きたいとします。xml

私がやっていること:これまでのところ、ファイルを一時的な場所に保存しただけですが、ファイルがいつ不要になるかを知る方法がないため、いつ/削除するかはわかりません。そのための私のSSCCEコードは次のとおりです (リソースを除いて、ほとんどが sscce です...自分で作成する必要があります)。

package main;

import java.io.*;

public class SOQuestion {

  public static void main(String[] args) throws IOException {
    new SOQuestion().showTemplate();
  }

  /** Opens the temporary file */
  private void showTemplate() throws IOException {
    String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";
    File parentFile = new File(tempDir);
    if (!parentFile.exists()) {
      parentFile.mkdirs();
    }
    File outputFile = new File(parentFile, "template.xml");
    InputStream inputStream = getClass().getResourceAsStream("/resources/template.xml");
    int size = 4096;
    try (OutputStream out = new FileOutputStream(outputFile)) {
      byte[] buffer = new byte[size];
      int length;
      while ((length = inputStream.read(buffer)) > 0) {
        out.write(buffer, 0, length);
      }
      inputStream.close();
    }
    java.awt.Desktop.getDesktop().open(outputFile);
  }
}
4

3 に答える 3

4

この行のため:

String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";

Windowsで作業していると推測します。このコードをマルチプラットフォームにするのは簡単です。

あなたの質問への答えは:いいえ。Desktop クラスは、パラメーターを使用して正しいプログラムを呼び出すために、ファイルの場所を知る必要があります。そのクラスには、解決策になる可能性のある を受け入れるメソッドがないことに注意してくださいInputStream

とにかく、どこに問題があるのか​​ わかりません。一時ファイルを作成してから、エディターなどで開きます。それはいいです。Linux では、アプリケーションが (通常は) 終了すると、すべての一時ファイルが削除されます。Windows では、ユーザーは一時ファイルの削除をトリガーする必要があります。ただし、セキュリティ上の制約がなければ、どこに問題があるのか​​ わかりません。結局、一時ファイルはオペレーティング システムの問題です。

于 2012-10-18T21:54:21.020 に答える
1

アプリケーションに必要な移植性によっては、問題に対する「すべてに適合する」ソリューションがない場合があります。しかし、あなたは少し自分自身を助けることができます:

少なくとも Linux では、パイプ ( |) を使用して、あるプログラムの出力を別のプログラムの入力に送ることができます。そのための簡単な例 (geditテキスト エディターを使用) は次のようになります。

echo "hello world" | gedit

これにより、(gedit の場合) 新しいエディター ウィンドウが開き、保存されていない新しいドキュメントに "hello world" という内容が表示されます。


上記の問題は、これがプラットフォームに依存しないソリューションではない可能性があることです。Linux とおそらく OS X で動作しますが、テストするための Windows インストールはここにはありません。

また、デフォルトのエディターを自分で見つける必要があります。この古い質問リンクされた記事は、これがどのように機能するかについていくつかのアイデアを提供します。

于 2012-10-18T21:46:21.637 に答える
0

あなたの質問がよくわかりません。あなたの質問には 2 つの可能性しかないと思います。

  1. 既存のファイルを開き、そのストリームを操作したいが、変更を保存したくない。

  2. ファイル I/O を使用してファイル ストリームを操作できるようにファイルを作成しますが、ストリームをファイルに保存したくありません。

どちらの場合でも、あなたの主な動機は、既存のファイル I/O を利用して自由にプログラミングを楽しみたいということですよね?

質問はそれほど単純ではないと感じています。これはおそらくあなたが求めている答えではありません。ただし、質問に対する私の理解があなたの質問と一致する場合...

File オブジェクトを開いた結果生じる FileOutputStream または FileInputStream を使用する代わりに、Stream io を使用する場合は、非ファイルの InputStream または OutputStream を使用しないでください。とにかく、ファイル I/O ユーティリティは最終的に I/O ストリームを操作することになります。

http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

一時ファイルを含める必要はありません。

于 2012-10-18T22:04:17.203 に答える