简体   繁体   English

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

[英]Reading a .txt file using Scanner class in Java

I am working on a Java program that reads a text file line-by-line, each with a number, takes each number throws it into an array, then tries and use insertion sort to sort the array.我正在开发一个 Java 程序,它逐行读取文本文件,每个文件都有一个数字,将每个数字放入一个数组中,然后尝试使用插入排序对数组进行排序。 I need help with getting the program to read the text file.我需要帮助让程序读取文本文件。

I am getting the following error messages:我收到以下错误消息:

 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)

I have a copy of the .txt file in my "src" "bin" and main project folder but it still cannot find the file.我的“src”“bin”和主项目文件夹中有 .txt 文件的副本,但它仍然找不到该文件。 I am using Eclipse by the way.顺便说一下,我正在使用 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();
    }
 }
}

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

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

Use following codes to read the file使用以下代码读取文件

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

}

-> This application is printing the file content line by line -> 此应用程序正在逐行打印文件内容

here are some working and tested methods;这里有一些工作和测试方法;

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


Here's another way to read entire file (without loop) using Scanner class这是使用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());
    }
}

using BufferedReader使用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);
        }
    }
}
  1. Make sure the filename is correct (proper capitalisation, matching extension etc - as already suggested).确保文件名正确(正确的大小写、匹配的扩展名等 - 正如已经建议的那样)。

  2. Use the Class.getResource method to locate your file in the classpath - don't rely on the current directory:使用Class.getResource方法在类路径中定位您的文件 - 不要依赖当前目录:

     URL url = insertionSort.class.getResource("10_Random"); File file = new File(url.toURI());
  3. Specify the absolute file path via command-line arguments:通过命令行参数指定绝对文件路径:

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

In Eclipse:在日食中:

  1. Choose "Run configurations"选择“运行配置”
  2. Go to the "Arguments" tab转到“参数”选项卡
  3. Put your "c:/my/file/is/here/10_Random.txt.or.whatever" into the "Program arguments" section将您的“c:/my/file/is/here/10_Random.txt.or.whatever”放入“程序参数”部分
  1. You need the specify the exact filename, including the file extension, eg 10_Random.txt .您需要指定确切的文件名,包括文件扩展名,例如10_Random.txt
  2. The file needs to be in the same directory as the executable if you want to refer to it without any kind of explicit path.如果您想在没有任何显式路径的情况下引用该文件,则该文件需要与可执行文件位于同一目录中。
  3. While we're at it, you need to check for an int before reading an int .当我们这样做时,您需要在读取int之前检查int It is not safe to check with hasNextLine() and then expect an int with nextInt() .使用hasNextLine()检查然后期望intnextInt()是不安全的。 You should use hasNextInt() to check that there actually is an int to grab.您应该使用hasNextInt()来检查是否确实有要抓取的int How strictly you choose to enforce the one integer per line rule is up to you, of course.当然,您选择强制执行每行一个整数规则的严格程度取决于您。

No one seems to have addressed the fact that your not entering anything into an array at all.似乎没有人解决您根本没有在数组中输入任何内容的事实。 You are setting each int that is read to "i" and then outputting it.您正在将读取的每个 int 设置为“i”,然后将其输出。

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

Something to this effect will keep setting values of the array to the next integer read.这种效果会将数组的值设置为下一个整数读取。

Than another for loop can display the numbers in the array.比另一个 for 循环可以显示数组中的数字。

for (int x=0;x< array.length ; x++)
{
    System.out.println("array[x]");
}

File Path Seems to be an issue here please make sure that file exists in the correct directory or give the absolute path to make sure that you are pointing to a correct file.文件路径似乎是这里的一个问题,请确保文件存在于正确的目录中或提供绝对路径以确保您指向正确的文件。 Please log the file.getAbsolutePath() to verify that file is correct.请记录 file.getAbsolutePath() 以验证该文件是否正确。

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

You should use either你应该使用

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

Or要么

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

Relative to the project folder in Eclipse.相对于 Eclipse 中的项目文件夹。

The file you read in must have exactly the file name you specify: "10_random" not "10_random.txt" not "10_random.blah", it must exactly match what you are asking for.您读入的文件必须与您指定的文件名完全相同: "10_random"而不是“10_random.txt”而不是“10_random.blah”,它必须完全符合您的要求。 You can change either one to match so that they line up, but just be sure they do.您可以更改任何一个以匹配,以便它们对齐,但请确保它们对齐。 It may help to show the file extensions in whatever OS you're using.在您使用的任何操作系统中显示文件扩展名可能会有所帮助。

Also, for file location, it must be located in the working directory (same level) as the final executable (the .class file) that is the result of compilation.此外,对于文件位置,它必须位于作为编译结果的最终可执行文件(.class 文件)的工作目录(同一级别)中。

At first check the file address, it must be beside your .java file or in any address that you define in classpath environment variable.首先检查文件地址,它必须在您的.java文件旁边或您在classpath环境变量中定义的任何地址中。 When you check this then try below.当你检查这个然后尝试下面。

  1. you must use a file name by it's extension in File object constructor, as an example:您必须在 File 对象构造函数中通过其扩展名使用文件名,例如:

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

  2. but there is a better way to use it inside Scanner object by pass the filename absolute address, as an example:但是有一种更好的方法可以通过传递文件名绝对地址在 Scanner 对象中使用它,例如:

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

in this way you must import java.nio.file.Paths as well.通过这种方式,您还必须导入java.nio.file.Paths

顺便说一句,值得设置字符编码:

Scanner scanner = new Scanner(new File("C:\\tmp\\edit1.txt"), "UTF-16");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM