首先我们需要重写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);
}