从文件读入HashMap

时间:2014-06-07 12:04:39

标签: java hashmap text-files

我试图用文本文件(zadania.txt)中的字符串填充我的HashMap。它是一个简单的文本文件,格式如下:

问:问题1 答:问题1的答案 问:问题2 答:回答问题2等......

然后我想在控制台上写出来,这里的问题是。它运行,但没有写出任何东西。当我更改源文件时,它可以工作,但我想知道它为什么不能使用该文件(文件正常,没有损坏,写在Pages中并保存为文本文件)。有人可以帮忙吗?这是我的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;


public class testClass {


public static void main(String[] args) {
    // TODO Auto-generated method stub
    File file = new File("zadania.txt");
    try {
        Scanner skaner = new Scanner(file);
        HashMap<String,String> questions = new HashMap<String,String>();
        while(skaner.hasNext()){
            String question = skaner.nextLine();
            String answer = skaner.nextLine();
            questions.put(question, answer);
        }
        Iterator<String> keySetIterator = questions.keySet().iterator();
        while(keySetIterator.hasNext()){
            String key = keySetIterator.next();
            System.out.println(key + "//** " +questions.get(key));
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

3 个答案:

答案 0 :(得分:0)

如果您使用该文件File file = new File("zadania.txt");的路径,则需要将文件zadania.txt放在项目的根文件夹中。

或者您可以创建文件夹resources将文件放在那里并编辑File file = new File("resources/zadania.txt");的路径

答案 1 :(得分:0)

您的代码适合我。因此,正如已经提到的Oli Charlesworth,您应该在第一个循环中添加一些输出,以检查是否插入了某些内容。如果不是,您似乎有一个名为zadania.txt的空文件。


其他一些java程序的其他提示:

  1. 关闭skaner!如果您使用的是Java 7,则可以使用try-with-resources:

    try (Scanner skaner = new Scanner(file)){
        //...
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    否则使用finally结构:

    Scanner skaner = null;
    try {
        skaner = new Scanner(file)
        //...
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if(skaner != null) {
            skaner.close();
        }
    }
    

    否则,您可能会冒险(在较大的程序中)用完文件句柄。关闭您打开的任何资源的最佳做法。

  2. 班级名称应按照惯例编写,并带有大写字母,因此在您的情况下,它应为TestClass

  3. 如果迭代两者,则Map的键和值使用Map.entrySet()方法来获取两者。对于大型地图,这比迭代密钥和调用Map.get()以获取值更快。

答案 2 :(得分:0)

这是另一个选择,您可以阅读* .txt文件并将其放入HashMap

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class App {

    public static void main(String[] args) {
        Map<String, String> questions = new HashMap<>();
        Scanner scanner = null;
        try {
            scanner = new Scanner(new FileInputStream(new File("zanader.txt")));
            while (scanner.hasNext()) {
                String question = scanner.nextLine();
                String answer = scanner.nextLine();
                questions.put(question, answer);
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }

        // get an iterator
        Iterator<Map.Entry<String, String>> itr = questions.entrySet().iterator();
        // and go through it
        while (itr.hasNext()) {
            // get the entryset from your map
            Map.Entry<String, String> value = itr.next();
            // return only the key
            String question = value.getKey();
            System.out.println("Get answer by key: " + questions.get(question));
            System.out.println("Question: " + value.getKey() + " - Answer: " + value.getValue());
        }
    }

}

我评论了有趣的部分。

帕特里克