Java 中 <String,"Some Class"> 的巨大地图

Huge Map of <String,"Some Class"> in Java

在我的应用程序中,我需要根据文件的 MIME 字符串将有关文件的信息显示为友好的可读字符串。我有我需要的信息(仅供参考 /usr/share/mime/package/freedesktop.org.xml on Ubuntu 14.04),我想把所有东西都作为静态地图<"String","MIMEInfoObject">.

protected class MIMEInfoObject {
    //Getters ...
    //Setters ...
    ...
    private String mimeType; //Example: "application/pdf
    private String defaultDescription; // "PDF document"
    private String localDescription; // "Documento PDF"
    private String acronym; // "PDF"
    private String extendedAcronym; // "Portable Document Format"
    private List<String> extensionList; // "pdf .."
    private List<String> aliasList; // "application/x-pdf, application/acrobat, ... "
}

我制作了一个 shell 脚本来输出 linux 文件,如下所示:

<mime-type type="image/vnd.adobe.photoshop">
<comment>Photoshop image</comment>
<comment xml:lang="pt_BR">Imagem do Photoshop</comment>
<glob pattern="*.psd"/>
<alias type="image/psd"/>
<alias type="image/x-psd"/>
<alias type="image/photoshop"/>
<alias type="image/x-photoshop"/>
<alias type="application/photoshop"/>
<alias type="application/x-photoshop"/>
++++END+++

我在另一个 shell 脚本中使用了该输出,该脚本生成如下 java 代码:

MIMEInfoObject obj;
obj.setMimeType("application/pdf");
obj.setDefaultDescription("PDF document");
obj.setLocalDescription("Documento PDF");
obj.setAcronym("PDF");
obj.setExtendedAcronym("Portable Document Format");
if (obj.getExtensionList() == null) {
    obj.setExtensionList(new ArrayList<String>());
}
extList = obj.getExtensionList();
extList.add("*.pdf");
obj.setExtensionList(extList);
if (obj.getAliasList() == null) {
    obj.setAliasList(new ArrayList<String>());
}
aliasList = obj.getAliasList();
aliasList.add("application/x-pdf");
obj.setAliasList(aliasList);
if (obj.getAliasList() == null) {
    obj.setAliasList(new ArrayList<String>());
}
aliasList = obj.getAliasList();
aliasList.add("image/pdf");
obj.setAliasList(aliasList);
if (obj.getAliasList() == null) {
    obj.setAliasList(new ArrayList<String>());
}
aliasList = obj.getAliasList();
aliasList.add("application/acrobat");
obj.setAliasList(aliasList);
mimeString2Obj.put(obj.getMimeType(), obj);
for (String alias : obj.getAliasList()) {
    mimeString2Obj.put(alias, obj);
}

我知道上面的代码很愚蠢,但我就是这样生成它的,但问题是它生成了大约 17000 行这样的代码。 Java 抱怨该方法的字节数限制为 65535,已超出。

我担心的是,如果有人对如何执行此操作有更好的想法,请记住我正在使用 GWTP(因此我可以使用 JavaScript,尽管我不是专家)和我的应用程序将在 Desktop/Mobile 浏览器和移动应用程序 (phonegap) 上 运行。

提前致谢。

如果我理解正确的话,问题是您正在生成 java 代码来显式加载每个对象,而不是重复使用 java 代码从数据文件加载对象。不要那样做。例如,如果您有更多文件,则必须重新生成代码等。

您需要创建某种标准化的数据文件,并创建一种读取它的方法。因此,如果您的数据是 CSV 或 XML,那么您可以转储到 one/many 文件中,然后不管您有多少数据,java 代码看起来相同的。只是一个简单的循环,可以不断读取和加载地图中的内容。

在伪代码中:

while (records.hasMoreRecords()) {
    records.read()...
    add record to map()
}