2012-10-18 4 views
3

Мой вопрос: Как открыть файл (в системе по умолчанию [внешняя] программа для файла) без сохранения файла на диск?Как открыть файл без сохранения его на диск

My Situation: У меня есть файлы в моих ресурсах, и я хочу отображать их, не сохраняя их сначала на диске. Например, у меня есть файл 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); 
    } 
} 
+0

Это зависит от того, на какую программу вы пытаетесь загрузить файл. Есть ли у него API или листинг на каком-то порту? В зависимости от вашей ОС вы можете удалить файл, даже если он все еще используется программой - таким образом вы можете использовать свой текущий подход, не беспокоясь о том, когда пользователь будет его просматривать. – whiskeyspider

+0

@whiskeyspider: Ну, с классом Desktop он автоматически определяет значение по умолчанию. Мне понравилось бы многоплатформенное решение, если это возможно :) – kentcdodds

+0

http://superuser.com/questions/430466/in-windows-can-i-redirect-stdout-to-a-named-pipe-in-command -line –

ответ

3

Из-за этой линии:

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

вывожу, что вы работаете на Windows. Вы можете легко сделать этот мультиплатформенный код, знаете ли.

Ответ на ваш вопрос: нет. Класс Desktop должен знать, где находится файл, чтобы вызвать правильную программу с параметром. Обратите внимание, что в этом классе нет метода, принимающего InputStream, что может быть решением.

В любом случае, я не вижу, где проблема: вы создаете временный файл, затем открываете его в редакторе или что-то еще. Хорошо. В Linux, когда приложение завершается (обычно), все его временные файлы удаляются. В Windows пользователю необходимо будет инициировать удаление временных файлов. Однако, если у вас нет ограничений безопасности, я не могу понять, где проблема. В конце концов, временные файлы являются проблемой операционной системы.

+0

Спасибо за советы. +1, если вы можете указать мне в хорошем направлении, чтобы сделать эту многоплатформенную :) Хотя я ценю ваш ответ и, вероятно, буду в любом случае продвигать его ... – kentcdodds

+0

Это очень просто. Вместо использования '\\' в качестве разделителя каталогов используйте константу char/String. Эта константа позволит вашей программе автоматически переходить из «\\» в Windows в «/» в Linux, а не ретранслировать в одном из них. Http: //docs.oracle.com/javase/1.4.2/docs/api/ java/io/File.html # separatorChar – Baltasarq

1

В зависимости от того, как портативное приложение должно быть, там может быть не «одно подходит всем» для решения вашей проблемы. Однако вы можете немного помочь себе:

По крайней мере, под Linux вы можете использовать канал (|), чтобы направлять вывод одной программы на другой. Простой пример для этого (с помощью gedit текстового редактора) может быть:

echo "hello world" | gedit 

Это будет (для Gedit) открывает новое окно редактора и показать содержимое «привет мир» в новом, неспасенному документе.


Проблема с вышеизложенным заключается в том, что это может быть не зависящее от платформы решение. Он будет работать для Linux и, возможно, OS X, но у меня нет установки Windows, чтобы протестировать его.

Кроме того, вам нужно будет самостоятельно найти редактор по умолчанию. Это older question и это linked article дают некоторые идеи о том, как это может работать.

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx –

0

Я не очень хорошо понимаю ваш вопрос. Я вижу только две возможности для вашего вопроса.

  1. Открыть существующий файл, и вы хотите работать на его потоке, но не хотите сохранять никаких изменений.

  2. Создайте файл, чтобы использовать файловый ввод/вывод для работы с файловым потоком, но вы не хотите сохранять поток в файл.

В любом случае ваша основная мотивация заключается в том, чтобы использовать доступ к файлам, доступным для вашего усмотрения и удовольствия от программирования, я прав?

У меня есть ощущение, что вопрос не такой простой, и этот мой ответ, вероятно, не является ответом, который вы ищете. Однако, если мое понимание вопроса совпадает с вашим вопросом ...

Если вы хотите использовать Stream io, вместо использования FileOutputStream или FileInputStream, которые являются следствием открытия объекта File, почему бы не использовать файл без файла InputStream или OutputStream? В любом случае ваши утилиты ввода/вывода файлов в конечном итоге сводятся к манипулированию потоками ввода-вывода.

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

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

Нет необходимости включать временные файлы.

+0

Я отредактировал мой вопрос. Надеюсь, это поможет вам понять, о чем я прошу. – kentcdodds

 Смежные вопросы

  • Нет связанных вопросов^_^