我有这样一种方法:
public void LoadFromFile(){
String record;
try{
FileReader reader = new FileReader("Friends.txt");
BufferedReader bin = new BufferedReader(reader);
while((record = bin.readLine()) != null){
//do some stuff
}
clientinfo = homeAddress.LoadFromFile(reader);
方法是homeAddress。上述LoadFromFile(reader)位于另一个类中,如下所示:
public String[] LoadFromFile(FileReader areader){
String record;
try{
BufferedReader bin = new BufferedReader(areader);
while((record = bin.readLine()) != null){
//do some stuff
}
}
bin.close();
bin = null;
我的问题是,我始终使用相同的文件读取器,所以当我将BufferedReader包装在它周围时,BufferedReader是否使用文件读取器的文件指针(从哪里开始读取)?
第一个BufferedReader是否更新文件指针,以便第二个BufferedReader知道从哪里开始?
从BufferedReader的源代码中可以看出,它有一个内部变量nextChar
,用于读取下一个字符的索引,因此除非您自己存储变量或传递BufferedReader实例,“指针”将不会进行下一次调用。
这非常简单,可以测试:
朋友。txt:
foo
bar
代码:
import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReadingTest {
@Test
public void LoadFromFile() throws IOException {
String record;
try {
FileReader reader = new FileReader("Friends.txt");
BufferedReader bin = new BufferedReader(reader);
while ((record = bin.readLine()) != null) {
System.out.println("1: read " + record);
break;
}
LoadFromFile(reader);
} catch (FileNotFoundException foo) {
System.out.println("file not found from " + new File(".").getAbsolutePath());
}
}
public void LoadFromFile(FileReader areader) {
String record;
try {
BufferedReader bin = new BufferedReader(areader);
while ((record = bin.readLine()) != null) {
System.out.println("2: read " + record);
}
bin.close();
bin = null;
} catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
}
执行:
1: read foo
Process finished with exit code 0
所以第二个读者甚至没有机会阅读,即使第一次阅读没有完成。还有,如果你介绍宾。close()在第一次读取之后,第二次读取将抛出java。伊奥。IOException:流已关闭
。
正如评论中所建议的,如果您想继续阅读第一个方法停止的第二个方法,最简单的方法是传递同一个bufferedreader实例。你必须小心在合适的时间释放资源。
这里的关键是缓冲这个词。不,您不能假设第二个LoadFromFile
中的BufferedReader
将在调用者中的BufferedReader
离开的地方准确拾取。从留档:
从字符输入流读取文本,缓冲字符,以便高效读取字符、数组和行。
(我的重点)
这意味着BufferedReader
将读取文件中的数据并将其保存在缓冲区中。因此,第二个BufferedReader
将拾取第一个未读的第一个字符
相反:将BufferedReader
传递到第二个方法中,并相应地更改其签名。
总的来说,它的签名已经有点问题了。它不需要知道或关心它是从文件还是其他类型的流中读取;它只需要知道它是从BufferedReader
中读取的(因为它依赖于readLine
)。
旁注:在您的代码中,如果在读取时发生异常,您将没有机会清理读卡器分配的非JVM资源(尤其是文件读取器
)。这就是“资源试用”真正有用的地方:
try (
FileReader reader = new FileReader("Friends.txt");
BufferedReader bin = new BufferedReader(reader);
) {
while((record = bin.readLine()) != null){
//do some stuff
}
clientinfo = homeAddress.LoadFromFile(reader);
在那里,即使在readLine
中发生异常,也会清理读取器。
我们使用Spark CSV reader读取CSV文件以转换为DataFrame,并在上运行该作业,它在本地模式下运行良好。 我们在中提交spark作业。 错误日志:
问题内容: 我正在尝试读取“ file.txt”,然后使用Golang将内容放入变量中。这是我尝试过的… 文件已成功读取,并且从 os.Open 返回的返回类型为 * os.File 问题答案: 这取决于您要执行的操作。 它输出&{0xc082016240}的原因是因为您正在打印文件描述符()的指针值,而不是文件内容。要获取文件内容,可以从文件描述符中获取。 要将所有文件内容(以字节为单位)读取到
我有以下代码来读取java文件,并打印出行。我通过两种方式实现了它: 使用流: 使用循环: 我被告知这是错误的,使用缓冲读取器是错误地使用了语言的特性。有没有更好的方法,我想知道使用语言功能的正确方法。
问题内容: 我有一个很大的PDF文件,它是建筑物的平面图。它具有用于所有办公家具的图层,包括座位位置的文本框。 我的目标是使用PHP读取此文件,在文档中搜索文本层,获取其内容和文件中的坐标。这样,我可以绘制出座位位置-> x / y坐标。 有没有办法通过PHP做到这一点?(如果需要的话,甚至可以是Ruby或Python) 问题答案: 签出FPDF(使用FPDI): http://www.fpdf.
我有一个名为“add”的方法,它将字符串作为参数,并使用bufferedwriter将其写入文件。完成此操作后,bufferedwriter将被刷新。 在另一个方法“read”中,我遍历文件中的行,但这些行是空的(因此我不能打印它们)。
问题内容: 我想知道我怎么可以将文件加载从文件夹到我的close方法。到目前为止的代码: 启动时控制台错误输出: 问题答案: 如果您想从jar文件中加载文件(例如,从classpath加载),请参阅此答案以获取有关如何获取的更多选项。在下面的代码中,我没有进行任何异常处理,并删除了您的相关代码。 编辑: 似乎您在文件夹结构上做错了什么,或者您使用了错误的包/文件名。只是要清楚。目前,您似乎在一个程