> 文章列表 > 文件导入导出

文件导入导出

文件导入导出

文件导出

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

  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 文件并清空缓冲区,直到读取完所有数据为止。最后关闭输出流和缓冲区,并输出导出成功的信息。