文件IO,使用java中的for-each循环(:)读取文件数组

时间:2017-07-29 15:07:45

标签: java arrays file-io foreach

通常情况下,我知道会使用标准for循环来迭代数组,如:

public static void readCodesFromFile(String filename, String[] codes) throws FileNotFoundException {
    try ( Scanner fin = new Scanner(new File(filename) ); ) {
        for (int i = 0; i <= codes.length - 1; i++) {
            codes[i] = fin.nextLine();
        }
    }
}

但是,我非常想要发现如何使用for循环代替。 在这一点上,我只需要知道它是否可以完成,但也会喜欢使用这个循环来完成这项任务的效率和清洁度。我尝试了类似这样的东西,并且多次移动东西,但似乎无法正常阅读。

以下是我一直在使用的每个(:):

 public static void readCodesFromFile(String filename, String [] codes) throws FileNotFoundException {
     try (Scanner fin = new Scanner(new File(filename) ); ) {
         for (String code : codes) {
            codes = fin.nextLine();
         }
     }
 }

2 个答案:

答案 0 :(得分:0)

  

此时我只需要知道是否可以做到......

不,不是因为它的写作。首先,规范不允许它,但你也处理不可变的String。比如,在第二个示例中,code是对数组中元素的引用。一旦我code = "foo";code现在引用(推测)新的String,并且数组元素保留其原始值。

  

但是,我非常想要发现每个人如何做到这一点   而是循环。

如果是这样,为什么不解决问题?而不是迭代数组,提供迭代文件的方法。

在这个答案中,我将假设两件事:

  1. 您将提供Iterable FileReader
  2. 您将使用ArrayList而不是正常数组(这是为了超越索引问题,并且您不再需要知道或关心的额外好处文件中的行数
  3. 这里是FileReader很多未实现):

    class FileReader implements Iterable<String> {
    
        @Override
        public Iterator<String> iterator() {
            return new FileReaderIterator();
        }
    
        @Override
        public void forEach(Consumer<? super String> action) { }
    
        @Override
        public Spliterator<String> spliterator() { return null; }
    
        class FileReaderIterator implements Iterator<String> {
    
            @Override
            public boolean hasNext() {
                return false;
            }
    
            @Override
            public String next() {
                return null;
            }
    
            @Override
            public void remove() { }
    
            @Override
            public void forEachRemaining(Consumer<? super String> action) { }
        }
    }
    

    假设您已实现此功能,您可以像这样使用它:

    List<String> lines = new ArrayList<>();
    FileReader reader = new FileReader(...);
    for (String line : reader) {
        lines.add(line);
    }
    

    我并不是建议你改变你的设计而是考虑不同的设计选择可以提供什么。

答案 1 :(得分:0)

使用基本数组非常容易实现此目的的另一种方法是将行封装在类中。例如:

class FileLine {
    private String line;

    public FileLine() {...}

    public FileLine(String line) {
        this.line = line;
    }

    public setLine(String line) {
        this.line = line;
    }
}

创建一个数组,使用增强的for循环迭代它,而不是设置数组字符串元素的值,设置FileLine实例的字符串成员的值。像这样:

// Given an array of instantiated FileLines...
for (FileLine fileLine : fileLines) {
    fileLine.setLine(...);
}

减少工作量,您不必担心尝试迭代文件。