java以字符流的形式清洗超大文本

我用 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:\ccc.txt")),"UTF-8"));
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream),5*1024*1024);方式清洗大约2G的文本,也是会包内存不足图片说明
上面是清洗之前的
下面是清洗之后的图片说明
问了其他人,说字符流可以实现,要怎么实现,麻烦详细些,谢谢

楼主试试

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class QingXi {
    public static void main(String[]args) throws FileNotFoundException, IOException{

        String pathRead = "D:/test_input.txt";
        String pathWrite = "D:/test_output.txt";

        FileReader fr = new FileReader(pathRead);
        FileWriter fw = new FileWriter(pathWrite);

        BufferedReader br = new BufferedReader(fr);
        BufferedWriter wr = new BufferedWriter(fw);

        String line = br.readLine();
        while(line != null){
            String str = line.replaceAll("---", ",");
            wr.append(str);
            wr.append("\n");

            line = br.readLine();
        }
        wr.flush();

        wr.close();
        br.close();
        fw.close();
        fr.close();
    }
}

把文件拆成多个小文件,清洗完再合并,你这个用mr或者spark是最简单的

应该跟这个流关系不大,可能是你代码其他地方导致的。buffered会使用缓存,5*1024*1024这个值可以改小点,这个流可以很方便的去取一行,你使用其他流
就没这个方便了,需要直接取判断换行字符。

字符流方式实现,按行读取
https://www.cnblogs.com/xwlych/p/5987022.html

首先你不能一次性就把一个大文件放到文件流 这一下就会有可能内存溢出
第二,你其实可以不readline 可以readbyte 保证一次读取出来的数据是受限制的 readbyte也可以保证文字的准确性
最后就是明明可以用一个流 你却用了嵌套流