在Java中传递文件位置时出错

在Java中传递文件位置时出错,java,javafx,Java,Javafx,我正在尝试用Java创建一个媒体播放器。 为了做到这一点,我在文件所在的位置传递了一个字符串,但得到了一个错误 操作系统:MacOSX IDE:Pycharm @Override public void start(Stage primaryStage) throws Exception{ String file="~/Users/ViditShah/IdeaProjects/MediaPlayer/src/sample/1.mp4"; Player player = new

我正在尝试用Java创建一个媒体播放器。 为了做到这一点,我在文件所在的位置传递了一个字符串,但得到了一个错误

操作系统:MacOSX
IDE:Pycharm

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

    String file="~/Users/ViditShah/IdeaProjects/MediaPlayer/src/sample/1.mp4";
    Player player = new Player(file);
    Scene scene = new Scene(player,720,480, Color.BLACK);
    primaryStage.setScene(scene);
    primaryStage.show();

}
球员级别:

public class Player extends BorderPane {
    Media media;
    MediaPlayer player;
    MediaView  view;
    Pane apane;
    Player(String file)
    {
        media =new Media(file);
        player = new MediaPlayer(media);
        view = new MediaView(player);

        apane.getChildren().add(view);

        setCenter(apane);
    }
}
解析文件字符串时显示错误。
我想我在定位文件路径时犯了一个错误,未能找到解决方案。

您显然是在试图将文件系统路径传递给构造函数。根据报告:

媒体类表示媒体资源。它是从源URI的字符串形式实例化的

源必须表示有效的URI,并且是不可变的。仅支持HTTP、文件和JAR URL。如果提供的URL无效,则将引发异常

因此,将文件系统路径传递给
媒体
构造函数是毫无意义的。您必须将URI的字符串形式传递给它

这里可能有两种不同的情况(出于某种原因,您拒绝澄清您正在尝试做的事情)。您可能正在尝试播放属于应用程序一部分的视频,在这种情况下,视频将在部署应用程序时包含在应用程序的jar文件中,或者您正在尝试在运行时播放用户提供的视频

在前一种情况下,您基本上需要从JVM加载类的任何地方加载视频(无论是文件系统,通常在开发期间,还是从jar文件,通常在部署应用程序之后)。为此,您从类加载器获取URI

如果视频与当前类位于同一软件包中,则可以执行以下操作:

String videoURI = getClass().getResource("1.mp4").toURI().toString();
然后(通过
播放器
构造函数)将其传递给
媒体
构造函数

或者更一般地说,您可以以
/
开头资源名称,在这种情况下,将相对于类路径搜索资源名称:

String videoURI = getClass().getResource("/sample/1.mp4").toURI().toString();
另一方面,如果正在播放用户提供的视频,则可以从
文件
对象创建URI:

File file = ... ;
String videoURI = file.toURI().toString();
例如,您可以执行以下操作:

FileChooser chooser = new FileChooser();
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("mp4 video files", "*.mp4"));
File file = chooser.showOpenDialog(primaryStage);
if (file != null) {
    String videoURI = file.toURI().toString();
    // ...
}

您的主目录中有一个名为
Users
的文件夹?这似乎不太可能。我不知道什么是
Player
,在不知道的情况下,不可能真正回答这个问题,但是JavaFX中的大多数方法都希望通过URL(或URL的字符串形式)而不是文件路径传递某种资源。~ shell不是Java吗。您必须使用完整路径或getenv$HOME。或者,您可以使用“user.home”属性。@James\u我已经添加了播放器类代码,并且在桌面上还有一份媒体文件的副本。我需要path来输入字符串path with never work,Java不知道什么是
~
。请阅读:“媒体类表示媒体资源。它是从源URI的字符串形式实例化的。”因此,您不应该在这里传入文件路径。看起来mp4是您实际项目的一部分(而不是用户文件系统上的内容),因此一旦部署了应用程序,它就不再是一个文件,而是捆绑在包含应用程序的jar文件中。包含您发布的代码的类是否与mp4在同一个包中?