将数据从文件读入数组然后将数据输出到另一个文件中

时间:2014-01-28 16:43:50

标签: java arrays file printwriter

需要一些帮助来解决这个问题。 我想将data.txt中的数据输入到bsorted.txt中,并使用bubbleSort进行排序。

我需要在数据文件中生成随机数字和字母,然后将它们读入数组,并在排序到另一个文本文件后输出这些数据。

我收到了NoSuchElementException

Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Unknown Source) at SortingExample.main(SortingExample.java:257)

代码:

class dataFile {

public static void dataFile() {
    try {
        PrintWriter writer = new PrintWriter("data.txt");
        String alphaNumerics = "qwertyuiopasdfghjklzxcvbnm1234567890";
        String t = "";
    for (int i = 0; i < 2000; i++) {
        t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
    }
        writer.println(t);
        writer.close();
    }
    catch(Exception ex) {
        System.out.println("Error accessing file.");
        System.out.println("Reason was: "+ex.getMessage());
        ex.printStackTrace();
    }
  }
}

class SortingExample {

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

    Scanner bscan = new Scanner(new File("data.txt"));
    PrintWriter bsorted = new PrintWriter("bsorted.txt");
    StringType[] strings = new StringType[2000];
    for (int i = 0; i < strings.length; i++){
        strings[i] = new StringType(bscan.nextLine());
    }

    Sort.bubbleSort(strings);
    bsorted.println("Bubble Sort number of comparisons: " + Sort.bubbleComp + "\r\n" + "Bubble Sort number of exchanges: " + Sort.bubbleEx + "\r\n");
    for (int i = 0; i < strings.length; i++) {
        bsorted.println(strings[i].toString());
    }
    bsorted.close();
   }
}

任何人都有一些想法可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

在继续通过扫描仪阅读下一行之前,您需要检查Scanner.hasNextLine()是否为真。这有助于您确定是否安全地到达了文件结束标记。

因此,您的for loop将是:

for (int i = 0; i < strings.length; i++) {
    if (bscan.hasNextLine())
        strings[i] = new StringType(bscan.nextLine());
}

或者,在您的尝试中处理它并捕获NoSuchElementException

try {
    for (int i = 0; i < strings.length; i++) {
        strings[i] = new StringType(bscan.nextLine());
    }
} catch (NoSuchElementException ex) {
    // Do Nothing
}

答案 1 :(得分:0)

在我看来,循环比你文件中的行更多次。

你的data.txt文件中可能只有不到2000行,但for循环仍然试图绕过2000次,每次都从该文件中读取另一行。

我建议你弄清楚data.txt中有多少行,并多次绕过for-loop。

尝试使用此代码确定行数:

LineNumberReader lnr = new LineNumberReader(new FileReader(new File("data.txt")));

lnr.skip(Long.MAX_VALUE);

然后你所要做的就是绕过lnr.getLineNumber()次循环。

答案 2 :(得分:0)

根据您的代码:

for (int i = 0; i < 2000; i++) {
    t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
}
    writer.println(t);
    writer.close();

看起来您将所有内容追加到一个字符串中,并将其作为一个大行写出来。换句话说,你有2000个元素连接成一个字符串。

你的扫描仪正在寻找2000行,所以当它只看到一行时就会失败。

我的建议是写出如下几行:

for (int i = 0; i < 2000; i++) {
    t = alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
    writer.println(t);
}

writer.close();

偏离主题,但有许多约定让我从OO角度暂停,例如小写类名(dataFile),非动词类的方法名(dataFile)