2015-10-20 75 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