2015-05-09 72 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");