Files
ElderlyDialer/app/src/main/java/com/ttstd/dialer/manager/CsvDeserializer.java
2026-03-06 09:50:58 +08:00

103 lines
3.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.ttstd.dialer.manager;
import android.content.Context;
import android.util.Log;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
import com.ttstd.dialer.bean.CityInfo;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class CsvDeserializer {
private static final String TAG = "CsvDeserializer";
/**
* 从assets文件夹中的CSV文件反序列化为对象列表
*
* @param context 上下文
* @param fileName assets中的CSV文件名
* @return 对象列表
*/
public static List<CityInfo> deserializeFromAssets(Context context, String fileName) {
InputStream inputStream = null;
Reader reader = null;
try {
long time = System.currentTimeMillis();
// 从assets获取CSV文件输入流
inputStream = context.getAssets().open(fileName);
reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
// 创建映射策略使用CSV头部列名映射到对象字段
HeaderColumnNameMappingStrategy<CityInfo> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(CityInfo.class);
// 创建CsvToBean并进行转换
CsvToBean<CityInfo> csvToBean = new CsvToBeanBuilder<CityInfo>(reader)
.withMappingStrategy(strategy)
.withIgnoreLeadingWhiteSpace(true)
.withIgnoreEmptyLine(true) // 忽略空行
.withThrowExceptions(false) // 不抛出异常,便于调试
.build();
Log.e(TAG, "deserializeFromAssets: finish " + (System.currentTimeMillis() - time) + "ms");
// 转换并返回结果列表
return csvToBean.parse();
} catch (IOException e) {
Log.e(TAG, "Error reading CSV file: " + e.getMessage());
e.printStackTrace();
} catch (Exception e) {
Log.e(TAG, "Error during CSV deserialization: " + e.getMessage());
e.printStackTrace();
} finally {
// 确保关闭流,避免资源泄漏
try {
if (reader != null) {
reader.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
Log.w(TAG, "Failed to close stream: " + e.getMessage());
}
}
return new ArrayList<>();
}
/**
* 从输入流反序列化为对象列表
*
* @param inputStream CSV文件输入流
* @return 对象列表
*/
public static List<CityInfo> deserializeFromStream(InputStream inputStream) {
try {
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
HeaderColumnNameMappingStrategy<CityInfo> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(CityInfo.class);
CsvToBean<CityInfo> csvToBean = new CsvToBeanBuilder<CityInfo>(reader)
.withMappingStrategy(strategy)
.withIgnoreLeadingWhiteSpace(true)
.build();
return csvToBean.parse();
} catch (Exception e) {
Log.e(TAG, "Error during CSV deserialization: " + e.getMessage());
e.printStackTrace();
}
return null;
}
}