2015-05-09 80 views
3

这可能更像是“最佳实践”类型的问题,但我试图在当前项目中使用两个文本文档,但不确定是否继续进行此操作的最佳方式阅读和/或存储它们。我目前有路径硬编码到我的文件读取器,这绝对不是我想要的(下面为当前实现)。读取大量文件而不对其路径进行硬编码

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”表示您正试图在页面/文档中查找的每个单词,其中页面/文档是我尝试上传的单词库)。

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

+0

这些文件包含一些你想要在你的应用中使用的词或者更特别的东西? – crAlexander

+0

@Kean不要忘记回来接受答案。 :) – CKing

回答

0

关于内部资源(应用程序中的文本文件是作为应用程序的一部分提供的内部资源),项目通常会决定目录结构是什么。通常,在一个项目中会有“src /”目录,其中的源代码位于“src /”下,你可以为你的资源放置一个名为“res /”的文件夹。为避免资源名称冲突,您可以进一步指定包名称,如结构。所以,如果你的类有包com。示例*,那么你可以把在res/COM /例子的text.txt /现在你们班负责资源的阅读,你可以有:

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; 
     } 
} 
+1

这与我所解决的解决方案最相似。唯一真正的区别是不用getClass()我用WhateverClass.class.getResourceAsStream(“/ file/location/relative/to/WhateverClass/here”);我相信如果我花了更多时间,我可以用其他答案做到这一点,但我有点紧张。谢谢! – Kean

+0

将资源放在通用目录(如/res/test.txt)中是不好的做法,因为它在使用多个库的应用程序中存在冲突风险。它们应该放在一个类似包的目录中,然后通过向* Class.getResourceAsStream传递* relative *路径来检索它们。例如,如果读取资源的类是'com.example.MyApp',那么资源应该放在src/res/com/example/test.txt中,并且应该使用'WhateverClass.class.getResourceAsStream(“test。 TXT“)'。 – VGR

+0

是的,非常好的一点。请参阅答案的更新版本 – AlmasB

0

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

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

如果有文件,在资源的整个bounch,你可以使用getResources(“”);浏览您的应用程序中的所有资源,并选择一个作为您的文本文件。即把它们放在一个特殊的文件夹中,因此区分它们会更轻松。

+0

尽管这会删除路径的硬编码,但仍需要对文件名进行硬编码。 – CKing

+0

@ChetanKinger如果你在资源文件夹中使用它,它实际上已经成为你的应用程序的一部分,所以对名称进行硬编码并不是什么问题。 –

+0

对千位文件的名称进行硬编码确实是IMO的一个问题。从解决这个问题的角度来看,它没有真正的优势,因为你所做的只是缩短获得硬编码的字符串。 – CKing

0

已经有很多很好的建议,但没有人提到的环境变量或系统属性。您可以定义一个环境变量为您的操作系统,并得到这样的:

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

或者当你启动它,你可以通过应用程序的系统变量:

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

然后在代码中使用它:

String configPath = System.getProperty("configPath"); 
相关问题