docs: public void read(@WillClose InputStream in) throws IOException {
          BufferedInputStream prefStream = null;
          Properties props = new Properties();
          try {
              prefStream = new BufferedInputStream(in);
              props.load(prefStream);
          } finally {
              try {
                  if (prefStream != null) {
                      prefStream.close();
                  }
              } catch (IOException ioe) {
                  // Ignore
              }
          }
  
          if (props.size() == 0) {
              return;
          }
  
          Properties prefixlessProperties = new Properties();
          for (Map.Entry<?, ?> e : props.entrySet()) {
              if(e.getKey() instanceof String) {
                  String key = e.getKey().toString();
                  String value = e.getValue().toString();
                  prefixlessProperties.setProperty(key.replace("/instance/edu.umd.cs.findbugs.plugin.eclipse/", "")
                                                      .replace("/instance/com.github.spotbugs.plugin.eclipse/", ""), value);
              } else {
                  prefixlessProperties.put(e.getKey(), e.getValue());
              }
          }
          props = prefixlessProperties;
  
          for (int i = 0; i < MAX_RECENT_FILES; i++) {
              String key = "recent" + i;
              String projectName = (String) props.get(key);
              if (projectName != null) {
                  recentProjectsList.add(projectName);
              }
          }
  
  
          for (Map.Entry<?, ?> e : props.entrySet()) {
  
              String key = (String) e.getKey();
              if (!key.startsWith("detector") || key.startsWith("detector_")) {
                  // it is not a detector enablement property
                  continue;
              }
              String detectorState = (String) e.getValue();
              int pipePos = detectorState.indexOf(BOOL_SEPARATOR);
              if (pipePos >= 0) {
                  String name = detectorState.substring(0, pipePos);
                  String enabled = detectorState.substring(pipePos + 1);
                  detectorEnablementMap.put(name, Boolean.valueOf(enabled));
              }
          }
  
          if (props.get(FILTER_SETTINGS_KEY) != null) {
              // Properties contain encoded project filter settings.
              filterSettings = ProjectFilterSettings.fromEncodedString(props.getProperty(FILTER_SETTINGS_KEY));
          } else {
              // Properties contain only minimum warning priority threshold
              // (probably).
              // We will honor this threshold, and enable all bug categories.
              String threshold = (String) props.get(DETECTOR_THRESHOLD_KEY);
              if (threshold != null) {
                  try {
                      int detectorThreshold = Integer.parseInt(threshold);
                      setUserDetectorThreshold(detectorThreshold);
                  } catch (NumberFormatException nfe) {
                      // Ok to ignore
                  }
              }
          }
          if (props.get(FILTER_SETTINGS2_KEY) != null) {
              // populate the hidden bug categories in the project filter settings
              ProjectFilterSettings.hiddenFromEncodedString(filterSettings, props.getProperty(FILTER_SETTINGS2_KEY));
          }
          if (props.get(RUN_AT_FULL_BUILD) != null) {
              runAtFullBuild = Boolean.parseBoolean(props.getProperty(RUN_AT_FULL_BUILD));
          }
          effort = props.getProperty(EFFORT_KEY, EFFORT_DEFAULT);
          includeFilterFiles = readProperties(props, KEY_INCLUDE_FILTER);
          excludeFilterFiles = readProperties(props, KEY_EXCLUDE_FILTER);
          excludeBugsFiles = readProperties(props, KEY_EXCLUDE_BUGS);
          customPlugins = readProperties(props, KEY_PLUGIN);
      }