Java-io小结

Java处理的数据流主要分为字节流和字符流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。都是存放在java.io包中
字符流:
Reader与Writer
[img]插入图片[/img]

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

[img]插入图片[/img]

1,FileInputStream:把一个文件作为 InputStream ,实现对文件的读取操作
FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
与FileReader、FileWriter对应。
2,BufferedInputStream:另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
BufferedOutputStream :实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
与BufferedReader、BufferedWriter对应。
3, PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream:将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。
与PipedReader、PipedWriter对应
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值