0
    File tempFile = new File(loadedFileName);
    FileInputStream datStream = new FileInputStream(tempFile);
    InputStreamReader readDat = new InputStreamReader(datStream);
    int data = readDat.read();
    String temp = "";

    // keeps reading in one character at a time and returns -1 if there are no more          
    //  characters
    while(data != -1){  
        char datChar = (char)data;
        if(temp.length() > 2){
            if((temp.substring(temp.length()-1)).equals("\n")){
                String[] arrayTemp = temp.split("\\|");

                if(Float.valueOf(arrayTemp[columnNumber-1]) > value){
                    System.out.print(temp); 
                }
                temp = "";
            }
        }
        temp = temp+datChar;
        data = readDat.read();
    }

该代码逐个字符地读取文件并将其附加到字符串中。一旦到达新行,它将字符串拆分为一个数组,然后检查该数组中的值是否匹配并在拆分之前打印出字符串。

这段代码的问题在于,即使它完成了大部分工作,因为它是如何在一个 while 循环中检查它是否到达末尾的,如果它到达了它会返回 -1。这使得我无法打印文件的最后一行,因为文件末尾没有新行,所以它在打印出最后一行之前终止了循环。

读入几行的示例。

这个| 世界| 是| 棕色 | 和 | 脏|
24 | 小时 | 是| 在| 天| 你好|

无法将整个文件存储到数组中,无法使用缓冲阅读器,我尝试过计算“|”的数量 但我似乎无法让它发挥作用。所以在这种情况下,如果它计数到 6 个管道,它就会分裂,然后在打印前检查。我认为这可以解决不打印最后一行的问题。这是我尝试实现 | 计数的方法。

    while(data != -1){  
        char datChar = (char)data;
        // checks to make sure that temp isn't an empty string first
        if(temp.length() > 2){
            // checks to see if a new line started and if it did splits  the current string into an array.
            if((temp.substring(temp.length()-1)).equals("\\|")){
                if(count == 6){

                String[] arrayTemp = temp.split("\\|");

                //then checks the variable in the array col and compares it with a value and prints if it is greater.
                if(Float.valueOf(arrayTemp[columnNumber-1]) > value){
                    System.out.print(temp); 
                }
                temp = "";
                count = 0;
                }
            }
        }
        temp = temp+datChar;
        data = readDat.read();
    }
4

3 回答 3

2

你最好使用BufferedReaderand readLine。这在 IO 方面会更有效,并且意味着您不必担心自己处理换行符:

BufferedReader reader = new BufferedReader(readDat);
String line;
while ((line = reader.readLine()) != null) {
    // Handle a line of data - check for it being empty, split it etc.
}

这将为您提供文件中的所有行,无论是否有终止换行符。

编辑:如果你真的不能使用BufferedReader,我会通过检查当前字符是\n文件还是文件结尾来使你的代码更加简单,如果是,则处理“到目前为止的行”:

StringBuilder line = new StringBuilder();
while (true) {
    int next = readDat.read();
    if (next == '\n' || next == -1) {
        // Handle line here

        line = new StringBuilder();
        if (next == -1) {
            break;
        }
    } else {
        line.append((char) next);
    }
}

注意使用StringBuilder代替重复连接。

于 2013-09-17T08:42:01.867 回答
0

除了检查换行符之外,也许您可​​以尝试计算文件中的行数并检查它。

此外,您可以重写代码以读取整行并将其拆分,而不是逐字符读取文件。如果你这样做,你不必检查换行符(而且我认为你甚至不必检查当前读取的行是否不是文件的最后一行。我不确定它是否更快(但是我打赌它是),但它肯定会导致更好的可读性(因此,更好的可维护性)代码。

于 2013-09-17T08:42:20.450 回答
0

我可能误解了你的问题,但在我看来,Scanner在这种情况下,使用基本的基于行的扫描会容易得多。以下内容会为您简化事情吗?

Scanner input = new Scanner(new File("FileName.txt"));
while (input.hasNextLine()) {
    String[] arrayTemp = input.nextLine().split("\\|");
    //etc etc.
}
于 2013-09-17T08:47:45.673 回答