Java-io小结_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java-io小结

Java-io小结

 2014/4/7 21:51:19  cainiaoyu  程序员俱乐部  我要评论(0)
  • 摘要:Java处理的数据流主要分为字节流和字符流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。字节流的抽象基类:InputStream,OutputStream。字符流的抽象基类:Reader,Writer。都是存放在java.io包中字符流:Reader与Writer1,FileReader:将一个文件按字符流的形式进行读取操作。方法只包含从Reader和InputStream中所申明的方法。FileWriter
  • 标签:Java
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对应
发表评论
用户名: 匿名