如何处理与Java中不同的行分隔符的文件?(How to handle file with diff

2019-10-21 07:28发布

我有一个包含在以下格式的长行一个巨大的文件(超过3GB以上)。 “1243 @ 818 @ 9287 @ 543”

然后,我要分析的数据是相分离的“@”。 我的想法是改变被Java ANS组用于行字符的默认结束“@”。

我使用“System.setProperty下面的代码尝试(” line.separator“‘@’);” 但不工作,因为打印完整产品线,并为这个测试,我想作为输出。

1243
818
9287
543

如何更改默认的行分隔符为“@”?

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        System.setProperty("line.separator", "@");

        File testFile = new File("./Mypath/myfile");
        BufferedReader br = new BufferedReader(new FileReader(testFile));
        for(String line; (line = br.readLine()) != null; ) {
        // Process each the line.
            System.out.println(line); 
        }
    }

}

在此先感谢您的帮助。

Answer 1:

然后,我要分析的数据是相分离的“@”。 我的想法是改变被Java ANS组用于行字符的默认结束“@”。

我不会那么做,因为它可能会破坏上帝知道还有什么是取决于line.separator。

至于为什么这不工作,我很抱歉地说,这是RTFM未完成的情况。 这是什么的Javadoc BufferedReader.readLine不得不说:

public String readLine()
                throws IOException
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
Throws: IOException - If an I/O error occurs

对于API文档readLine()方法明确地说,它看起来对'\n''\r' 。 这并不是说这取决于line.separator

line.separator属性仅用于开发需要一个可移植的,独立于平台的机制识别行分隔符的API。 就这些。 此系统属性用于控制Java的IO类的内部机制。

我觉得你是过于复杂的事情。 只要做到这一点通过读取字符(1024KB说)上的缓冲的正数旧的方式方法,并扫描每个“@”分隔符。 这引入了并发症,如正常情况下,与“@”分隔符的数据缓冲区得到之间的分裂。

所以,我建议只读取一个字符关闭缓冲读者(这不是坏的,通常不打IO过度,因为缓冲读者呢......田田......缓冲你。)

每个字符泵的字符串生成器,每次你找到一个“@”分隔符,你刷新字符串生成器,标准输出或任何内容(因为这将是一个基准掉你的“@”文件。)

获取算法正确工作第一。 后来优化。 这是下面的伪代码,不保证没有编译错误。 你应该能够平凡充实它在语法上是正确的Java:

File testFile = new File("./Mypath/myfile");
int buffer_size = 1024 * 1024
BufferedReader br = new BufferedReader(new FileReader(testFile), buffer_size);

StringBuilder bld = StringBuilder();
int c = br.read();

while(c != -1){
    char z = (char)c;
    if(z == '@'){
        System.out.println(bld);
        if(bld.length() > 0){
            bld.delete(0, bld.length() - 1);
        }
    } else {
        bld.append(z);
    }
}


Answer 2:

read() charcharappend()它到一个StringBuilder ,直到你得到@



Answer 3:

一个possbile办法做到这一点( 与更小的文件 )是的使用Scanner类:

public static void main(String[] args) throws FileNotFoundException {
    final File file = new File("test.txt");
    try (final Scanner scan = new Scanner(file)) {
        scan.useDelimiter("@");
        while(scan.hasNext()) {
            System.out.println(scan.next());
        }
    }
}

的test.txt:

1243@818@9287@543

输出:

1243
818
9287
543

但是,由于您的文件非常大 ,你应该避免使用Scanner ,使用具有Jigars解决方案BufferedReader代替。 但是,如果你有机会使用更小的文件,那么这可能会派上用场。



Answer 4:

我不知道这是否是你想要的,但你可以在阅读作为String整行,然后使用方法String.split(String regex)它会返回一个字符串数组。 这些字符串将是@之间的数字。 然后,您可以通过遍历数组并打印出每个号码上线,或分析,但是你想要的数据。

例如:

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        System.setProperty("line.separator", "@");

        File testFile = new File("./Mypath/myfile");
        Scanner fileScanner = new Scanner(testFile);
        String myString = fileScanner.nextLine();
        String[] data = myString.split("@");

        // Process data
    }
}

如果你需要将数字转换为整数,使用Integer.parseInt(String)

希望我帮助!



文章来源: How to handle file with different line separator in java?