如何存储List以实现跨类使用及同类其他方法调用?
解决CSV读取后List的跨方法/跨类复用问题
我已创建一个用于读取并存储CSV文件的方法,核心代码片段如下:
Scanner inputStream = new Scanner(file); while (inputStream.hasNext()) { List.add(inputStream.nextLine()); } inputStream.close();现咨询两个技术问题:
- 如何存储返回的List,以便在其他类中使用;
- 如何存储当前List,以便在同一个类的其他方法中使用。
嘿,这两个都是Java开发里很常见的数据复用场景,我给你梳理下具体的实现方案:
一、同一个类的其他方法中使用List
这个场景最简单,把List定义成类的成员变量就行,分两种情况:
1. 实例成员变量(每个类实例独立持有数据)
如果你的CSV数据是和类的实例绑定的(比如每个实例读取不同的CSV文件),就把List定义为实例变量:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class CsvReader { // 定义为实例成员变量,每个CsvReader实例有自己的列表 private List<String> csvDataList = new ArrayList<>(); public void readCsv(File file) { // 读取前清空列表,避免重复读取时数据累加 csvDataList.clear(); // 用try-with-resources自动关闭流,更安全 try (Scanner inputStream = new Scanner(file)) { while (inputStream.hasNext()) { csvDataList.add(inputStream.nextLine()); } } catch (FileNotFoundException e) { System.err.println("读取CSV文件失败:" + e.getMessage()); } } // 同一个类里的其他方法直接使用csvDataList public void printCsvContent() { csvDataList.forEach(System.out::println); } }
2. 静态成员变量(全局共享一份数据)
如果整个应用只需要一份CSV数据,就把List定义为静态变量,所有类实例共享:
public class CsvReader { // 静态成员变量,全局共享 private static List<String> csvDataList = new ArrayList<>(); public static void readCsv(File file) { csvDataList.clear(); try (Scanner inputStream = new Scanner(file)) { while (inputStream.hasNext()) { csvDataList.add(inputStream.nextLine()); } } catch (FileNotFoundException e) { System.err.println("读取CSV文件失败:" + e.getMessage()); } } // 静态方法直接访问静态变量 public static void printCsvContent() { csvDataList.forEach(System.out::println); } }
二、在其他类中使用这个List
这里有几种实用的方案,你可以根据项目场景选择:
方案一:让读取方法直接返回List
最直接的方式,把读取方法的返回值设为List<String>,其他类调用方法就能拿到数据:
public class CsvReader { public List<String> readCsv(File file) { List<String> csvDataList = new ArrayList<>(); try (Scanner inputStream = new Scanner(file)) { while (inputStream.hasNext()) { csvDataList.add(inputStream.nextLine()); } } catch (FileNotFoundException e) { System.err.println("读取CSV文件失败:" + e.getMessage()); } return csvDataList; } } // 其他类调用示例 public class DataProcessor { public static void main(String[] args) { CsvReader reader = new CsvReader(); List<String> csvData = reader.readCsv(new File("data.csv")); // 在这里处理csvData csvData.forEach(line -> System.out.println("处理行:" + line)); } }
方案二:通过Getter方法获取类成员变量
如果已经把List定义为类的成员变量(比如前面的实例/静态变量),可以给它加个Getter方法,其他类通过实例或类名获取:
public class CsvReader { private List<String> csvDataList = new ArrayList<>(); public void readCsv(File file) { csvDataList.clear(); try (Scanner inputStream = new Scanner(file)) { while (inputStream.hasNext()) { csvDataList.add(inputStream.nextLine()); } } catch (FileNotFoundException e) { System.err.println("读取CSV文件失败:" + e.getMessage()); } } // 提供Getter方法,返回不可修改的列表避免外部篡改内部数据 public List<String> getCsvDataList() { return List.copyOf(csvDataList); // 或者Collections.unmodifiableList(csvDataList) } } // 其他类使用示例 public class DataProcessor { public static void main(String[] args) { CsvReader reader = new CsvReader(); reader.readCsv(new File("data.csv")); List<String> csvData = reader.getCsvDataList(); // 使用数据 } }
小提醒
你的原始代码里没有处理文件不存在的异常,最好加上异常捕获;另外用try-with-resources包裹Scanner,能自动关闭流,避免资源泄漏,更规范~
内容的提问来源于stack exchange,提问作者KleinESK
相关产品推荐
相关产品推荐

