简体   繁体   English

从 linux 终端上的用户输入读取文件名 - JAVA

[英]Read file name from user input on linux terminal - JAVA

I want to make a little script in JAVA to receive a file name in the linux terminal and read that file.我想在 JAVA 中制作一个小脚本来在 linux 终端中接收文件名并读取该文件。

This is what i'm trying:这就是我正在尝试的:

import java.util.Scanner;
import java.io.*;

class ItauScript {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Filename: ");
        String fileName = reader.next();

        FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        System.out.println(bufferedReader.readLine());
    }
}

But the code doesn't compile.但是代码不能编译。 I get this error message:我收到此错误消息:

hello.java:10: error: unreported exception FileNotFoundException; hello.java:10: 错误:未报告的异常 FileNotFoundException; must be caught or declared to be thrown FileReader fileReader = new FileReader(fileName);必须被捕获或声明为抛出 FileReader fileReader = new FileReader(fileName); ^ hello.java:13: error: unreported exception IOException; ^ hello.java:13: 错误:未报告的异常 IOException; must be caught or declared to be thrown System.out.println(bufferedReader.readLine());必须被捕获或声明被抛出 System.out.println(bufferedReader.readLine());

I can open the file if i put it on hardcode on a string.如果我把它放在一个字符串的硬编码上,我可以打开文件。 But i need to receive it as an input from the terminal.但我需要从终端接收它作为输入。

What am i missing?我错过了什么?

FileNotFoundException is a checked Exception (as is the parent class IOException thrown by readLine ), modify main to re-throw 1 it like FileNotFoundException是一个已检查的Exception (与readLine抛出的父类IOException ),修改main以重新抛出1就像

public static void main(String[] args) throws IOException {

or surround it with a try-catch (with resources) like或者try-catch (带资源)包围它

try (FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader)) {
    System.out.println(bufferedReader.readLine());
} catch (IOException e) {
    e.printStackTrace();
}

1 But you should still close the bufferedReader in a finally . 1但是您仍然应该finally close bufferedReader

You need to handle the possible exception.您需要处理可能的异常。 You can specify that the enclosing method main throws the exception, but it would be better to handle it yourself.您可以指定封闭方法main抛出异常,但最好自己处理。

import java.util.Scanner;
import java.io.*;

class ItauScript {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        try
        {
            System.out.println("Filename: ");
            String fileName = reader.next();

            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            System.out.println(bufferedReader.readLine());
        }
        catch(IOException e)
        {
            e.printStackTrace();
            //TODO handle error
            return;
        }
    }
}

Try:尝试:

import java.util.Scanner;
import java.io.*;

class ItauScript {
public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);
    System.out.println("Filename: ");
    String fileName = reader.next();

    try {
       FileReader fileReader = new FileReader(fileName);
       BufferedReader bufferedReader = new BufferedReader(fileReader);

       System.out.println(bufferedReader.readLine());
    } catch (IOException e) {
        // handle exception (if any) here
    }
}
}

And as others suggested, it's very helpful to read what the IDE/Compiler tells you in case of errors ...正如其他人所建议的那样,阅读 IDE/编译器在出现错误时告诉您的内容非常有帮助......

Hope that helps希望有帮助

Every time you want to access a file you need to handle the IOException.每次要访问文件时,都需要处理 IOException。 There are many ways to do that.有很多方法可以做到这一点。 First one is to use a try-catch block .第一个是使用try-catch 块

import java.util.Scanner;
import java.io.*;

class ItauScript {
    public static void main(String[] args) {
        try {
            Scanner reader = new Scanner(System.in);
            System.out.println("Filename: ");
            String fileName = reader.next();
            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            System.out.println(bufferedReader.readLine());

            bufferedReader.close();
            fileReader.close();
            reader.close();
       }catch(IOException e){
            System.err.println("Exception");
            e.printStackTrace();
       }
    }
}

Second way is to use the keyword throws第二种方法是使用关键字throws

import java.util.Scanner;
import java.io.*;

class ItauScript {
    public static void main(String[] args) throws IOException {
        Scanner reader = new Scanner(System.in);
        System.out.println("Filename: ");
        String fileName = reader.next();
        FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        System.out.println(bufferedReader.readLine());

        bufferedReader.close();
        fileReader.close();
        reader.close();
    }
}

The drawback of throws is that you can't use the IOException as you want. throws 的缺点是您不能随意使用 IOException。 Also you may need to catch the IOException in the function that called the one that produces the exception.此外,您可能需要在调用产生异常的函数中捕获 IOException。 For instance:例如:

import java.util.Scanner;
import java.io.*;

class ItauScript {

    public static void test() throws IOException {
        Scanner reader = new Scanner(System.in);
        System.out.println("Filename: ");
        String fileName = reader.next();
        FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        System.out.println(bufferedReader.readLine());

        bufferedReader.close();
        fileReader.close();
        reader.close();
    }
    
    public static void main(String[] args) throws IOException {
        test();
    }
}

PS Please don't forget to use .close() to your streams. PS请不要忘记对您的流使用 .close() 。

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

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