从两个文件中读取然后将它们组合并写入第三个java

时间:2012-04-07 19:03:54

标签: java file-io printwriter file-read alphabetical-sort

我必须编写一个程序,该程序从两个文件中读取,每个文件都有一个名称和ID列表,这些名称和ID都已根据姓氏按字母顺序排列。然后程序假设创建第三个文件,用户名包含两个程序中所有名称和ID的完整列表,并按字母顺序排列。文件的格式是这样的 -

姓氏,名字
ID(ex.rbb091020)
姓氏,名字
ID

我的程序读取这两个文件,并创建第三个文件,但由于某种原因,它不会向第三个文件写入任何内容,并且文件保留为空白。我该怎么做才能解决这个问题?

这是我的代码......

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

public class Combine_Files
{
public static void main(String[]args) throws IOException
{
    String filename1 = "";
    String filename2 = "";
    String combinedFileName = "";
    String response = "";
    String nextName1 = "";
    String nextName2 = "";
    String nextIDNumber1 = "";
    String nextIDNumber2 = "";
    boolean okToOverwrite = false;
    Scanner keyboard = new Scanner(System.in);

    System.out.println("What is the name of the first file?");
    filename1 = keyboard.nextLine();

    File file1 = new File(filename1);

    if (!file1.exists())
    {
        System.out.println(file1 + " does not exist.\nTerminating Program.");
        System.exit(0);
    }

    System.out.println("What is the name of the second file?");
    filename2 = keyboard.nextLine();

    File file2 = new File (filename2);
    if (!file2.exists())
    {
        System.out.println(file2 + " does not exist.\nTerminating Program.");
        System.exit(0);
    }   

    System.out.println("What is the name of the file that you wish to create?");
    combinedFileName = keyboard.nextLine();
    File combinedFile = new File (combinedFileName);

    while (combinedFile.exists() && !okToOverwrite)
    {
        System.out.println("\nError, a file named " +
            combinedFileName + " already exists." +
            "\nWould you like to overwrite this file?" +  
            "\nEnter Y for Yes or N for No.");
        response = keyboard.nextLine();

        // Add input validation on response

        if (response.equalsIgnoreCase("Y"))
        {
            okToOverwrite = true;
        }
        else 
        {
            System.out.println("Enter a new filename.");
            combinedFileName = keyboard.nextLine();
            combinedFile = new File(combinedFileName);
        }
    }

    if (file1.exists() && file2.exists())
    {

        Scanner list1 = new Scanner(file1);
        Scanner list2 = new Scanner(file2);
        PrintWriter outputFile = new PrintWriter(combinedFile);

            while (list1.hasNext() && list2.hasNext())
            {
                nextName1 = list1.nextLine();
                nextName2 = list2.nextLine();

                if(nextName1.compareToIgnoreCase(nextName2) <0)
                {
                    outputFile.print(nextName1);
                    nextName1 = list1.nextLine();
                    outputFile.print(nextName1);
                }
                else if(nextName1.compareToIgnoreCase(nextName2) >0)
                {
                    outputFile.println(nextName2);
                    nextName2 = list2.nextLine();
                    outputFile.println(nextName2);
                }
                else
                {
                    outputFile.println(nextName1);
                    nextName1 = list1.nextLine();
                    outputFile.println(nextName1);
                    outputFile.println(nextName2);
                    nextName2 = list2.nextLine();
                    outputFile.println(nextName2);
                }       
            }

            while (list1.hasNext() && !list2.hasNext())
            {
                outputFile.println(nextName1);
            }

            while (list2.hasNext() && !list1.hasNext())
            {
                outputFile.println(nextName2);
            }
    outputFile.close();             
    }
}   
}   

1 个答案:

答案 0 :(得分:1)

我发现了两个错误:主要的一个是在另一个输入文件耗尽之后在一个输入文件中输出行的底部循环不会使他们正在读取的文件前进。所以如果它们完全执行,那些循环就会没有结束。

第二个错误是在第一个名字比较后使用“print()”而不是“println()”;这会输出没有行尾的行,可能不是你想要的。

之后我得到了输出,但我没有检查其他错误。

如果我建议:如果你使用了一些执行常用功能的方法,你可以使你的程序更简单。例如:一个方法可以将已读取的输入,一个输入扫描器和输出文件作为参数,并写出当前名称。像

这样的东西
private void writeName(String currentLine, Scanner inFile, File outFile)
{
  outFile.println(currentLine);
  String nextLine = inFile.nextLine();
  outFile.println(nextLine);
}

发现这些的方法是要注意何时你似乎不止一次地做同样的编码步骤。在这种情况下,您分别对两个输入文件执行上述步骤,因此您可以使用此方法(以及其他类似的方法)消除代码的“复制和粘贴”性质。