Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭迭代器中的BufferedReader以返回文件行_Java_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 关闭迭代器中的BufferedReader以返回文件行

Java 关闭迭代器中的BufferedReader以返回文件行,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,我为迭代器编写了以下类,该迭代器沿着文件行进行迭代 import java.io.*; import java.util.Iterator; public class FileIterator implements Iterator<String> { private BufferedReader reader; public FileIterator(String filename) { this.reader = getBufferedReader(filename);

我为迭代器编写了以下类,该迭代器沿着文件行进行迭代

import java.io.*;
import java.util.Iterator;

public class FileIterator implements Iterator<String> {

private BufferedReader reader;

public FileIterator(String filename) {
  this.reader = getBufferedReader(filename);
}


private static BufferedReader getBufferedReader(String filename) {

  File file = new File(filename); 
  if(file.exists()) {
    try {
          return new BufferedReader(new InputStreamReader(
                  new FileInputStream(new File(filename)),"UTF-8"));
        } catch (Exception e) {
      e.printStackTrace();
          return null;
    }
  } else {
        System.out.println(filename + " is not there");
        return null;
  }
}

public boolean hasNext() {
  try {
    return reader.ready();
  } catch (IOException e) {
    e.printStackTrace();
    return false;
  }
}

public String next() {
  try {
    return reader.readLine();
  } catch (IOException e) {
    e.printStackTrace();
    return null;
  }
}

public void remove() {}
}

谢谢

如果您真的想这样做,我会让FileIterator实现Closeable并将调用委托给底层的BufferedReader。您甚至可以在Java 7块中使用它。

如果您真的想这样做,我会让FileIterator实现Closeable并将调用委托给底层的BufferedReader。您甚至可以在Java 7块中使用它。

像这样的问题是您可能不应该像这样使用
迭代器的主要原因。我知道,但是我需要一个迭代器的快速实现来测试一个接口。。。然后我想知道我是否可以从中做一些其他的事情。你不应该用一个迭代器做任何其他的事情,这个迭代器可以为一个不存在的文件创建,然后在调用hasNext()时抛出一个NullPointerException。这是一个笨拙的行为。顺便说一下:从
remove()
@davide()抛出
UnsupportedOperationException
:如果你只是使用一小部分
字符串进行测试,为什么不使用
数组。asList(“example1”,“example2”,“example3”)。迭代器()
?这些问题是您可能不应该使用像这样的
迭代器的主要原因。我知道,但我需要一个迭代器的快速实现来实现我必须测试的接口。。。然后我想知道我是否可以从中做一些其他的事情。你不应该用一个迭代器做任何其他的事情,这个迭代器可以为一个不存在的文件创建,然后在调用hasNext()时抛出一个NullPointerException。这是一个尴尬的行为。顺便问一下:从
remove()
@davide中抛出
UnsupportedOperationException
:如果你只是使用一小部分
字符串进行测试,为什么不直接使用
数组。asList(“example1”,“example2”,“example3”)。iterator()
?他为什么不想这样做?他还想做什么呢?(闻起来好像有个最佳实践)这有点滥用Iterable接口,因为您只能对它迭代一次。但是Java的DirectoryStream也是如此,所以可能还没那么糟糕。我有一个LineIterable类,我们在工作中经常使用它,所以我不能说这是一个可怕的想法:)他为什么不想这样做?他还想做什么呢?(闻起来好像有个最佳实践)这有点滥用Iterable接口,因为您只能对它迭代一次。但是Java的DirectoryStream也是如此,所以可能还没那么糟糕。我有一个LineIterable类,我们在工作中经常使用它,所以我不能说这是一个可怕的想法:)
public boolean hasNext() {
  try {
        if(reader.ready()) return true;
        else {
          reader.close();
      return false;
        }
  } catch (IOException e) {
    e.printStackTrace();
    return false;
  }
}