用Java读取文件的好方法

时间:2013-03-13 03:53:30

标签: java string file-io merge

如果有人可以帮助我,我真的很感激。我正在尝试进行外部排序,但我仍然坚持合并。我得到如何合并它只是不确定使用什么功能。

现在我正在尝试读取多个小文本文件的第一个单词,并将它们存储在文件数量大小的字符串数组中。所以基本上我会有一个每个文件的第一个单词的字符串数组。然后我按字母顺序确定哪一个是最小的并将其写入新文件,之后我将读取该最小单词的文件的下一个单词。该单词将被放置在以字符串数组输出的最小单词的位置,并将其与来自另一个文件的第一个单词的其余部分进行比较。这将继续重复,直到所有单词都被排序。

我遇到的主要问题是我使用扫描仪并且在第一次比较之后无法将最小的单词切换到文件中的下一个单词,因为扫描仪没有记录它的含义读。我知道readline可以,但由于我的文件都是仅用空格分隔的单词,所以我不能使用readline。有人可以指导我一个足够的阅读功能,无法帮助我解决这个问题。

  for (int i = 0; i<B;i++)
  {
  try
  {
    BufferedReader ins = new BufferedReader(new FileReader(Run-"+ i + ".txt"));
    Scanner scanner2 = new Scanner(ins);
    temp3[i] = scanner2.next();

                System.out.println(temp3[i]);
            }
            catch(IOException e)
            {   
            }
        }
        for(int i=0;i<N;i++)
        {
            String smallest = temp3[0];
            int smallestfile = 0;
            for(j=0;j<B;j++)
            {
                int comparisonResult = smallest.compareTo(temp3[j]);
                if(comparisonResult>0)
                {
                smallest = temp3[j];
                smallestfile = j;
                }
            }
            BufferedReader ins = new BufferedReader(new FileReader("C:/Run-"+ smallestfile + ".txt"));
            Scanner scanner2 = new Scanner(ins);
            if(scanner2.hasNext())
            {
                temp3[smallestfile]=scanner2.next();
            }
        }
}
catch(Exception e)
{
}

3 个答案:

答案 0 :(得分:1)

如果文件足够小,请将整个文件读取到内存中,然后使用String.split()分隔数组中的字符串,并发挥你的魔力。

如果文件较大,请保持打开并读取每个字节,直到找到和空格,然后对所有文件执行,比较字符串,做你的魔法并重复,直到所有文件都到达结尾。

编辑:

  • 如何使用BufferedReader
  • 阅读文件
  • 如何使用String.split()
  • 拆分行

String line = readeOneLineFromTheCurrentFile(); String [] words = line.split(“”);

答案 1 :(得分:0)

对于临时排序/存储单词,请使用PriorityQueue(不是数组)。对不起,我太忙于看棒球了,还有更多。

答案 2 :(得分:0)

我不确定,如果我理解你的话,但是Scanner确实将该位置保留在文件中。你需要和文件一样多的

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class so {
    // returns the index of the smallest word
    // returns -1 if there are no more words
    private static int smallest(String[] words) {
        int min = -1;
        for (int i = 0; i < words.length; ++i)
            if (words[i] != null) {
                if (min == -1 || words[i].compareTo(words[min]) < 0)
                    min = i;
            }

        return min;
    }

    public static void main(String[] args) throws FileNotFoundException {
        // open all files
        Scanner[] files = new Scanner[args.length];
        for (int i = 0; i < args.length; ++i) {
            File f = new File(args[i]);
            files[i] = new Scanner(f);
        }

        // initialize first words
        String[] first = new String[args.length];
        for (int i = 0; i < args.length; ++i)
            first[i] = files[i].next();

        // compare words and read following words from scanners
        int min = smallest(first);
        while (min >= 0) {
            System.out.println(first[min]);
            if (files[min].hasNext()) {
                first[min] = files[min].next();
            } else {
                first[min] = null;
                files[min].close();
                files[min] = null;
            }

            min = smallest(first);
        }
    }
}

使用

进行测试

a.txt:a d g j
b.txt:b e h k m
c.txt:c f i

<强>更新

在您的示例中,您打开并关闭外部for循环内的文件。当您下次重新打开文件时,它当然会从文件的开头开始。

为了防止这种情况,您必须保持文件打开并将scanner2变量及其初始化移到外部for循环前面。您还需要多个Scanner变量,即一个数组,以保持多个文件同时打开。