【问题标题】:Error in passing file location in Java [closed]在Java中传递文件位置时出错[关闭]
【发布时间】:2017-08-03 18:55:15
【问题描述】:

我正在尝试用 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);
    }
}

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

【问题讨论】:

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

标签: java javafx


【解决方案1】:

您显然试图将文件系统路径传递给Media 构造函数。根据documentation

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

源必须代表一个有效的 URI 并且是不可变的。仅支持 HTTP、FILE 和 JAR URL。如果提供的 URL 无效,则会抛出异常。

因此,将文件系统路径传递给Media 构造函数根本没有意义。您必须将其传递为 URI 的字符串形式。

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

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

如果视频和当前类在同一个包中,你可以这样做:

String videoURI = getClass().getResource("1.mp4").toURI().toString();

并将其(通过您的 Player 构造函数)传递给 Media 构造函数。

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

String videoURI = getClass().getResource("/sample/1.mp4").toURI().toString();

另一方面,如果您正在播放用户提供的视频,您可以从 File 对象创建一个 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();
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多