我有一个ReadFromFile类,该类实现Callable并返回字符串列表。此字符串列表应显示在控制台中,但不显示奇怪的东西。在调试器中,我看到列表不为空并且其中的数据正确。但是不会显示。
代码如下:
ReadFromFile
public class ReadFromFile implements Callable<List<String>> {
private File file;
public ReadFromFile(File file) {
this.file = file;
}
@Override
public List<String> call() throws Exception {
String row = null;
List<String> data = new ArrayList<>();
try (BufferedReader csvReader = new BufferedReader(new FileReader(file))) {
while ((row = csvReader.readLine()) != null) {
data = Arrays.asList(row.split(";"));
}
} catch (IOException i) {
System.out.println("Break");
}
return data;
}}
这里是将未来数据分配到要显示的列表的方法:
public static void setupShop(List<String> menuItems, Map<String, Integer> stock, Map<String, Float> price) throws IOException, ExecutionException, InterruptedException {
menuItems = Executors.newFixedThreadPool(1).submit(new ReadFromFile(menuFile)).get();
}
我在这里排除了地图代码,这不会影响这种情况。
但是!如果我创建另一个列表并将Future中的数据分配给它,则数据将正确显示:
public static void setupShop(List<String> menuItems, Map<String, Integer> stock, Map<String, Float> price) throws IOException, ExecutionException, InterruptedException {
List <String> menu = new ArrayList<>();
menu = Executors.newFixedThreadPool(1).submit(new ReadFromFile(menuFile)).get();
for (int i = 0; i<menu.size();i++)
{
menuItems.add(menu.get(i));
}
所以,问题是,为什么我不能直接打印来自future.get的数据?
答案 0 :(得分:1)
data = Arrays.asList(row.split(";"));
此行是错误的,您重新分配了列表,这样列表将采用文件最后一行的值。
改为使用data.addAll(Arrays.asList(row.split(";")));
。也许问题出在这里,假设您的最后一行是空行
更新:
这里有一个可复制的最小工作示例:
public class ReadFromFile implements Callable<List<String>> {
private File file;
public ReadFromFile(File file) {
this.file = file;
}
@Override
public List<String> call() throws Exception {
String row = null;
List<String> data = new ArrayList<>();
try (BufferedReader csvReader = new BufferedReader(new FileReader(file))) {
while ((row = csvReader.readLine()) != null) {
data.addAll(Arrays.asList(row.split(";")));
}
} catch (IOException i) {
System.out.println(i.getMessage());
}
return data;
}
}
经过主类测试
public class Main {
public static void main(String[] args) {
try {
List<String> menu = Executors.newFixedThreadPool(1).submit(new ReadFromFile(new File("src/test.csv"))).get();
menu.forEach(System.out::println);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
CSV文件:
sfdfdsf;fdsgfdfsg;gfdgff
gfsgfd;fgfdg;gfgdfg
主要执行结果:
sfdfdsf
fdsgfdfsg
gfdgff
gfsgfd
fgfdg
gfgdfg