Voici un exemple d'application qui illustre la solution que vous avez proposée Trace.
créer un nouveau fichier à partir du fichier compressé, puis ouvrez ce fichier
L'exemple d'application va lire les données d'une ressource fournie avec votre application et enregistrez que dans un fichier local dans un répertoire d'applications (nommé `.FileEditor), dans le répertoire personnel de l'utilisateur. L'utilisateur peut modifier le texte dans un éditeur de texte et enregistrer le texte modifié dans le fichier local. La prochaine fois qu'ils exécuteront l'application, ils liront et utiliseront le texte modifié plutôt que le texte de la ressource empaquetée.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
public class FileEditor extends Application {
private static final Path USER_FILE_PATH = Paths.get(
System.getProperty("user.home"),
".FileEditor"
);
private static final String SOURCE_FILE_NAME = "xyzzy.txt";
@Override
public void start(Stage stage) throws Exception {
if (!Files.isDirectory(USER_FILE_PATH)) {
Files.createDirectory(USER_FILE_PATH);
}
Path editableFilePath = Paths.get(USER_FILE_PATH.toString(), SOURCE_FILE_NAME);
if (!Files.exists(editableFilePath)) {
Files.copy(
FileEditor.class.getResourceAsStream(SOURCE_FILE_NAME),
editableFilePath
);
}
String text = Files.readAllLines(
editableFilePath
).stream()
.collect(Collectors.joining("\n"));
TextArea textArea = new TextArea(text);
MenuItem save = new MenuItem("Save...");
save.setOnAction(event -> {
try {
Files.write(editableFilePath, textArea.getText().getBytes());
} catch (IOException e) {
e.printStackTrace();
}
});
MenuItem exit = new MenuItem("Exit");
exit.setOnAction(event -> stage.hide());
MenuBar menuBar = new MenuBar(
new Menu("File", null, save, exit)
);
BorderPane layout = new BorderPane();
layout.setTop(menuBar);
layout.setCenter(textArea);
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ressource source d'exemple xyzzy.txt
, placé dans le même répertoire que le code FileEditor.java et copié à la sortie des ressources et le répertoire d'emballage par le système de construction:
You are in a maze of twisty passages, all alike.
xyzzy
You are inside the building.
Cette sample utilise un TextArea dans l'application JavaFX pour éditer le fichier, mais vous pouvez tout aussi facilement ouvrir dans l'éditeur de texte système par défaut en utilisant la construction:
getHostServices().showDocument(
editableFilePath.toUri().toURL().toExternalForm()
);
Envelopper une ressource uri dans un fichier ne la transforme pas en fichier. Si le fichier de ressources est dans un fichier jar et que l'éditeur attend un fichier, il n'aura pas accès au fichier. La seule approche que je connaisse pour rendre la ressource accessible en tant que fichier serait de copier le contenu de la ressource dans un fichier ... – fabian
Alors, serait-il préférable de simplement créer un nouveau fichier à partir du fichier, puis ouvrir ce fichier? Est-ce que cela créera un nouveau fichier sur l'ordinateur des utilisateurs? – Trace
Oui, exactement, faites ce Trace. – jewelsea