LineNumberReader
LineNumberReader继承自BufferedReader,并且增加了下面两个功能:
- 获取行号:getLineNumber()
- 设置行号:setLineNumber()
默认情况下,线路编号从0开始。随着数据的读取,每个line terminator的数字递增,可以通过呼叫setLineNumber(int)进行更改。 但是请注意, setLineNumber(int)实际上并不改变流中的当前位置; 它只会更改getLineNumber()将返回的值 。
API :
案例:
文件;test.txt
代码
import java.io.*;
public class test02 {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader("test.txt");
LineNumberReader reader = new LineNumberReader(fr);
String line;
try {
while ((line = reader.readLine()) != null) {
//reader.setLineNumber(5);
System.out.println(reader.getLineNumber() + ":" + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
setLineNumber(int lineNumber) : 设置当前行号。
setLineNumber()能改变行号,却不能改变读的位置。
skip()方法 跳过字符
InputStream 就有此方法
参数 :
- n - 要跳过的字符数
结果 :
- 实际跳过的字符数
异常 :
-
IOException - 如果发生I / O错误
-
IllegalArgumentException - 如果 n为负数
案例:
package com.cy.NIO;
import java.io.*;
public class test02 {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader("test.txt");
LineNumberReader reader = new LineNumberReader(fr);
String line;
try {
while ((line = reader.readLine()) != null) {
System.out.println(reader.getLineNumber() + ":" + line);
reader.skip(15);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
另:
test02.txt
import java.io.*;
public class test02 {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader("test02.txt");
LineNumberReader reader = new LineNumberReader(fr);
int i;
try {
while ((i= reader.read()) != -1) {
reader.skip(1);
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
StringReader
StringReader和StringWriter使用的场景有限,将字符串当做流输出最常见的场景是:获取freemarker或者velocity模板的数据,并当做字符串返回给前端操作。
import java.io.StringReader;
import java.io.StringWriter;
public class Test01 {
public static void main(String[] args) {
String str = "待到秋来九月八,我花开后百花杀!!!";
try {
StringReader sr = new StringReader(str);
StringWriter sw = new StringWriter();
int c = -1;
while ((c = sr.read()) != -1) {
sw.write(c);
}
sw.close(); // 空方法
System.out.println(sw.getBuffer().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.*;
public class Test01 {
public static void main(String[] args) {
String str = "待到秋来九月八,我花开后百花杀。\n" +
"冲天香阵透长安,满城尽带黄金甲。";
BufferedReader br = null;
BufferedWriter bw = null;
try {
StringReader stringReader = new StringReader(str);
br = new BufferedReader(stringReader);
bw = new BufferedWriter(new FileWriter("1.txt"));
String data;
while((data = br.readLine()) != null){
bw.write(data);//data中不包含换行符
bw.newLine();//提供换行的操作
}
} catch (IOException exception) {
exception.printStackTrace();
} finally {
//关闭资源
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
StringReader和StringWriter是Reader和Writer的装饰类,StringReader底层使用String类型的变量来存储读取的内容,StringWriter底层使用StringBuffer buf来接收数据。StringWriter写入的数据只是存在于缓存中,并不会写入实质的存储介质之中。