1. 程序启动
  2. 判断程序运行操作系统类型
  3. 根据操作系统类型去执行对应操作系统的方法
  4. 判断win c盘中appdata中指定的文件夹是否存在,如果存在读入数据,如果不存在就在appdata路径中创建一个文件夹

创建配置文件

如果是windows系统,就直接将AppData目录作为配置文件的存放目录:

  1. String roamingConfigHome = System.getenv("APPDATA");
  2. if (roamingConfigHome != null) {
  3. File roamingConfigHomeFile = new File(roamingConfigHome);
  4. if (roamingConfigHomeFile.exists()) {
  5. return new File(roamingConfigHomeFile, Constants.CONFIG_FILENAME);
  6. }
  7. }

此时roamingConfigHome的值为:C:\Users\erbin\AppData\Roaming
而配置文件的名称为:

  1. public static final String CONFIG_FILENAME = "jd-gui.cfg";

将appdata作为用户目录,是windows桌面程序一个常见的做法

读取配置文件
org.jd.gui.service.configuration.ConfigurationXmlPersisterProvider

  1. @Override
  2. public Configuration load() {
  3. // Default values
  4. // 获取窗口默认的像素
  5. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  6. // 判断默认的像素与程序支持的(设置在类中的固定值)比较
  7. int w = (screenSize.width>Constants.DEFAULT_WIDTH) ? Constants.DEFAULT_WIDTH : screenSize.width;
  8. int h = (screenSize.height>Constants.DEFAULT_HEIGHT) ? Constants.DEFAULT_HEIGHT : screenSize.height;
  9. int x = (screenSize.width-w)/2;
  10. int y = (screenSize.height-h)/2;
  11. Configuration config = new Configuration();
  12. // 将刚才获得的值一一设置进Configuration类的config实例对象中
  13. config.setMainWindowLocation(new Point(x, y));
  14. config.setMainWindowSize(new Dimension(w, h));
  15. config.setMainWindowMaximize(false);
  16. // 好像是要从win电脑的系统环境中提取什么值,但是在程序测试中是null
  17. String defaultLaf = System.getProperty("swing.defaultlaf");
  18. config.setLookAndFeel((defaultLaf != null) ? defaultLaf : UIManager.getSystemLookAndFeelClassName());
  19. // System.out.println(System.out.printf("user.dir"));
  20. // 获取了文件夹,好像是拿到了程序所在的文件夹
  21. // recentSaveDirectory对象中包含这个文件下所有的一级文件夹和文件
  22. File recentSaveDirectory = new File(System.getProperty("user.dir"));
  23. config.setRecentLoadDirectory(recentSaveDirectory);
  24. config.setRecentSaveDirectory(recentSaveDirectory);
  25. // 如果这个jd-gui.cfg配置文件是存在的
  26. if (FILE.exists()) {
  27. // 使用文件流对象打开jd-gui.cfg文件
  28. try (FileInputStream fis = new FileInputStream(FILE)) {
  29. // 因为jd-gui.cfg写入的格式为xml 所以使用一个xml对象来解析
  30. // 但是我又一个疑惑了,到底是什么时候才存在jd-gui的配置文件
  31. // 因为看下面的操作,在jd-gui.cfg中好像已经存在了key
  32. XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(fis);
  33. // Load values
  34. String name = "";
  35. Stack<String> names = new Stack<>();
  36. List<File> recentFiles = new ArrayList<>();
  37. boolean maximize = false;
  38. Map<String, String> preferences = config.getPreferences();
  39. // 利用xml语法根据key value的形式获取配置文件中的值?不过比较疑惑的地方在于 这些内容是什么时候放进去的呢?(20210802)
  40. while (reader.hasNext()) {
  41. switch (reader.next()) {
  42. case XMLStreamConstants.START_ELEMENT:
  43. names.push(name);
  44. name += '/' + reader.getLocalName();
  45. switch (name) {
  46. case "/configuration/gui/mainWindow/location":
  47. x = Integer.parseInt(reader.getAttributeValue(null, "x"));
  48. y = Integer.parseInt(reader.getAttributeValue(null, "y"));
  49. break;
  50. case "/configuration/gui/mainWindow/size":
  51. w = Integer.parseInt(reader.getAttributeValue(null, "w"));
  52. h = Integer.parseInt(reader.getAttributeValue(null, "h"));
  53. break;
  54. }
  55. break;
  56. case XMLStreamConstants.END_ELEMENT:
  57. name = names.pop();
  58. break;
  59. case XMLStreamConstants.CHARACTERS:
  60. switch (name) {
  61. case "/configuration/recentFilePaths/filePath":
  62. File file = new File(reader.getText().trim());
  63. if (file.exists()) {
  64. recentFiles.add(file);
  65. }
  66. break;
  67. case "/configuration/recentDirectories/loadPath":
  68. file = new File(reader.getText().trim());
  69. if (file.exists()) {
  70. config.setRecentLoadDirectory(file);
  71. }
  72. break;
  73. case "/configuration/recentDirectories/savePath":
  74. file = new File(reader.getText().trim());
  75. if (file.exists()) {
  76. config.setRecentSaveDirectory(file);
  77. }
  78. break;
  79. case "/configuration/gui/lookAndFeel":
  80. config.setLookAndFeel(reader.getText().trim());
  81. break;
  82. case "/configuration/gui/mainWindow/maximize":
  83. maximize = Boolean.parseBoolean(reader.getText().trim());
  84. break;
  85. default:
  86. if (name.startsWith("/configuration/preferences/")) {
  87. String key = name.substring("/configuration/preferences/".length());
  88. preferences.put(key, reader.getText().trim());
  89. }
  90. break;
  91. }
  92. break;
  93. }
  94. }
  95. if (recentFiles.size() > Constants.MAX_RECENT_FILES) {
  96. // Truncate
  97. recentFiles = recentFiles.subList(0, Constants.MAX_RECENT_FILES);
  98. }
  99. config.setRecentFiles(recentFiles);
  100. if ((x >= 0) && (y >= 0) && (x + w < screenSize.width) && (y + h < screenSize.height)) {
  101. // Update preferences
  102. config.setMainWindowLocation(new Point(x, y));
  103. config.setMainWindowSize(new Dimension(w, h));
  104. config.setMainWindowMaximize(maximize);
  105. }
  106. reader.close();
  107. } catch (Exception e) {
  108. assert ExceptionUtil.printStackTrace(e);
  109. }
  110. }
  111. if (! config.getPreferences().containsKey(ERROR_BACKGROUND_COLOR)) {
  112. config.getPreferences().put(ERROR_BACKGROUND_COLOR, "0xFF6666");
  113. }
  114. config.getPreferences().put(JD_CORE_VERSION, getJdCoreVersion());
  115. return config;
  116. }

jd-gui在对配置文件读取的方式为:xml。
在正式解析前,会判定配置文件是否存在。