BufferedReader的mark方法倒是很牛,只是这个参数到不是很好控制,网上讨论的也比较多
现在有这样一个需求
一个文本文件有如下四行内容
aaaa
bbbbb
=b
cccccc
我要用程序读取这个文件
但是第三行"=b"实际上是第二行的续行,也就是遇到行首是"="字符的就把该行和上行连接起来
也就是读出来是这种效果
aaaa
bbbbb=b
cccccc
我现在有段代码,但对它mark测试下行是不是"="打头的时候,如果这行是文件最后一行了,就IOException了
想了很久也没有搞定
public static void markLine() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File(
"in.txt")));
for (String line = reader.readLine(); line != null; line = reader
.readLine()) {
reader.mark(1);
for (int ch = reader.read(); ch == (int) ' ' || ch == (int) '\t'
|| ch == (int) '='; ch = reader.read()) {
reader.reset();
String newLine = reader.readLine();
if (newLine != null)
line += newLine;
reader.mark(1);
}
reader.reset();
System.out.println("我才是完整的一行:" + line);
}
reader.close();
}
原因就是读的line已经是最后一行了,下行已经是null了,对他进行mark,就会有问题了
现在暂时的解决办法是把reader.reset();用try catch包起来,遇到异常了不管,罪恶啊,罪恶
变成:
public static void markLine() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File(
"in.txt")));
for (String line = reader.readLine(); line != null && !line.equals(""); line = reader
.readLine()) {
reader.mark(1);
for (int ch = reader.read(); ch == (int) ' ' || ch == (int) '\t'
|| ch == (int) '='; ch = reader.read()) {
reader.reset();
String newLine = reader.readLine();
if (newLine != null)
line += newLine;
reader.mark(1);
}
try {
reader.reset();
} catch (IOException e) {
// IT'S OK
}
System.out.println("我才是完整的一行:" + line);
}
reader.close();
}
哪位高人能指点下我啊,多谢
或者把ch声明提前,在最后一个reset的时候判断ch是否读出了值
分享到:
相关推荐
BufferedReader的用法---马克-to-win java视频缓存输入流的介绍
BufferedReader 提供了多种构造方法,包括 BufferedReader(Reader in) 和 BufferedReader(Reader in, int size),其中 size 参数指定了缓冲区的大小。 BufferedReader 的主要方法包括: * close():关闭 ...
`BufferedReader` 提供了两个构造方法: - `BufferedReader(Reader in)`: 创建一个新的 `BufferedReader`,其底层 Reader 为指定的 `Reader` 对象。 - `BufferedReader(Reader in, int sz)`: 创建一个新的 `...
`BufferedReader`还提供了其他辅助方法,如`ready()`(检查是否可以读取而不阻塞)和`mark(int readLimit)`/`reset()`(标记当前位置并允许回溯到标记点)等,这对于处理复杂的输入流操作非常有用。 在实际开发中,...
`mark` 和 `reset` 是Java IO流中的两个关键方法,它们在处理流时提供了重要的功能。这里我们将深入探讨这两个方法的工作原理以及如何在实际编程中应用它们。 `mark(int readlimit)` 方法允许我们在流中设置一个...
除了基本的读写操作,`BufferedReader`还提供了`mark()`和`reset()`方法,用于标记当前读取位置并允许回溯到标记位置。`mark(int readLimit)`方法允许设置一个标记,如果在读取`readLimit`个字符之前调用`reset()`,...
3. **标记位置**:调用`mark()`方法记录当前读取的位置,以便之后能够回退到该位置继续读取数据。 4. **读取文件头部**:通过读取文件的前三个字节,判断其是否包含特定的BOM。 5. **确定编码**:根据读取到的BOM...
mark()方法用于设置Buffer的标记(mark),只能在0与limit之间做标记。rewind()方法将position设置为0,并设置mark标记。 I/O流的概念是指在计算机系统中,以流的形式进行数据传输的机制。字节流和字符流的区别是,...
BufferedReader的mark()方法用于设置读取位置的标记,方便后续使用reset()返回到标记的位置。此外,close()方法用于关闭流,释放资源。 在Java I/O 流的层次结构中,还有很多其他子类,比如DataInputStream和...
它可以使用`readLine()`方法逐行读取文本,还可以通过`mark()`和`reset()`方法实现流的标记和回溯。 在给出的`IOStreamDemo`示例中,展示了不同类型的输入输出流的使用: 1. 使用`BufferedReader`从键盘读取一行...
`skip()`方法用于跳过一定数量的字符,`mark()`和`reset()`则提供了一种回溯读取位置的能力。 在使用`CharArrayReader`时,需要注意的是,由于它是一个字符流,所以它不支持直接读取二进制数据,只适合处理文本数据...
InputStream提供了read()方法读取单个字节,read(byte[])读取多个字节,read(byte[], int, int)读取指定长度的字节,skip(long)跳过指定字节,mark()和reset()用于标记和回溯,以及close()关闭流。OutputStream则...
`mark()`和`reset()`方法支持标记读取位置,便于回溯。`markSupported()`检查流是否支持标记功能。 2. 字节输出流(Byte Output Stream)的基类是`OutputStream`,例如`FileOutputStream`和`BufferedOutputStream`...
`markSupported()`、`mark()`和`reset()`方法用于实现数据的回溯读取,如果流支持标记功能,可以通过设置标记并在需要时恢复到标记位置。 与之相对应,`OutputStream`类提供了写入数据的相关方法。`write()`方法也...
- **新方法的引入**:如`BufferedReader`的`readLine()`方法,`BufferedWriter`的`newLine()`方法等。 - **支持数据标记与回溯**:`BufferedInputStream`和`BufferedOutputStream`支持`mark()`和`reset()`方法,允许...
5. **读取和处理文件内容**: 使用`BufferedReader`的`readLine()`方法逐行读取文件。对于每一行,根据需求进行处理,比如存储、打印或解析。 6. **错误处理**: 一定要捕获可能的异常,如`IOException`,并提供适当...
根据提供的文件信息,我们可以归纳出以下关于 Java API 的知识点,主要聚焦于文件操作相关的类与方法。 ### 一、Reader接口及其子类 #### 1. Reader接口介绍 `Reader` 是所有字符输入流的超类,用于读取字符流。它...
在Java中,有多种方法可以用来识别或检测一个文件或输入流的编码格式。 1. **使用`CharsetDetector`** Java 6引入了`java.nio.charset.CharsetDetector`类,它可以检测输入流的字符编码。以下是一个简单的示例: ...
- InputStream的read()方法用于读取单个字节,skip()方法跳过指定字节数,mark()和reset()方法用于设置和回溯读取位置,close()方法用于关闭流。 - OutputStream的write()方法用于写入单个字节,flush()方法刷新...
`read()`方法用于读取字节,`close()`关闭流,`available()`返回可读字节数,`skip()`跳过指定数量的字节,`mark()`和`reset()`用于流的标记和回溯。 - **OutputStream**的方法包括`write()`,`flush()`,`close()`...