无需硬编码路径即可读取大量文件

Reading a large number of files without hardcoding their path

这可能更像是一个 "best practices" 类问题,但我正在尝试在我当前的项目中使用两个文本文档,并且不确定继续阅读 and/or 存储的最佳方法他们。我目前将它们的路径硬编码到我的文件阅读器中,这绝对不是我想要的(下面是当前实现)。

try (BufferedReader reader = new BufferedReader(new FileReader("C:\e\t\c\.\text.txt"))) {
        String line;
        while ((line = reader.readLine()) != null) {
            string1 = string1 + " " + line;
        }
    }

这可行,但我必须更改每台使用它的计算机的文件位置。

我尝试过的:

我对 Java 和一般的编程还是很陌生,所以如果您需要更多信息或者是否有任何其他我应该提出的问题(或者如果我有类似的问题,请告诉我在我的搜索中遗漏了)。谢谢大家!

编辑:

关于我的程序的功能:我正在做的是获取用户键入的字符串,然后根据我尝试上传的文本文档检查该字符串以查看有多少匹配项(类似于使用 "ctrl+f" 对于您试图在 page/document 中查找的每个单词,其中 page/document 是我尝试上传的单词库)。

我不得不休息一下,但我现在要尝试你的建议。这些看起来都很棒,非常感谢!

你可以把这些文件放在你的应用程序的资源文件夹中,并像这样使用它们:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("test.txt").getFile());

如果资源中有一大堆文件,您可以使用 getResources("");浏览您应用程序中的所有资源,select 一个是您的文本文件。即把它们放在一个特殊的文件夹中,这样区分它们会更容易。

关于内部资源(应用程序中的文本文件如果作为应用程序的一部分提供,则属于内部资源),项目通常会决定目录结构。通常,在一个项目中会有 "src/" 目录,其中包含源代码,在 "src/" 下,您可以放置​​一个名为 "res/" 的文件夹来存放您的资源。为避免资源名称冲突,您可以进一步指定包名称,如结构。所以如果你的 class 有包 com.example.*,那么你可以将 text.txt 放在 res/com/example/ 现在在你的 class 中负责读取资源,你可以有:

try (InputStream in = getClass().getResourceAsStream("/res/com/example/text.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
        String line;
        while ((line = reader.readLine()) != null) {
            string1 = string1 + " " + line;
        }
}

但是,如果文本文件必须由用户系统提供,那么它们就是外部资源,在这种情况下,必须在运行时提供它们的路径。通常,作为程序本身的参数。所以在你的 main() 方法中捕获文件的路径如下:

String fileName = args[0]; // assuming the user has provided arguments

try (InputStream in = Files.newInputStream(Paths.get(fileName));
        BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
        String line;
        while ((line = reader.readLine()) != null) {
            string1 = string1 + " " + line;
        }
}

有很多好的建议,但没有人提到环境变量或系统属性。您可以为您的 OS 定义一个环境变量并像这样获取它:

String configPath = System.getenv("CONFIG_PATH");

或者您可以在启动时向应用程序传递一个系统变量:

java -jar app.jar -DconfigPath="/home/..."

然后在代码中使用:

String configPath = System.getProperty("configPath");