文件导入导出

文件导出

当涉及到大文件导入和导出时,使用高效的代码非常重要,以避免出现内存溢出等问题。下面是两个高效的大文件导入导出的代码案例。

  1. 大文件导入

在导入大文件时,通常可以采用逐行读取数据的方式,以避免将整个文件读入内存而导致内存溢出。以下是一个使用BufferedReader逐行读取文件的例子:

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

public class LargeFileImport {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("largefile.csv"));
        String line;
        while ((line = reader.readLine()) != null) {
            // 处理每一行数据
            System.out.println(line);
        }
        reader.close();
    }
}

在上面的代码中,我们使用了BufferedReader类,它可以逐行读取文件。我们可以在while循环中,处理每一行读取到的数据。

  1. 大文件导出

在导出大文件时,通常可以采用分段写入文件的方式,以避免将整个数据集一次性写入文件而导致内存溢出。以下是一个使用BufferedWriter分段写入文件的例子:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class LargeFileExport {
    public static void main(String[] args) throws IOException {
        BufferedWriter writer = new BufferedWriter(new FileWriter("largefile.csv"));
        // 分批写入数据,每批10000条数据
        for (int i = 0; i < 1000000; i++) {
            String data = "data" + i + ", " + "data" + (i+1) + ", " + "data" + (i+2) + "\n";
            writer.write(data);
            if (i % 10000 == 0) {
                writer.flush(); // 每10000条数据,强制写入文件
            }
        }
        writer.close();
    }
}

在上面的代码中,我们使用了BufferedWriter类,它可以分段写入文件。我们可以将大数据集分批写入文件,每批写入10000条数据,写入后使用flush()方法强制将数据写入文件,以减少内存的使用。

防止乱码

固定格式编码

以下是一个简单的 Java 代码示例,演示如何将文本导出为 CSV 文件,并指定编码格式,以避免乱码问题:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class CsvExporter {
    public static void main(String[] args) throws IOException {
        // 模拟要导出的文本数据
        String text = "姓名,年龄,性别\n张三,20,男\n李四,22,女\n王五,25,男";

        // 指定导出文件的路径和文件名
        File file = new File("D:/data.csv");

        // 指定导出文件的编码格式
        String charset = "UTF-8";

        // 创建输出流和缓冲区
        FileOutputStream fos = new FileOutputStream(file);
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        BufferedWriter bw = new BufferedWriter(osw);

        // 将文本写入 CSV 文件
        bw.write(text);

        // 关闭输出流和缓冲区
        bw.flush();
        bw.close();
        osw.close();
        fos.close();

        // 输出导出成功的信息
        System.out.println("导出成功!");
    }
}

首先模拟了要导出的文本数据,然后指定了导出文件的路径和文件名,并创建了输出流和缓冲区。接着将文本写入 CSV 文件,并在完成后关闭输出流和缓冲区。最后输出导出成功的信息。

大文件分批导出并且指定编码格式

大文件分批导出可以通过分页或者流式导出的方式来实现,具体实现方法如下:

1.分页导出

分页导出是将大文件分成多个小文件,每个小文件包含一定量的数据,从而避免一次性导出大文件造成的内存瓶颈。具体实现步骤如下:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class CsvExporter {
    public static void main(String[] args) throws IOException {
        // 模拟要导出的文本数据
        List<String> data = new ArrayList<>();
        for (int i = 1; i <= 10000; i++) {
            data.add("数据" + i);
        }

        // 指定每页数据量
        int pageSize = 1000;

        // 指定导出文件的路径和文件名
        File file = new File("D:/data.csv");

        // 指定导出文件的编码格式
        String charset = "UTF-8";

        // 计算总页数
        int pageCount = (int) Math.ceil((double) data.size() / pageSize);

        // 循环导出每一页数据
        for (int pageIndex = 1; pageIndex <= pageCount; pageIndex++) {
            // 计算当前页的起始位置和结束位置
            int startIndex = (pageIndex - 1) * pageSize;
            int endIndex = Math.min(pageIndex * pageSize, data.size());

            // 创建输出流和缓冲区
            FileOutputStream fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw);

            // 将当前页的数据写入 CSV 文件
            for (int i = startIndex; i < endIndex; i++) {
                String row = data.get(i) + "\n";
                bw.write(row);
            }

            // 关闭输出流和缓冲区
            bw.flush();
            bw.close();
            osw.close();
            fos.close();
        }

        // 输出导出成功的信息
        System.out.println("导出成功!");
    }
}

以上示例中,首先模拟了要导出的数据,然后指定了每页数据量、导出文件的路径和文件名以及导出文件的编码格式。接着计算总页数,循环导出每一页数据。在循环中,根据当前页的起始位置和结束位置,将当前页的数据写入 CSV 文件,并在完成后关闭输出流和缓冲区。最后输出导出成功的信息。

2.流式导出

流式导出是将大文件按照一定的规则分成多个小文件,每个小文件依次导出。具体实现步骤如下:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class CsvExporter {
    public static void main(String[] args) throws IOException {
        // 模拟要导出的文本数据
        List<String> data = new ArrayList<>();
        for (int i = 1; i <= 10000; i++) {
            data.add("数据" + i);
        }

        // 指定导出文件的路径和文件名
        File file = new File("D:/data.csv");

        // 指定导出文件的编码格式
        String charset = "UTF-8";

        // 指定每次读取的数据量
        int bufferSize = 1000;

        // 创建输出流和缓冲区
        FileOutputStream fos = new FileOutputStream(file);
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        BufferedWriter bw = new BufferedWriter(osw);

        // 循环读取数据,将数据写入 CSV 文件
        for (int i = 0; i < data.size(); i++) {
            String row = data.get(i) + "\n";
            bw.write(row);

            // 每次读取一定量的数据后,将数据写入 CSV 文件并清空缓冲区
            if ((i + 1) % bufferSize == 0) {
                bw.flush();
            }
        }

        // 关闭输出流和缓冲区
        bw.flush();
        bw.close();
        osw.close();
        fos.close();

        // 输出导出成功的信息
        System.out.println("导出成功!");
    }
}

以上示例中,首先模拟了要导出的数据,然后指定了导出文件的路径和文件名以及导出文件的编码格式。接着指定每次读取的数据量,并创建输出流和缓冲区。在循环中,将数据写入 CSV 文件并清空缓冲区,直到读取完所有数据为止。最后关闭输出流和缓冲区,并输出导出成功的信息。

你可能感兴趣的:(java,IO,后端,工具)