다음은 Trace를 제안한 솔루션을 보여주는 예입니다.
엽니,
샘플 응용 프로그램은 응용 프로그램과 함께 패키지 리소스에서 데이터를 읽고 응용 프로그램 디렉토리에 로컬 파일이 저장됩니다 해당 파일을 패키징 된 파일에서 새 파일을 생성 (`.FileEditor ')를 사용자의 홈 디렉토리에 저장한다. 사용자는 텍스트 편집기에서 텍스트를 편집하고 수정 된 텍스트를 로컬 파일에 저장할 수 있습니다. 다음에 응용 프로그램을 실행할 때 패키지 된 텍스트의 텍스트가 아닌 수정 된 텍스트를 읽고 사용합니다.
You are in a maze of twisty passages, all alike.
xyzzy
You are inside the building.
이를 : 빌드 시스템에 의해 자원 출력 및 포장 디렉토리에 FileEditor.java 코드와 동일한 디렉토리에 넣고 복사
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);
}
}
샘플 소스 자원 xyzzy.txt
, 샘플은 JavaFX 응용 프로그램 내에서 TextArea를 사용하여 파일을 편집하지만 기본 시스템 텍스트 편집기에서 구성을 사용하여 쉽게 열 수 있습니다.
getHostServices().showDocument(
editableFilePath.toUri().toURL().toExternalForm()
);
'파일'에 리소스 uri를 넣어도 파일이 아닙니다. 리소스 파일이 jar 파일 안에 있고 편집기가 파일을 예상하면 파일에 대한 액세스 권한을 얻지 못합니다. 리소스로 파일에 액세스 할 수 있도록하는 유일한 방법은 리소스의 내용을 파일로 복사하는 것입니다. – fabian
그러면 패키지 파일에서 새 파일을 만든 다음 해당 파일을 열려면 가장 좋을까요? 그러면 사용자 컴퓨터에 새 파일이 생성됩니까? – Trace
예, 정확히 추적합니다. – jewelsea