【问题标题】:Creating an read only arraylist of string from inputstream从输入流创建一个只读的字符串数组列表
【发布时间】:2014-06-02 13:27:43
【问题描述】:

我一直在尝试将字符串从输入流存储到数组列表。

首先,我使用输入流将输入流转换为字符串

IOUtils.copy(inputStream , str);
str.toString();

然后我尝试将此字符串存储到 arraylist 中:

public static final List<String> list = Collections.unmodifiableList(new ArrayList<String>(Arrays.asList(str.split("\n"))));

显示错误:

  1. 参数列表的非法修饰符,只允许使用final
  2. 类型安全:List 类型的表达式需要未经检查的转换才能符合 List

请告诉我我哪里错了?

【问题讨论】:

    标签: java


    【解决方案1】:

    Collections.unmodifiableList 中,您可以直接传递Arrays.asList,因为它会为您提供一个列表。 无需再次使用ArrayList 实例包装。

    还没有对新创建的列表的引用。

    你可以这样做:

    List<String> list = Collections.unmodifiableList(Arrays.asList(str.split("\n")));
    

    Arrays.asList 不能添加或删除元素。

    通过不可修改的列表,您不能使用 setter 方法从内部列表中添加、删除或修改

    【讨论】:

      【解决方案2】:
      package com.test;
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      import java.util.List;
      public class Test {
          public static void main(String[] args) throws FileNotFoundException, IOException {
              InputStream in = new FileInputStream(new File("/home/ikuser/testing.txt"));// Give Path Of the file
              List<String> list = new ArrayList<String>(); // Initialize List
              BufferedReader reader = new BufferedReader(new InputStreamReader(in));
              StringBuilder out = new StringBuilder();
              String line;
              while ((line = reader.readLine()) != null) {
                  out.append(line);
                  list.add(line); // Add Line in the list
              }
              reader.close();
              for(String l : list){
                  System.out.println(l); //list print
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        让我们看看。首先,关键字 staticpublic 只能应用于类字段(如果谈论的是数据而不是方法),而不能应用于局部变量。

        关于final关键字有几句话要说。在 Java 中有两种类型:原始类型(int、float、double 等)和引用。如果您将 final 关键字应用于原始类型变量,它实际上会保护它不被更改。

        对于引用类型,它更复杂。例如:

        final List<String> list = new ArrayList<>();
        

        您不能更改列表变量(它是对实际列表的引用),但您可以修改列表本身。如果你想保护列表不被修改,你可以使用 unmodifiableList 方法:

        final List<String> list = Collections.unmodifiableList(new ArrayList<>());
        

        【讨论】:

          【解决方案4】:

          如果您在方法内部使用staticpublic,则局部变量不允许使用类型删除类型

          这样做

           List<String> list = Collections.unmodifiableList(new ArrayList<String>(Arrays.asList(str.split("\n"))));
          

          【讨论】:

          • 或者只是 Collection list = Collections.unmodifiableList(new ArrayList(Arrays.asList(str.split("\n"))));
          • 我有点怀疑。如果我想返回这个列表,方法的返回类型会是 List 吗?
          • 您可以使用List&lt;String&gt; 来避免type-safety 警告,但不严格使用该类型。
          • 我使用过 List 并收到类型安全警告,方法是说“此方法必须返回 List 类型的结果这是为什么?
          猜你喜欢
          • 2017-02-13
          • 2011-07-24
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 2013-08-11
          • 2019-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多