2015-10-20 55 views
0

Iam嘗試將存在於文件中的內容插入到Hashmap中。我想出了一種方法來實現該目的。但是,我沒有獲得所需的輸出下面提到的是試圖將文件內容加載到散列表中的代碼。無法將文件的內容正確保存到哈希映射中

public static void main (String [] args) 
{ 

    try { 

     StringBuffer fileData = new StringBuffer(1000); 
     BufferedReader reader = new BufferedReader(new FileReader("xxxxxxx")); 
     char[] buf = new char[1024]; 

     int numRead=0; 
     while((numRead=reader.read(buf)) != -1){ 
      String readData = String.valueOf(buf, 0, numRead); 
      fileData.append(readData); 
      buf = new char[1024]; 
     } 

     reader.close(); 
     Map map = new HashMap(); 
     System.out.println(fileData.toString());->(1) 

     StringTokenizer stringTokenizer = new 
     StringTokenizer(fileData.toString()); 
     while (stringTokenizer.hasMoreTokens()) 
     { 
      map.put(stringTokenizer.nextToken().toString(),stringTokenizer.nextToken().toString()); 
     } 

     Iterator iterator = map.entrySet().iterator(); 
     while(iterator.hasNext()) 
     { 
      Map.Entry m = (Map.Entry)iterator.next(); 
      System.out.println("key"+m.getKey());->(2) 
      System.out.println("value"+m.getValue());->(3) 

     } 
    } 

    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 



} 

當我從code.I提到等式1打印正在逐漸所需的輸出(即路徑作爲密鑰和散列作爲值):

C:\Users\rishii\Desktop\input_3\com.AmazingBullshit.Holy_1.03.apk 
66ec456315a7e6c9338b0387171ca89e 
C:\Users\rishii\Desktop\input_3\com.amazon.venezia_release 
13.0003.844.1C_6430003104.apk 
266796d1b8e2e016753ee3bf1b50e591 
C:\Users\rishii\Desktop\input_3\com.android.browser_4.4.2- 
eng.build.20150616.1901504.apk 
4aa2091b0e21fc655e19d07e2ae20982 
C:\Users\rishii\Desktop\input_3\com.android.calculator2_4.4.2- 
eng.build.20150616.1901504.apk 
85313ccbd39a43952906b70b941d321b 
C:\Users\rishii\Desktop\input_3\com.android.calendar_4.4.2- 
eng.build.20150616.1901504.apk 
3c85cb87f2e134a4157e5f3747e4df1b 
C:\Users\rishii\Desktop\input_3\com.android.camera2_2.0.002 
(eng.build.ef73894.060315_142358-70)4.apk 
482205cda6991f89fb35311dea668013 

然而,當我保持它在哈希映射並試圖打印它(使用eq(2)和eq(3)),我得到了不同的輸出。

key: 
    dd383abe48e591f40504cbb4dff80958 
    value: 
    C:\Users\rishii\Desktop\input_3\com.android.quicksearchbox_4.4.2- 
    eng.build.20150616.1901504.apk 
key: 
482205cda6991f89fb35311dea668013 
value: 
C:\Users\rishii\Desktop\input_3\com.android.contacts_4.4.2- 
eng.build.20150616.1901504.apk 
key: 
C:\Users\rishii\Desktop\input_3\com.AmazingHolyBull_1.03.apk 
value: 
66ec456315a7e6c9338b0387171ca89e 

如果你能觀察輸出具有changed.Especially在上面的輸出,其中的「關鍵項是路徑」和「值項是哈希」的最後兩行。我無法弄清楚爲什麼HashMap的是給人一種怪異的output.I我期待的輸出,看起來像一個確切的原因:

鍵:.apk文件 值的路徑:將.apk文件的哈希值。 與第一個輸出類似。

下面附帶的是它在輸入文件中的方式。

C:\Users\rishii\Desktop\baal\apuslauncher-1.apk 
af05322cf2c682e8c04a0fb9441867f1 
C:\Users\rishii\Desktop\baal\apuslauncher-2.apk 
af05322cf2c682e8c04a0fb9441867f1 
C:\Users\rishii\Desktop\baal\apuslauncher.apk 
af05322cf2c682e8c04a0fb9441867f1 

任何建議將非常有幫助!

+0

嘗試打印每次調用'stringTokenizer.nextToken()的輸出的toString()' – fRoStBiT

+1

它看起來就像每一個值是在一個單獨的線。真的嗎?如果是這樣,不要將整個文件讀入內存,也不要使用'StringTokenizer'。只需使用['BufferedReader.readLine()'](https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29)方法即可。 ---另外,請不要使用StringBuffer,而應使用['StringBuilder'](http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html)。 ['StringBuffer']的Javadoc(http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html)這樣說。 – Andreas

+0

@Andreas我想將它們保存到散列圖 –

回答

1

正如在評論中提到,只需使用BufferedReader.readLine()方法:

// Load file into map 
Map<String, String> map = new HashMap<>(); 
try (BufferedReader reader = new BufferedReader(new FileReader("xxxxxxx"))) { 
    String path, hash; 
    while ((path = reader.readLine()) != null) { 
     if ((hash = reader.readLine()) == null) 
      throw new IllegalArgumentException("Found path without hash"); 
     map.put(path, hash); 
    } 
} 

// Print map 
for (Entry<String, String> entry : map.entrySet()) { 
    System.out.println("path: " + entry.getKey()); 
    System.out.println("hash: " + entry.getValue()); 
} 
+0

Android有它自己的文件閱讀方式。如果你必須在android studio中讀取文件,它是「InputStream XmlFileInputStream = getResources()。openRawResource(R.raw.file_input_val);」。這裏的想法是你必須將你的文件保存在你的android studio的原始文件夾中。在這個例子中,我的文件的名字是「file_input_val」。我按照你告訴我的方式只是徒勞地結束 。 –

+0

我剛剛通過您自己的使用'FileReader'的代碼。如果您必須使用'openRawResource'來獲取'InputStream',請嘗試使用'new BufferedReader(new InputStreamReader(getResources()。openRawResource(R.raw.file_input_val)))''。 – Andreas