`
chencang
  • 浏览: 421986 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于BufferedReader的mark()问题

    博客分类:
  • Java
阅读更多

今天碰到一个关于BufferedReader的mark()问题,于是去google了一下,发现N年前一篇帖子(汗一个)和我遇到的问题一样,但貌似没有最终的明确结论。

写道
标 题: 关于BufferedReader的mark()问题
发信站: BBS 水木清华站 (Wed Apr 21 19:35:26 2004)

在做第三次的作业时,为了统计行数,我先用把文件读了一遍,然后要让文件指针指向文件头,于是我在文件的最开始mark()了一下,mark()的长度为file.length(),当指针指到文件末后用reset()指回来,但是我发现了一个奇怪的问题,如果文件的最后一个字符是中文,则一切正常,如果文件的最后一个字符是英文,则java.io.IOException: Mark invalid,这时如果使用mark()中的长度设为file.length()+1,才正确,我百思不得其解,希望大家能给我解答。我的代码如下:
myFile = new File(filename);
fr = new FileReader(myFile);
br = new BufferedReader(fr);

br.mark((int)myFile.length());
while (null != br.readLine())
{
line++;
}
br.reset();

 

我今天遇到的问题也是一个样的,测试代码如下

class BufferedReaderDemo {
	public static void main(String[] args) throws IOException {
		String s = "This is a © copyright symbol but this is & copy not.";
		char buf[] = new char[s.length()];
		s.getChars(0, s.length(), buf, 0);
		CharArrayReader in = new CharArrayReader(buf);
		BufferedReader f = new BufferedReader(in);
		int c,d = 0;
		f.mark(s.length() + 1);  //这里如果写f.mark(s.length())在后面f.reset()时候就会报java.io.IOException: Mark invalid错误
		while ((c = f.read()) != -1){
			d++;
		}
		f.reset();
	}
}

 不知道为什么,希望大家帮我解答一下,谢谢。

分享到:
评论

相关推荐

    BufferedReader的用法---马克-to-win java视频

    BufferedReader的用法---马克-to-win java视频缓存输入流的介绍

    Java 中的 BufferedReader 介绍_动力节点Java学院整理

    * markSupported():检查 BufferedReader 是否支持 mark 操作。 * read():读取一个字符,如果已到达流末尾,则返回 -1。 * read(char[] buffer, int offset, int length):读取多个字符到指定的数组中。 * readLine...

    import java.io.BufferedReader.docx

    - `mark(int readAheadLimit)`: 设置输入标记。 - `reset()`: 重新设置输入到上一个标记的位置。 - `skip(long n)`: 跳过并丢弃 `n` 个输入字符。 #### 4. 示例代码分析 ```java BufferedReader reader = new ...

    【IT十八掌徐培成】Java基础第13天-03.BufferedReader.zip

    `BufferedReader`还提供了其他辅助方法,如`ready()`(检查是否可以读取而不阻塞)和`mark(int readLimit)`/`reset()`(标记当前位置并允许回溯到标记点)等,这对于处理复杂的输入流操作非常有用。 在实际开发中,...

    Java中BufferedReader与BufferedWriter类的使用示例

    除了基本的读写操作,`BufferedReader`还提供了`mark()`和`reset()`方法,用于标记当前读取位置并允许回溯到标记位置。`mark(int readLimit)`方法允许设置一个标记,如果在读取`readLimit`个字符之前调用`reset()`,...

    带有mark标记的代码片

    Java编程语言中,流(Stream)是处理数据的基本机制,特别是在读取或写入文件、网络数据等场景。`mark` 和 `reset` 是Java IO流中的两个关键方法,...实践中不断尝试和应用,你将能够熟练运用这两个方法解决实际问题。

    Android读取中文文件乱码解决方法

    #### 一、问题背景 在开发Android应用时,经常需要处理中文字符或包含中文的文件。如果处理不当,可能会遇到中文乱码的问题,尤其是在读取本地文件或者从网络下载文件时更为常见。本文将详细介绍如何解决Android...

    Java解决UTF-8的BOM问题

    然而,UTF-8有一个特殊的形式,即带BOM(Byte Order Mark)的UTF-8,这个BOM在某些情况下可能会引发问题。本文将详细探讨Java中如何处理UTF-8的BOM问题。 首先,我们需要理解什么是BOM。BOM是Unicode编码中的一个...

    Java读取中文文件出现乱码解决过程.mht

    7. **注意文件的BOM头**:有些UTF-8编码的文件带有BOM(Byte Order Mark),在读取时如果不考虑BOM,也可能导致乱码。可以使用无BOM的UTF-8编码进行读取。 总之,解决Java读取中文文件乱码的关键在于确定正确的文件...

    解决android读取中文乱码 自动判断文档类型并转码

    in.mark(4); byte[] first3bytes = new byte[3]; in.read(first3bytes); in.reset(); if (first3bytes[0] == (byte) 0xEF && first3bytes[1] == (byte) 0xBB && first3bytes[2] == (byte) 0xBF) { reader = ...

    java 读取服务器上的某个文件,并解决UTF-8 BOM文件的问号问题

    这个场景中,我们面临的挑战是如何正确处理UTF-8带有BOM(Byte Order Mark)的文件,因为BOM可能会导致文件内容显示为问号或者其他乱码。下面将详细介绍如何解决这个问题。 首先,我们需要理解什么是UTF-8的BOM。...

    Java输入输出流Java输入输出流.doc

    BufferedReader的mark()方法用于设置读取位置的标记,方便后续使用reset()返回到标记的位置。此外,close()方法用于关闭流,释放资源。 在Java I/O 流的层次结构中,还有很多其他子类,比如DataInputStream和...

    java 读取文件乱码

    4. 自定义读取器:如上述提到的`UnicodeReader`,自定义读取器可以在特定情况下提供更好的控制,例如处理BOM(Byte Order Mark)或者复杂编码格式。 5. 工具支持:有些IDE如IntelliJ IDEA和Eclipse,提供了配置文件...

    java处理BOM头的XML

    可以使用Java的`InputStreamReader`和`BufferedReader`,指定正确的编码格式来读取文件,这样可以忽略BOM头。 2. **修改编辑器设置**:避免在编辑XML文件时添加BOM头。对于记事本,可以使用其他更专业的文本编辑器...

    io 流 ppt 有问题 www.willvc.com.cn 能联系到我

    - **InputStream**的方法包括`read()`,`read(byte[])`,`read(byte[], int, int)`,`close()`,`available()`,`skip(long)`,`markSupported()`,`mark(int)`和`reset()`。`read()`方法用于读取字节,`close()`...

    CharArrayReader 介绍_动力节点Java学院整理

    此外,`CharArrayReader`是非同步的,如果多个线程同时访问,需要外部进行同步控制,以避免数据不一致的问题。 在实际应用中,当需要从内存中的字符数组读取数据时,可以使用`CharArrayReader`,它简化了对字符数组...

    java输入输出流

    它可以使用`readLine()`方法逐行读取文本,还可以通过`mark()`和`reset()`方法实现流的标记和回溯。 在给出的`IOStreamDemo`示例中,展示了不同类型的输入输出流的使用: 1. 使用`BufferedReader`从键盘读取一行...

    Java习题七.docx

    mark()方法用于设置Buffer的标记(mark),只能在0与limit之间做标记。rewind()方法将position设置为0,并设置mark标记。 I/O流的概念是指在计算机系统中,以流的形式进行数据传输的机制。字节流和字符流的区别是,...

Global site tag (gtag.js) - Google Analytics