一、LineNumberReader:跟踪行号的缓冲字符输入流
public int getLineNumber():获取行号
public void setLineNumber(int lineNumber):设置起始行号
String readLine():读取一行
package com.edu.linenumerreader;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Demo {
public static void main(String[] args) throws IOException {
//创建对象LineNumberReader(Reader in)
//LineNumberReader lnr = new LineNumberReader(new FileReader("test.txt"));
//创建对象并设置缓冲区大小LineNumberReader(Reader in, int sz)
LineNumberReader lnr = new LineNumberReader(new FileReader("test.txt"),1024);
//public void setLineNumber(int lineNumber):设置起始行号
lnr.setLineNumber(20);
//遍历
String line;
while ((line=lnr.readLine())!=null) {//读物每行数据
System.out.println(lnr.getLineNumber()+":"+line);//输出行号和数据
}
//关闭流
lnr.close();
}
}
21:#Tue May 09 16:45:21 CST 2017
22:zhangsan=20
23:lisi=100
24:wangwu=80
二、操作基本数据类型的流
可以操作基本类型的流对象。
DataInputStream:读数据
DataOutputStream:写数据
注意: 读写顺序必须一致,否则数据有问题。
package com.edu.data;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataInputStreamDemo {
public static void main(String[] args) throws IOException {
//写数据
DataOutputStream dos = new DataOutputStream(new FileOutputStream("fos.txt"));
dos.write('h');
dos.writeInt(20);
dos.writeFloat(3.34f);
dos.writeChar('f');
//读数据
DataInputStream dis = new DataInputStream(new FileInputStream("fos.txt"));
System.out.println(dis.read());
System.out.println(dis.readInt());
System.out.println(dis.readFloat());
System.out.println(dis.readChar());
dos.close();
dis.close();
}
}
三、内存操作流:解决临时数据存储的问题。
操作字节数组
ByteArrayInputStream
ByteArrayOutputStream
byte[] toByteArray() 将之前写入内存的流转换成字节数组
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter
package com.edu_01;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ByteArrayInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建给内存写数据的对象
ByteArrayOutputStream byos = new ByteArrayOutputStream();
//写数据:write(byte[] b, int off, int len)
byos.write("hello".getBytes());
//将数据转换成字节数组
byte[] bys = byos.toByteArray();
//创建从内存中读数据的对象:ByteArrayInputStream(byte[] buf)
//由于写入数据的时候构造方法需要的参数是字节数组。所以要是用toByteArray()进行转换
ByteArrayInputStream bais = new ByteArrayInputStream(bys);
//读数据
int i;
while ((i=bais.read())!=-1) {
System.out.println((char)i);
}
byos.close();
bais.close();
}
}
四、打印流
1、分类
字节打印流:PrintStream
字符打印流:PrintWriter
2、特点
(1)只能操作目的地,不能操作数据源
(2)可以操作任意类型的数据
(3)如果启动了自动刷新,能够自动刷新
(4)可以操作文件的流
直接操作文件的流指的是其构造方法同时又File和String类型的参数
3、如何实现自动刷新
(1)使用用自动刷新的构造方法
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
(2)当启用类自动刷新的构造方法后,只有在调用println()printf(),format()这些方法的时候才能实现自动刷新,其中使用println方法不仅可以实现自动刷新,还可以实现自动换行
package com.edu.printwriter;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
public class CopyDemo {
public static void main(String[] args) throws IOException {
//创建目的地和数据源
BufferedReader br = new BufferedReader(new FileReader("CopyDemo.java"));
//使用能够实现自动刷新的构造方法PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);
PrintWriter pw = new PrintWriter(new FileOutputStream("Copy.java"), true);
//调用方法读取并复制数据
String line;
while ((line=br.readLine())!=null) {
pw.println(line);//调用println方法实现自动刷新
}
//关流
br.close();
pw.close();
}
}