首先我们需要重写properties类中stringPropertyNames方法,因为该方法底层实现基于hashTable是无序的所以生成的hashcode不一样。需要用LinkedHashSet替换其实现。
实体过程如下所示:
1.重写方法
public class ProperUtils extends Properties {
/** LinkedHashSet有序,可以保证读取出来顺序不变 */
private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
/**
* 顺序读取key集合
*
* @return
*/
@Override
public Set<String> stringPropertyNames() {
Set<String> set = new LinkedHashSet<String>();
for (Object key : keys) {
set.add((String) key);
}
return set;
}
}
2.调用实现顺序读取文件
public class Demo{
// 读取properties类 Properties props = new ProperUtils();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream("src/main/resources/properties/" + 文件名), "UTF-8"));
props.load(reader);
Set<String> property = props.stringPropertyNames();
if (property != null && property.size() > Common.ZERO) {
for (String key : property) {
// 数据包
MrmsDynamicListData data = new MrmsDynamicListData();
data.setKey(key).setTitle(props.getProperty(key));
routes.add(data);
}
}
} catch (Exception e) {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
// 2.1. 若只需要读取不在乎顺序的话, 则只需用ResourceBundle类即可:
// 读取properties类
ResourceBundle rb = ResourceBundle.getBundle("properties/文件名");注:该文件名不可输入后缀,默认读取resources目录下文件
if (rb != null) {
for (String key : rb.keySet()) {
try {
// 数据包
MrmsDynamicListData data = new MrmsDynamicListData();
// 数据类型转变(防止乱码)
String title = new String(rb.getString(key).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
data.setKey(key).setTitle(title);
routes.add(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 2.2. 若使用jar包运行代码,则需要替换文件读取器:
// 获取文件地址
ClassPathResource resource = new ClassPathResource("/properties/" + FileName);
// 读取文件内容
BufferedReader reader = reader = resource.getReader(StandardCharsets.UTF_8);
}
文章讲述了如何通过重写Properties类的stringPropertyNames方法,使用LinkedHashSet保证键的顺序不变,以及如何使用ResourceBundle类读取properties文件,同时提供了在jar包环境下读取文件的方法。
3974

被折叠的 条评论
为什么被折叠?



