首先在build.gradle的dependencies里面添加
implementation 'com.opencsv:opencsv:5.4'//读csv文件
如果需要混淆的话,添加混淆
#CSV
-dontwarn com.opencsv.**
-dontwarn org.apache.commons.beanutils.**
-dontwarn org.apache.commons.collections.**
-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
-dontoptimize
然后就是读文件了
/**
* 从文件读数据
*/
private void readFile(){
showLoadingDialog();
new Thread(){
@Override
public void run() {
try {
File file = new File("filePath");
// 创建 CSVReader 对象并指定要读取的文件路径
CSVReader reader = new CSVReader(new FileReader(file.getAbsolutePath()));
String[] nextLine;
int lineNum = 0;
Log.i("llllll", "开始读啦啦啦");
while ((nextLine = reader.readNext()) != null) {
int num = nextLine.length;//一行有几列
String str = "";
for(int j = 0;j<num;j++){
str += str + " ";
}
System.out.println(str);//打印每行信息,这里就可根据需求存储数据了
lineNum++;
}
Log.i("llllll", "读完了啦啦啦 lineNum = "+ lineNum);
// 关闭 CSVReader
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
写CSV文件
public static void writeToCsvFile(String filePath, List<String[]> data) throws Exception {
File file = new File(filePath);
if (file.exists()){
file.delete();
}
FileWriter fileWriter = new FileWriter(file);
CSVWriter csvWriter = new CSVWriter(fileWriter);
for (String[] d : data) {
csvWriter.writeNext(d);
}
csvWriter.close();
fileWriter.close();
}
这样就完成读写csv文件了!但是,这样写的csv文件有一个问题,就是有些字母会出现乱码情况。这是因为编码问题导致的。在写csv文件的时候需要指定编码格式为“UTF-8”,并且写入一行
fos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
写csv文件的方法优化如下:
/**
* 数据保存成是csv文件
* @param filePath csv文件的路径
* @param data csv文件的内容
* @throws Exception
*/
public static void writeToCsvFile(String filePath, List<String[]> data) throws Exception {
File file = new File(filePath);
if (file.exists()){
file.delete();
}
try (FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // 设置编码为 UTF-8
CSVWriter csvWriter = new CSVWriter(osw)) {
fos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});//来代码中的这个是为了解决乱码用的
for (String[] d : data) {
csvWriter.writeNext(d);
}
// csvWriter.close(); // 不需要显式关闭,因为使用了 try-with-resources
// fileWriter.close(); // 这里没有 fileWriter,因为您使用了 OutputStreamWriter
}