Java 从文件读入HashMap

Java 从文件读入HashMap,java,hashmap,text-files,Java,Hashmap,Text Files,我试图用文本文件zadania.txt中的字符串填充HashMap。它是一个简单的文本文件,格式如下: 问:问题1 答:问题1的答案 问:问题2 答:问题2等的答案 然后我想把它写在控制台上,问题是。它运行,但不写任何东西。当我更改源文件时,它可以工作,但我想知道为什么它不能与该文件一起工作。该文件是正常的,没有损坏,以页面形式写入并保存为文本文件。有人能帮忙吗?这是我的密码: import java.io.File; import java.io.FileNotFoundException;

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

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

然后我想把它写在控制台上,问题是。它运行,但不写任何东西。当我更改源文件时,它可以工作,但我想知道为什么它不能与该文件一起工作。该文件是正常的,没有损坏,以页面形式写入并保存为文本文件。有人能帮忙吗?这是我的密码:

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();
    }
}

}

如果使用文件=new Filezadania.txt;的路径;,您需要将文件zadania.txt放在project的根文件夹中


或者,您可以创建文件夹资源,将文件放在那里,并编辑文件的路径file=new Fileresources/zadania.txt

你的代码适合我。因此,如前所述,您应该在第一个循环中添加一些输出,以检查是否插入了某些内容。如果没有,您似乎有一个名为zadania.txt的空文件

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

关上你的钥匙!如果您使用的是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();
    }
}
否则,在较大的程序中,可能会出现文件句柄不足的风险。关闭您打开的任何资源是最佳做法

类名应该按照约定用前导大写字母书写,所以在您的例子中应该是TestClass

如果对这两者都进行迭代,则映射的键和值将使用Map.entrySet方法来获取这两者。对于大型映射,这比迭代键和调用Map.get来获取值要快


这里有另一个选项来读取*.txt文件并将其放入HashMap

我评论了有趣的部分


Patrick

您确定您的文件路径zadania.txt吗。您应该在第一个循环中添加一些调试输出,以确保实际插入了任何内容。
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());
        }
    }

}