我正在为我们的应用程序开发一个图形安装程序。由于没有可用的安装程序生成器满足要求和约束,我正在从头开始构建它。
安装程序应该在多个操作系统上运行,因此路径处理需要与操作系统无关。为此,我编写了以下小实用程序:
public class Path {
private Path() {
}
public static String join(String... pathElements) {
return ListEnhancer.wrap(Arrays.asList(pathElements)).
mkString(File.separator);
}
public static String concatOsSpecific(String path, String element) {
return path + File.separator + element;
}
public static String concatOsAgnostic(String path, String element) {
return path + "/" + element;
}
public static String makeOsAgnostic(String path) {
return path.replace(File.separator, "/");
}
public static String makeOsSpecific(String path) {
return new File(path).getAbsolutePath();
}
public static String fileName(String path) {
return new File(path).getName();
}
}
现在我的代码到处都是,Path.*Agnostic
并且Path.*Specific
在很多地方调用。很明显,这很容易出错并且根本不透明。
我应该采取什么方法来使路径处理透明且不易出错?是否存在已经解决此问题的任何实用程序/库?任何帮助将不胜感激。
编辑:
为了举例说明我的意思,这是我不久前写的一些代码。(题外话:原谅冗长的方法。代码处于初始阶段,很快将进行一些重度重构。)
一些上下文:ApplicationContext
是一个存储安装数据的对象。installationRootDirectory
其中包括多个路径,例如installationDirectory
等。这些路径的默认值是在创建安装程序时指定的,因此始终以与操作系统无关的格式存储。
@Override
protected void initializeComponents() {
super.initializeComponents();
choosePathLabel = new JLabel("Please select the installation path:");
final ApplicationContext c = installer.getAppContext();
pathTextField = new JTextField(
Path.makeOsSpecific(c.getInstallationDirectory()));
browseButton = new JButton("Browse",
new ImageIcon("resources/images/browse.png"));
browseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setAcceptAllFileFilterUsed(false);
int choice = fileChooser.showOpenDialog(installer);
String selectedInstallationRootDir = fileChooser.getSelectedFile().
getPath();
if (choice == JFileChooser.APPROVE_OPTION) {
c.setInstallationRootDirectory(
Path.makeOsAgnostic(selectedInstallationRootDir));
pathTextField.setText(Path.makeOsSpecific(c.getInstallationDirectory()));
}
}
});
}