gpt4 book ai didi

java - 如何在应用程序运行时从包中打开文本文件?

转载 作者:行者123 更新时间:2023-11-30 02:22:13 25 4
gpt4 key购买 nike

我有一个带有按钮的 JavaFX 应用程序,我想打开一个我已经编写的“帮助文件”,并且我希望当用户按下该按钮时它在默认文本编辑器中打开。该文件位于包含主 FX 类、 Controller 和 FXML 文件的包内。我尝试执行一些不同的操作来打开该文件,但没有一个起作用。这是我目前拥有的方法,在我看来应该有效,但事实并非如此。我究竟做错了什么?为了澄清起见,所有内容所在的包的名称都被命名为“nutritionfx”,并且此代码是 Controller 内的一个方法。

//method to open help file when help button is pressed
@FXML private void handleHelpButton(ActionEvent event) throws IOException, URISyntaxException {
URL url = this.getClass().getResource("/nutritionfx/help.txt");
File file = new File(url.toURI());
Desktop.getDesktop().edit(file);
}

最佳答案

这是一个示例应用程序,演示了您提出的 Trace 解决方案。

create a new file from the packaged file, then open that file

示例应用程序将从应用程序打包的资源中读取数据,并将其保存到用户主目录中应用程序目录(名为“.FileEditor”)中的本地文件中。用户可以在文本编辑器中编辑文本并将修改后的文本保存到本地文件中。下次运行应用程序时,它将读取并使用修改后的文本,而不是打包资源中的文本。

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,放置到与FileEditor.java代码相同的目录中,并由构建系统复制到资源输出和打包目录:

You are in a maze of twisty passages, all alike.
xyzzy
You are inside the building.

foobar

此示例使用 JavaFX 应用程序中的 TextArea 来编辑文件,但您可以使用以下结构在默认系统文本编辑器中轻松打开:

getHostServices().showDocument(
editableFilePath.toUri().toURL().toExternalForm()
);

关于java - 如何在应用程序运行时从包中打开文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com