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;
}
}