关于java:file.getPath()的相对路径

relative path for file.getPath()

本问题已经有最佳答案,请猛点这里访问。

在这个程序中,我试图选择一个文件并读取这个文件的项目的相对路径。

1
2
3
4
5
6
7
8
        FileChooser photo = new FileChooser();
        Stage stage = new Stage();stage.setTitle("File Chooser Sample");
        openButton.setOnAction((final ActionEvent t) -> {
            File file = photo.showOpenDialog(stage);
            if (file != null) {
                System.out.println(file.getPath());;
            }
        });

我的项目路径是C:users151eclipse工作区flexierntgui

我在Eclipse IDE中运行这个程序

当我选择C:users151eclipse workspaceflexierntgui
es1.jpg

而不是打印相对路径"/res/1.jpg"

它仍然打印出绝对路径C:users151eclipse workspaceflexierntgui
es1.jpg


您需要获取当前目录/项目根目录的URI,然后使用java.net.URI.relativize()方法查找所选文件的相对路径w.r.t您的项目根目录。像这样:new File(cwd).toURI().relativize(file.toURI()).getPath()

以下是PSEDO代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package org.test;

import java.io.File;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class FileChooserDemo extends Application {

    public FileChooserDemo() {};

    public static void main(String[] args) throws ClassNotFoundException {
        FileChooserDemo.launch(FileChooserDemo.class);
    }

    public void chooseFileAndPrintRelativePath() {
        FileChooser photo = new FileChooser();
        Stage stage = new Stage();
        stage.setTitle("File Chooser Sample");
        Button openButton = new Button("Choose file");
        openButton.setOnAction((t) -> {
            File file = photo.showOpenDialog(stage);
            if (file != null) {
                String cwd = System. getProperty("user.dir");
                System.out.println(new File(cwd).toURI().relativize(file.toURI()).getPath());
            }
        });
        //Creating a Grid Pane
        GridPane gridPane = new GridPane();    
        //Setting size for the pane
        gridPane.setMinSize(400, 200);
        gridPane.add(openButton, 0, 0);
        Scene scene = new Scene(gridPane);
        stage.setScene(scene);
        stage.show();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        chooseFileAndPrintRelativePath();
    }

}


您可以避免使用旧的java.io包,而使用java.nio。您的代码看起来会更好,而且会更短(同时使用新的库)。

要执行此操作,只需获取当前工作目录:

1
2
var pwd = Paths.get("").toAbsolutePath();
var relative = pwd.relativize(Paths.get("someOtherPath"));

我希望这有帮助。