【问题标题】:How to use FileNameMap interface in Java?如何在 Java 中使用 FileNameMap 接口?
【发布时间】:2017-05-16 08:55:36
【问题描述】:

该接口提供了一种方法,即getContentTypeFor(String fileName)。但是,我不知道如何使用它。我在 Eclipse 中实现了接口并以:

import java.net.FileNameMap;

public class Fnam implements FileNameMap {

public static void main(String[] args) {

}

@Override
public String getContentTypeFor(String fileName) {
    return null;
}
}

该方法返回空值。我应该如何更改它以获得 MIME 类型?

【问题讨论】:

  • 它是如何复制的?我的问题是指 FileNameMap 接口的使用,而不是一般的文件的 Mime 类型

标签: java interface


【解决方案1】:

FileNameMap 是由可理解文件类型的类的方法返回的接口。例如有一个 URLConnection 类,它有一个 getFileNameMap() 方法,就是这样使用的。

private void requestIntent(Uri uri) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    FileNameMap mime = URLConnection.getFileNameMap();
    String mimeType = mime.getContentTypeFor(uri.getPath());
    intent.setDataAndType(uri, mimeType);
    try {
        mActivity.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(mActivity, OResource.string(mActivity, R.string.toast_no_activity_found_to_handle_file), Toast.LENGTH_LONG).show();
    }
}

来自here的例子

因此,您通常不会单独使用 FileNameMap。相反,您可以使用现有的库类来创建实现 FileNameMap 的对象。如果你确实想实现这样一个库,你需要编写这样的代码(取自 UrlConnection 的源代码)

public static synchronized FileNameMap More getFileNameMap() {
316         if ((fileNameMap == null) && !fileNameMapLoaded) {
317             fileNameMap = sun.net.www.MimeTable.loadTable();
318             fileNameMapLoaded = true;
319         }
320 
321         return new FileNameMap() {
322             private FileNameMap map = fileNameMap;
323             public String getContentTypeFor(String fileName) {
324                 return map.getContentTypeFor(fileName);
325             }
326         };
327     }

你在这里看到实现创建了一个实现接口的匿名类;作为接口的实现者,您的责任是想出一种方法来实现该 getContentTypeFor() 方法。

如果您只想获取文件的 mime 类型,那么您可以使用 URLConnection 为您提供一个已经具有该实现的对象,因此只需使用related question 的答案中显示的方法

【讨论】:

  • 第一个例子是指Android而不是纯Java,第二个在我尝试运行时出现了一些问题
【解决方案2】:

它是JDK内部实现的接口,在大多数情况下你应该只使用接口实现,而不是接口本身。

这里是简单的用法示例:

public class Main {
    private static FileNameMap fileNameMap = URLConnection.getFileNameMap();

    public static void main(String... str) {
        System.out.print(fileNameMap.getContentTypeFor("my_file.xml"));
    }

}

打印:

application/xml

seemsMimeTable 只是 JDK 中该接口的当前实现。

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2016-09-25
    相关资源
    最近更新 更多