package string.test; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.LineNumberReader; import java.io.Reader; /* * LineNumberReader * 跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。 */ public class LineNumberReaderDemo { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("demo.txt"); BufferedWriter bw = new BufferedWriter(fw); for (int i = 0; i < 100; i++) { bw.write("zhangsanailisi" + i); bw.newLine(); bw.flush(); } FileReader fr = new FileReader("demo.txt"); //java提供的 /* * LineNumberReader lbr = new LineNumberReader(fr); String line = null; * while ((line = lbr.readLine()) != null) { * * System.out.println(lbr.getLineNumber() + "." + line); } bw.close(); * lbr.close(); */ //自定义的MyLineNumberDemo MyLineNumberDemo mln = new MyLineNumberDemo(fr); String line = null; mln.setLineNumber(800); while ((line = mln.myReadLine()) != null) { System.out.println(mln.getLineNumber()+"." + line); } bw.close(); mln.myClose(); } } /* * 自定义的LineNumberReader * */ class MyLineNumberDemo { private Reader r; private int lineNumber = 0; public MyLineNumberDemo(Reader r) { this.r = r; } public String myReadLine() throws IOException { lineNumber++; StringBuilder sb = new StringBuilder(); int i = 0; while ((i = r.read()) != -1) { if (i == '\r') continue; if (i == '\n') return sb.toString(); sb.append((char) i); } if (sb.length() != 0) { return sb.toString(); } return null; } public void setLineNumber(int lineNumber) { this.lineNumber = lineNumber; } public int getLineNumber() { return lineNumber; } public void myClose() throws IOException { r.close(); } }