【问题标题】:How does reader in Java internally work in case of character buffer?在字符缓冲区的情况下,Java 中的阅读器如何在内部工作?
【发布时间】:2018-04-02 10:24:06
【问题描述】:
public class ReadFileUsingFileReader {

public static void main(String[] args) {
        String path = "D:\\sticky_notes.txt";
        readFileUsingFileReader(path);
    }

    public static void readFileUsingFileReader(String file) {

        try {
            //read the file
            FileReader reader = new FileReader(file);
            char[] buffer = new char[1024];
            int noOfCharsRead = reader.read(buffer);
            while (noOfCharsRead != -1) {
                System.out.println(String.valueOf(buffer, 0, noOfCharsRead));
                noOfCharsRead = reader.read(buffer);
            }
            reader.close();
     } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

这里的变量“reader”从文件中读取前 1024 个字符并将其保存到缓冲区中。 现在再次在 while 循环中,它读取接下来的 1024 个字符。 我的问题是第二次阅读器如何知道它应该从哪个索引开始阅读下一个字符。是否有某种标志,如果有,如何访问它。

【问题讨论】:

  • 它没有。操作系统提供对文件的顺序访问。 FileReader 不需要对此做任何事情。

标签: java file-io buffer bufferedreader fileinputstream


【解决方案1】:

这是实现打开文件概念的类的目的。有一个包含当前位置的底层结构,就像你读书时的书签一样。 Java FileReader 不提供访问权限,因为阅读器几乎只是让您从头到尾阅读。所以当前位置正是你实际读取的字节数。

但是,如果您使用 RandomAccessFile 可以访问它,您可以在其上调用 long getFilePointer()void seek(long position) 方法。 RandomAccessFile 是唯一可以让您控制输入/输出发生位置的文件操作类。

---- 编辑(感谢 EJP)----

这仅适用于包java.io。还有另一个高级 IO 包java.nio 略有不同。

【讨论】:

  • 不,不是。 java.nio.channels.FileChannel 也提供。
  • @EJP 你是对的,但我说的是 java.io。 OP 似乎是该主题的初学者。
  • 尽管如此,当您说“RandomAccessFile 是唯一的文件操作类...”等时,您需要是正确的。或更具体。
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2015-04-24
  • 2023-04-11
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多