您的位置:首页 > 编程语言 > Java开发

java自学之路-----字符流 字节流 缓冲流 转换流

2014-05-17 21:51 281 查看

输入输出{

数据的输入输出时针对内存而言外设----->内存:输入流,进行读的行为内存----->外设:输出流,进行写的行为}

字符流{

定义:字节流读取文字字节数据后,不直接进行操作,而是先查询指定的编码表获取对应文字,再对这个文字进行操作:字符流  =   字节流  +  编码表对象类:Reader WriterFileWriter{用法:创建一个文件流输出对象,构造方法要明确数据路径以及文件名注意:如果该文件存在则覆盖,如果不存在,则进行创建常用方法{void write(“ ”)接收字符串数据写入缓冲区中void flush( )进行刷新,将缓冲区数据写入目的地中void close( )关闭该文件流,在关闭之前会自动调用一次刷新方法。如果关闭流之后对该再进行操作就会抛出异常}FileReader{用法:创建一个文件流输入对象,要明确被读取的文件目标常用方法{int read( )从文件读取一个字符,并返回该字符的ASCIIint read(数组引用) 将读到的数据存入该数组,并返回读取的字符个数}}三个小练习{
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
//创建流对象
FileWriter fw = new FileWriter("f:\\ab.txt");
//对该文件进行写操作
fw.write("gsgsdfhdsfh"+System.getProperty("line.separator")+"sdfsdf");
//关闭该流
fw.close();
}
}
public class FileReaderDemo {private static final int BUFF = 1024;public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//创建一个输入流对象,明确源FileReader fr = new FileReader("f:\\ab.txt");//对该文件进行写的操作//	利用循环。将该文件所有数据读取,//一个一个读取//						int ch = 0;//						while((ch=fr.read()) != -1){//							System.out.print((char)ch);//						}//按数组读取char[] buf = new char[BUFF];int len = 0;while((len=fr.read(buf)) != -1){System.out.print(new String(buf, 0, len));}//关闭该输入流fr.close();}}
package io.test;public class CopyFileDemo {private static final int BUFF = 1024;public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//创建一个输入文件流和一个输出文件流FileReader fr = new FileReader("f:\\ab.txt");FileWriter fw = new FileWriter("f:\\ab_copy.txt");//利用循环对该文件进行读,在写到另一个文件char[] buf = new char[BUFF];int len = 0;while((len=fr.read(buf)) != -1){fw.write(new String(buf, 0, len));}fr.close();fw.close();}}
}缓冲流{BufferedWriter{作用:创建缓冲区对象并与被缓冲的流对象相关联,以提高写入效率原理:先将数据转入缓冲区,再一起将其转入目的地常用方法{void write( )将数据写入缓冲区中void flush( )将缓冲区数据写入关联的文件void close( )关闭缓冲区,同时将关联的流一并关闭void newLine( )写入一个行分隔符(即换行)}}BufferedReader{作用:用作读文件的缓冲区常用方法:string readLine( )读取文件的行,补包含换行符(即读到换行符停止)}练习{//利用缓冲流的新方法readLineString line = null;while((line=br.readLine()) != null){bw.write(line);bw.newLine();}//自定义一个缓冲流public class MyBufferedReader {private Reader r = null;private char[] buff = new char[1024];private int count = 0;privatb7bde int pos = 0;public MyBufferedReader(Reader r){this.r = r;}public int myRead() throws IOException{if(count == 0){count = r.read(buff);pos = 0;}if(count == -1)return -1;count--;return buff[pos++];}public String myReadLine() throws IOException{StringBuffer sb = new StringBuffer();int ch = 0;while((ch=myRead()) != -1){if(ch == '\r')continue;if(ch == '\n')return sb.toString();sb.append((char)ch);}if(sb.length() != 0)return sb.toString();return null;}}}}}

字节流{

定义;基本操作思想与字符流相同,只不过单元不同对象类:InputStream OutputStream(write,直接把数据写入目的地,不需要flush)FileInputStream 有一个独特的方法 int available()返回该输入文件流绑定的文件的大小}

转换流{

InputStreamReader 将字节流转换为字符流,以便使用字符流的方法,需要将字节流对象作为构造参数传入OutputStreamWriter 将字符流转换回字节流,需要将字节流对象作为构造参数传入练习//将键盘上输入的信息,在控制台输出public class KeyboardInputDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubInputStream in = System.in;//将字节流转换为字符流来使用InputStreamReader isr = new InputStreamReader(in);//为了高效加入缓冲流BufferedReader br = new BufferedReader(isr);OutputStream out = System.out;//为了将接受到的字符流输出到控制台,就必须转换成字节流OutputStreamWriter osw = new OutputStreamWriter(out);//同样,为了高效,加入缓冲流BufferedWriter bw = new BufferedWriter(osw);String line = null;line = br.readLine();bw.write(line);bw.flush();}}}

总结{

1.明确源和目的源: InputStreamReader目的: OutputStreamWriter2.明确数据类型源:是文本数据: InputStream不是 Reader目的:是文本数据:OutputStream 不是Writer3.明确具体设备源: 硬盘:  File类型的流      键盘: System.in 内存: 数组   网络:Socket流目的: 硬盘:  File类型的流      键盘: System.in 内存: 数组   网络:Socket流4.明确是否需要其他额外功能需要高效: 缓冲流BufferedReaderBufferedWriter需要转换: 转换流InputStreamReaderOutputSteamWriterFileWriter 其实就是转换流制定了本机默认码表的体现,而且这个转换流的子类对象可以方便操作文本文件即:文件字符流 =文件字节流 +转换流 + 默认编码表注意{转换流在源或目的对应的设备是字节流的,但是操作的是文本数据的时候使用只有转换流能指定编码表(InputstreamReader OutputStreamWriter)}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: