gpt4 book ai didi

java - 如何使用具有自定义文件扩展名的 H2 数据库?

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:45 24 4
gpt4 key购买 nike

我正在构建一个将其数据存储在 H2 数据库文件中的应用程序,因此我的保存文件的扩展名为 .h2.db

打开应用程序时,用户必须选择要加载的保存文件。为了更容易识别这些文件,是否可以告诉 H2 使用自定义文件扩展名?

查看 Database URL overview H2的,我只能指定数据库的名称。我更喜欢像 .save 这样的扩展,而不是默认的 .h2.db。有没有合理的方法来实现这一目标?

解决方法是将 *.save 文件链接到一个临时文件夹,将其重命名为正确的后缀。如果这是唯一的解决方案,我想我会使用默认扩展名。

最佳答案

H2 数据库支持可插拔文件系统,因此通过一些额外的代码,您可以使用任何您想要的扩展。您只需要创建一个包装器,注册它并使用您自己的数据库 URL。包装器可能如下所示:

package my.test;

import org.h2.store.fs.FilePath;
import org.h2.store.fs.FilePathWrapper;

public class FilePathTestWrapper extends FilePathWrapper {
private static final String[][] MAPPING = {
{".h2.db", ".save"},
{".lock.db", ".save.lock"}
};

@Override
public String getScheme() {
return "save";
}

@Override
public FilePathWrapper wrap(FilePath base) {
// base.toString() returns base.name
FilePathTestWrapper wrapper = (FilePathTestWrapper) super.wrap(base);
wrapper.name = getPrefix() + wrapExtension(base.toString());
return wrapper;
}

@Override
protected FilePath unwrap(String path) {
String newName = path.substring(getScheme().length() + 1);
newName = unwrapExtension(newName);
return FilePath.get(newName);
}

protected static String wrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[1])) {
fileName = fileName.substring(0, fileName.length() - pair[1].length()) + pair[0];
break;
}
}
return fileName;
}

protected static String unwrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[0])) {
fileName = fileName.substring(0, fileName.length() - pair[0].length()) + pair[1];
break;
}
}
return fileName;
}
}

然后你需要注册它:

FilePathTestWrapper wrapper = new FilePathTestWrapper();
FilePath.register(wrapper);

并像这样使用数据库 URL:

"jdbc:h2:save:./mydatabase"

注意“save:”前缀,它应该匹配 getScheme() 方法返回的字符串。我在这里放了更多细节:http://shuvikov.net/blog/renaming-h2-database-files

关于java - 如何使用具有自定义文件扩展名的 H2 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28939788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com