在Java中从命令行中的文件中获取输入

时间:2018-01-29 23:00:48

标签: java file parsing command-line command

我无法通过命令行解析文件作为输入,以解决以下问题。

考虑两个关于学生的文件,分别包含他们的姓名和密码,姓名和电子邮件地址。人们可能希望将这些组合起来以获得单个文件(按字母顺序),包括姓名,电子邮件和密码。

输入将通过STDIN进入,并具有以下格式:

NUMBER OF RECORDS 
NAME1 FIELD1 
NAME2 FIELD1 
... 
NAMEN FIELD1 
NAME1 FIELD2 
NAME2 FIELD2 
... 
NAMEN FIELD2 

您的输出应采用以下形式:

NAME1' FIELD1 FIELD2 
NAME2' FIELD1 FIELD2 
... 
NAMEN' FIELD1 FIELD2 

输出被排序的位置(因此是')。 因此,例如,给出以下输入:

3 
a 1 
c 2 
b 3 
b 4 
c 5 
a 6 

您的程序应提供以下输出:

a 1 6 
b 3 4 
c 2 5

我的代码如下:

import java.util.*;
import java.io.*;
public class Combiner 
{
     public static void main(String[] args) throws IOException
        {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        Scanner scanner = new Scanner(System.in);
        //first line number of students
        int numOfStudents = scanner.nextInt();
        scanner.nextLine();
//      ins1 is the array of inputs of name and UN
        String[] ins1 = new String[numOfStudents];
        //ins2 is the array of inputs of name and Password
        String[] ins2 = new String[numOfStudents];
        //collect all inputs of Student Name, UN
        for (int i = 0; i < numOfStudents; i++)
        {
            ins1[i] = stdin.readLine();
        }
        //collect all inputs of Student Name, Password
        for (int i = 0; i<numOfStudents; i++)
        {
             ins2[i] = stdin.readLine();
        }
        //sort both arrays
        Arrays.sort(ins1);
        Arrays.sort(ins2);

         for(int i =0; i<numOfStudents; i++)
        {
            //gets the last word from each element of ins2
            String toAdd = getLast(ins2[i]);
            //concats that to each element of ins 1
            ins1[i]= ins1[i] + " " + toAdd;
        }
        //print the result
        for(int i =0; i<numOfStudents; i++)
        {
            System.out.println(ins1[i]);
        }  
    }
      public static String getLast(String x)
    {
        //splits x into an array of words seperated by a space
        String[] split = x.split(" ");
        //gets the last element in that array
        String lastWord = split[split.length - 1];
        return lastWord;
    }
}

从命令行输入时,我得到了所需的输出。但是当我使用对C:\ Users \ Stephen \ Documents \ 3这样的文件的引用时,这只是一个包含

的文件
3 
a 1 
c 2
b 3
b 4 
c 5 
a 6 

抛出异常

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.ThrowFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at Combiner.main(Combiner.java.10)

第10行是

int numOfStudents = scanner.nextInt();

我不知道它有什么问题,当通过我的IDE或命令行的控制台单独添加每一行时,它会起作用

1 个答案:

答案 0 :(得分:0)

您能否分享一下显示您尝试提供文件名的代码?据我所知,代码的第一部分是:

  

scanner.nextInt();

哪个不会从文件中读取,它正在等待用户输入。另外,我没有看到你在哪里或如何从文件中读书,也许我错过了它?

好的,所以下面第1行正在创建InputStream,然后使用FileInputStream从指定的文件中读取。

第2行正在使用BufferedReaderInputStreamReader将{1}}从第1行分配给变量InputStream

第3行就是这样你有一个空字符串用于在读取每行时保存它们。

第4-6行包含一个stdin循环,它使用while从文件中读取每一行。读取每一行时,会将其分配给stdin.readLine()变量,如果内容不是line,则会进入null循环并尝试输出该行。在while循环内部,您可以在文件中的每一行上执行其他处理。我希望这会有所帮助,我会稍微回顾一下!

while

好的,您希望用户提供文件名吗?尝试在上面提供的代码上面添加这个。然后替换FileInputStream中的路径以使用变量InputStream is = new FileInputStream("C:\\Users\\Stephen\\Documents\\3"); BufferedReader stdin = new BufferedReader(new InputStreamReader(is)); String line = ""; while((line = stdin.readLine()) != null) { System.out.println(line); }

fileName