Java 在不使用扫描仪的情况下读取文件

Java 在不使用扫描仪的情况下读取文件,java,file-io,Java,File Io,我读的是一个非常简单的文件,其中显示了物品及其价格。看起来是这样的: Shoes 10.00 Jersey 20.00 Cookies 15.00 Light Bulbs 2.00 Paper 5.00 我想将每一项都映射到它的成本,并且我当前的代码工作得很好。然而,它看起来有点笨重,并用null初始化变量,我的项目提交服务器不喜欢并将其视为bug。我正在寻找一种方法,将其转换为更加优雅的内容,从而学会以另一种方式读取文件,而不是依赖Scanner类。也许是使用BufferedReader或P

我读的是一个非常简单的文件,其中显示了物品及其价格。看起来是这样的:

Shoes 10.00
Jersey 20.00
Cookies 15.00
Light Bulbs 2.00
Paper 5.00
我想将每一项都映射到它的成本,并且我当前的代码工作得很好。然而,它看起来有点笨重,并用null初始化变量,我的项目提交服务器不喜欢并将其视为bug。我正在寻找一种方法,将其转换为更加优雅的内容,从而学会以另一种方式读取文件,而不是依赖Scanner类。也许是使用BufferedReader或PrintReader之类的我从未真正掌握过的东西。谢谢你的帮助

    private TreeMap<String, Double> prices = new TreeMap<String, Double>();

     public void readFromFile(String fileName){
                File file = new File(fileName);
                Scanner sc = null; //Server treats this as a bug. 
                try {
                    sc = new Scanner(file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                while (sc.hasNextLine()) {
                    Scanner sc2 = new Scanner(sc.nextLine());
                    while (sc2.hasNext()) {
                        String s = sc2.next(); //Gets the item name
                        prices.put(s, Double.parseDouble(sc2.next())); //The next word is the price
                        }
                    sc2.close();
                    }
}
private TreeMap prices=new TreeMap();
public void readFromFile(字符串文件名){
文件=新文件(文件名);
Scanner sc=null;//服务器将此视为错误。
试一试{
sc=新扫描仪(文件);
}catch(filenotfounde异常){
e、 printStackTrace();
}
while(sc.hasNextLine()){
扫描仪sc2=新扫描仪(sc.nextLine());
while(sc2.hasNext()){
字符串s=sc2.next();//获取项名称
price.put(s,Double.parseDouble(sc2.next());//下一个单词是price
}
sc2.close();
}
}

您可以使用
抛出
进行异常处理,而不是使用
try
catch
语句

public void readFromFile(String fileName) throws FileNotFoundException {
    File file = new File(fileName);
    Scanner sc = new Scanner(file);
    ...
}

这将解决服务器将
null
分配视为错误的问题。

以下是一个示例。异常被抛出,而不是在方法内部处理它们
BufferedReader
StringTokenizer
用于从文件中获取所需的文本

private TreeMap<String, Double> prices = new TreeMap<String, Double>();

public void readFromFile(String fileName) throws FileNotFoundException, IOException {
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    StringTokenizer st;
    String line;
    while ((line = br.readLine()) != null) {
        st = new StringTokenizer(line.trim(), " ");
        prices.put(st.nextToken(), Double.parseDouble(st.nextToken()));
    }
    br.close();
}

您可以对异常使用
throws
,而不是try/catch,这将允许您将
sc
直接分配给
新的扫描仪(文件)
是的,可以始终这样做,但是空值只是一种偷偷的方式,以发现如何以其他方式进行。我一直使用扫描仪,所以寻找不同的东西。感谢您的输入。如果您对
BufferedReader
感兴趣,请在线查看示例-有。我四处查看了。根据我的尝试,只有一种方法可以一行一个字符地阅读完整的文字。我不知道如何在每一行上逐字逐句地做这件事,这正是我在这里需要的。再次感谢。如果不抛出异常(因为在其他地方处理它们更麻烦)并且没有任何空赋值开始,就没有办法做到这一点吗?我只是好奇。您可以使用
try…catch
处理方法中的异常。但这不是一个好办法。
    if (fileName == null) {
        throw new IllegalArgumentException("Invalid String input for fileName. fileName: " + fileName);
    }