Java处理的数据流主要分为字节流和字符流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。都是存放在java.io包中
字符流:
Reader与Writer
1,FileReader:将一个文件按字符流的形式进行读取操作。方法只包含从Reader和InputStream中所申明的方法。
FileWriter:产生一个输出流,向文件输出数据。方法只包含从Writer和OutputStream中所申明的方法。
code:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public
class Test{
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("test.txt");
fw = new FileWriter("test1.txt");
//fw = new FileWriter("test1.txt", true);在文件末尾以添加的形式写字符
char buf[] = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1){//最后一个返回-1
fw.write(ch);//读取一个字符
fw.flush();//刷新流的缓冲
}
while ((ch=fr.read(buf))!=-1) {//返回每次读取的长度,没读取到返回-1
fw.write(buf, 0, ch);//读取多个字符存入buf中
fw.flush();
}
} catch (FileNotFoundException e) {
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(fr!=null)//必须对流进行判断,否则,有可能产生空指针
异常
fr.close();//关闭流前会刷新流的缓冲
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
2,BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取.(可以设置缓冲区大小)其实是Reader的一个装饰类,
构造函数的参数为所有Reader的子类。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入.(可以设置缓冲区大小)其实是Writer的一个装饰类,构造函数的参数为所有Writer的子类。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
br = new BufferedReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
BufferedReader的子类:LineNumberReader也是一个装饰类,额外提供了获取和设置行号的函数getLineNumber()和setLineNumber()。
code:
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
LineNumberReader lnr = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
lnr = new LineNumberReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
lnr.setLineNumber(100);//设置起始行号
while ((s=lnr.readLine())!=null) {//bufferedReader提供一个读取一行的方法
s=lnr.getLineNumber()+":"+s;
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(lnr!=null)
lnr.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
} 4,InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的
编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。(可以设置编码方式UTF-8,GBK)
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test{
public static void main(String[] args) {
BufferedReader br = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
isr = new InputStreamReader(System.in);//
system.in返回的是字节流。将字节流转成字符流来使用reader中的特有方法
br = new BufferedReader(isr);
osw = new OutputStreamWriter(System.out);//system.out返回的也是字节流。将字节流转成字符流来使用Writer中的特有方法
bw = new BufferedWriter(osw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
5,PipedReader:实现了 pipe 的概念,主要在
线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
PipedWriter:实现了 pipe 的概念,主要
在线程中使用。管道输出流是指一个通讯管道的接收端。
code:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
class read implements
Runnable{
private PipedReader pr;
public read(PipedReader pr) {
this.pr = pr;
}
public void run() {
try {
char []buf = new char[1024];
pr.read(buf);
System.out.println(buf);
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class write implements Runnable{
private PipedWriter pw;
public write(PipedWriter pw) {
this.pw = pw;
}
public void run() {
try {
pw.write("这是什么情况!");
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Test{
public static void main(String[] args) {
PipedReader pr = new PipedReader();
PipedWriter pw = new PipedWriter();
try {
pr.connect(pw);
} catch (IOException e) {
throw new RuntimeException("连接失败!");
}
new Thread(new read(pr)).start();
new Thread(new write(pw)).start();
}
}
【结果】
这是什么情况!
6,CharArrayReader:实现一个可用作字符输入流的字符缓冲区。(可以不需要close关闭)
CharArrayWrite:实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。(用流的思想来操作数组)
StringReader:源为一个字符串的字符流。
StringWriter:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
字节流:
InputStream与OutputStream
1,FileInputStream:把一个文件作为 InputStream ,实现对文件的读取操作
FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
与FileReader、FileWriter对应。
2,BufferedInputStream:另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
BufferedOutputStream :实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
与BufferedReader、BufferedWriter对应。
3, PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream:将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。
与PipedReader、PipedWriter对应