在 Java 中使用 Scanner 类读取.txt文件

Reading a .txt file using Scanner class in Java

提问人:user12074577 提问时间:11/2/2012 最后编辑:Ripon Al Wasimuser12074577 更新时间:9/13/2019 访问量:764351

问:

我正在开发一个 Java 程序,它逐行读取文本文件,每个文件都有一个数字,将每个数字放入数组中,然后尝试使用插入排序对数组进行排序。我需要帮助让程序读取文本文件。

我收到以下错误消息:

java.io.FileNotFoundException: 10_Random (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.util.Scanner.<init>(Unknown Source)
at insertionSort.main(insertionSort.java:14)

我的“src”、“bin”和主项目文件夹中有 .txt 文件的副本,但它仍然找不到该文件。顺便说一句,我正在使用 Eclipse。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class insertionSort {

public static void main(String[] args) {

    File file = new File("10_Random");

    try {

        Scanner sc = new Scanner(file);

        while (sc.hasNextLine()) {
            int i = sc.nextInt();
            System.out.println(i);
        }
        sc.close();
    } 
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
 }
}
java 文件-io java.util.scanner

评论

3赞 Roger Lindsjö 11/2/2012
尝试添加 System.err.println(file.getAbsolutePath());以准确查看您尝试读取的文件。
3赞 eckes 2/9/2015
您不会打开 .txt 文件。
0赞 Evan Erickson 12/14/2021
@RogerLindsjö 这对我帮助很大。我能够在 mac 上找到我的绝对路径。它是 /Users/myUsername/code/java/myRepoName。

答:

70赞 someone 11/2/2012 #1

你必须把文件扩展名放在这里

File file = new File("10_Random.txt");
0赞 Kyle Falconer 11/2/2012 #2

您读取的文件必须与您指定的文件名完全一致:不是“10_random.txt”而不是“10_random.blah”,它必须与您要求的文件名完全匹配。您可以更改任何一个以匹配,以便它们对齐,但要确保它们对齐。在您使用的任何操作系统中显示文件扩展名可能会有所帮助。"10_random"

此外,对于文件位置,它必须与编译结果的最终可执行文件(.class 文件)位于工作目录(同一级别)中。

2赞 Iskar Jarak 11/2/2012 #3
  1. 您需要指定确切的文件名,包括文件扩展名,例如 .10_Random.txt
  2. 如果要在没有任何显式路径的情况下引用该文件,则该文件需要与可执行文件位于同一目录中。
  3. 当我们使用它时,您需要在阅读 .检查 with 然后期望 with 是不安全的。你应该用它来检查是否真的有一个可以抓住的。当然,您选择强制执行每行一个整数规则的严格程度取决于您。intinthasNextLine()intnextInt()hasNextInt()int
7赞 mvmn 11/2/2012 #4
  1. 确保文件名正确(正确的大写、匹配的扩展名等 - 如前所述)。

  2. 使用 Class.getResource 方法在类路径中查找文件 - 不要依赖当前目录:

    URL url = insertionSort.class.getResource("10_Random");
    
    File file = new File(url.toURI());
    
  3. 通过命令行参数指定绝对文件路径:

    File file = new File(args[0]);
    

在 Eclipse 中:

  1. 选择“运行配置”
  2. 转到“参数”选项卡
  3. 将“c:/my/file/is/here/10_Random.txt.or.whatever”放入“程序参数”部分

评论

0赞 Iskar Jarak 11/2/2012
+1 表示建议正确处理路径的方法和执行此任务的更好方法 (args)。不过,您也可以提及处理失败以打开文件。try catch
34赞 Dhanushka Gayashan 9/23/2014 #5

使用以下代码读取文件

import java.io.File;
import java.util.Scanner;

public class ReadFile {

    public static void main(String[] args) {

        try {
            System.out.print("Enter the file name with extension : ");

            Scanner input = new Scanner(System.in);

            File file = new File(input.nextLine());

            input = new Scanner(file);


            while (input.hasNextLine()) {
                String line = input.nextLine();
                System.out.println(line);
            }
            input.close();

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

}

->此应用程序正在逐行打印文件内容

评论

4赞 VeraKozya 2/4/2019
为什么要创建一个扫描仪并将其设置为从 System.in 读取,然后才将其更改为从文件中读取?
4赞 Anthony 11/5/2019
他正在从控制台中读取一行,以获取用户要从中读取的文件的名称。他只是为两个扫描仪重复使用相同的别名来简化代码。
3赞 Vrezh Gulyan 10/15/2014 #6

似乎没有人解决您根本没有在数组中输入任何内容的事实。您将读取的每个 int 设置为“i”,然后输出它。

for (int i =0 ; sc.HasNextLine();i++)
{
    array[i] = sc.NextInt();
}

与此相关的内容将不断将数组的值设置为下一个整数读取。

比另一个 for 循环可以显示数组中的数字。

for (int x=0;x< array.length ; x++)
{
    System.out.println("array[x]");
}
1赞 Avijit 5/26/2015 #7

文件路径:这里似乎是一个问题,请确保该文件存在于正确的目录中,或者提供绝对路径以确保您指向正确的文件。 请记录 file.getAbsolutePath() 以验证文件是否正确。

12赞 pankaj 1/11/2017 #8

以下是一些有效且经过测试的方法;

using Scanner

package io;

import java.io.File;
import java.util.Scanner;

public class ReadFromFileUsingScanner {
    public static void main(String[] args) throws Exception {
        File file=new File("C:\\Users\\pankaj\\Desktop\\test.java");
        Scanner sc=new Scanner(file);
        while(sc.hasNextLine()){
            System.out.println(sc.nextLine());
        }
    }
}


这是使用 Scanner 类读取整个文件(无循环)的另一种方法

package io;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadingEntireFileWithoutLoop {
    public static void main(String[] args) throws FileNotFoundException {
        File file=new File("C:\\Users\\pankaj\\Desktop\\test.java");
        Scanner sc=new Scanner(file);
        sc.useDelimiter("\\Z");
        System.out.println(sc.next());
    }
}

BufferedReader

 package io;
import java.io.*;
public class ReadFromFile2 {
    public static void main(String[] args)throws Exception {
        File file=new File("C:\\Users\\pankaj\\Desktop\\test.java");
        BufferedReader br=new BufferedReader(new FileReader(file));
        String st;
        while((st=br.readLine())!=null){
            System.out.println(st);
        }
    }
}

using FileReader

package io;
import java.io.*;
public class ReadingFromFile {
    public static void main(String[] args) throws Exception {
        FileReader fr=new FileReader("C:\\Users\\pankaj\\Desktop\\test.java");
        int i;
        while((i=fr.read())!=-1){
            System.out.print((char) i);
        }
    }
}
0赞 Amir Maleki 6/5/2017 #9

首先检查文件地址,它必须位于文件旁边或您在环境变量中定义的任何地址中。当您检查此内容时,请尝试以下操作。.javaclasspath

  1. 您必须在 File 对象构造函数中使用文件扩展名的文件名,例如:

    File myFile = new File("test.txt");

  2. 但是有一种更好的方法可以在 Scanner 对象中使用它,方法是传递文件名绝对地址,例如:

    Scanner sc = new Scanner(Paths.get("test.txt"));

这样,您也必须导入。java.nio.file.Paths

2赞 Thomas Wouters 6/19/2017 #10

私有空 loadData() {

    Scanner scanner = null;
    try {
        scanner = new Scanner(new File(getFileName()));
        while (scanner.hasNextLine()) {
            Scanner lijnScanner = new Scanner(scanner.nextLine());

            lijnScanner.useDelimiter(";");
            String stadVan = lijnScanner.next();
            String stadNaar = lijnScanner.next();
            double km = Double.parseDouble(lijnScanner.next());

            this.voegToe(new TweeSteden(stadVan, stadNaar), km);

        }
    } catch (FileNotFoundException e) {
        throw new DbException(e.getMessage(), e);
    } finally {
        if(scanner != null){
            scanner.close();
        }
    }
}
1赞 Rajesh Guptan 10/14/2017 #11

您应该使用其中任何一个

File file = new File("bin/10_Random.txt");

File file = new File("src/10_Random.txt");

相对于 Eclipse 中的项目文件夹。