无法从Future对象重新打印字符串列表时打印数据

时间:2019-11-20 08:54:38

标签: java list future

我有一个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的数据?

1 个答案:

答案 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