黑马程序员--IO流(1)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

IO流(1)

 

IO的体系:

字节流两个基类:
InputStream(字节输入流)  OutputStream(字节输出流)

字符流两个基类:
Reader(字符输入流) Writer(字符输出流)

---------------------------------------------------------------------------------

 

学习io流体系:看顶层(父类共性功能),用底层(子类具体对象)。

 

 

该体系的一个好处就是:
每个子类的后缀名都是所属体系的父类的名称,很容易区分所属的体系。
而且每一个子类前缀名都是该子类对象的功能体现。
这样我们在使用io体系中的对象时,就非常容易查找了。

 

 

字符流的由来:

以前处理数据都是字节数据,使用字节流技术就可以完成了。

因为后期编码表的不断出现,识别某一文字的码表不唯一。比如中文,GBK,unicode都可以识别。
就出出现了编码问题。

中文字节数据 gbk --> 流处理--->gbk解析可以了。

后期:容器出现这样的问题:
中文字节数据gbk --> 流处理 unicode来处理-->数据错误。

为了处理文字数据,就需要通过 字节流技术+编码表 相结合来完成。注意:只有文字是这样的,因为文字涉及编码问题。

虽然字节流+编码表可以解决文字数据处理问题,但是较为麻烦。
为了便于使用,将字节流和编码表进行了封装,就出现了便于文字操作的流技术:字符流。
其实字符流就是:字节流+编码表

 

字符流演示

FileWriter

package cn.itcast.io.p1.filewriter.demo;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		/*
		 * IO异常的处理规范。 创建流对象。 在try外创建流对象的引用。 在try内对流对象进行初始化。
		 */
		FileWriter fw = null;
		try {

			fw = new FileWriter("k:\\demo3.txt");

			fw.write("abcde");

			fw.flush();

		} catch (IOException e) {

			System.out.println(e.toString());
		} finally {

			if (fw != null)
				try {
					fw.close();
				} catch (IOException e) {

					// 相关的代码处理。比如说,将关闭失败的信息记录到日志文件中。
					throw new RuntimeException("关闭失败");

				}
		}
	}

}


 

FileReader演示

package cn.itcast.io.p2.filereader.demo;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {

		/*
		 * 使用FileReader在构造时明确被读取的文件。
		 * 通过FileReader和指定的文件相关联。
		 */
		FileReader fr = new FileReader("tempfile\\demo.txt");
		
		/*
		 * 调用字符读取流对象的read方法。对关联的文件进行读取。 
		 * read():一次读取一个字符。并返回该字符的对应的数字。
		 * 读取到什么字符,就返回什么字符,读到结尾就返回-1.用-1来标示结束了。
		 * 
		 */

		
		//代码使用循环解决就哦了。
		int ch = 0;
		while((ch=fr.read())!=-1){
			System.out.println((char)ch);
		}
		
		
		//关闭资源。
		fr.close();
		
	}

}


 

为了提高字符流的读写效率出现了两个类 字符流的缓冲区。

BufferedReader
BufferedWriter

缓冲区给给流的操作动作(读写)提高效率.所以缓冲区的对象建立必须要有流

package cn.itcast.io.p4.charbuffer.read;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {

		/*
		 * 演示BufferedReader 
		 * 
		 * 1,先有字符读取流。
		 * 2,该类有一个特有方法。readLine().一次读一行。 
		 */
		//创建读取流对象和文件相关联。 
		FileReader fr = new FileReader("tempfile\\buf.txt");
		//创建读取缓冲区对象和流对象关联,对其进行高效操作。
		BufferedReader bufr = new BufferedReader(fr);
		

		
		String line = null;
		
		while((line=bufr.readLine())!=null){
			System.out.print(line);
		}
		
		bufr.close();
	}

}


 

bufferdreader与bufferedwriter用法相同。

 

练习一下复制文件:

package cn.itcast.io.p3.test;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyTextTest2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		/*
		 * 复制方式二:
		 * 使用缓冲区数组。
		 * 使用的就是可以操作数组的读写方法。
		 * 
		 * 
		 */
		//1,定义字符输入流和字符输出流的引用。 
		FileReader fr = null;
		FileWriter fw = null;
		
		try {
			//2,对流对象进行初始化。
			fr = new FileReader("tempfile\\demo.txt");
			fw = new FileWriter("tempfile\\copy_demo2.txt");
			
			//3,定义一个数组缓冲区。用于缓冲读取到的数据。 
			char[] buf = new char[1024];
			
			//4,读写操作。 
			int len = 0;
			while((len = fr.read(buf))!=-1){
				fw.write(buf,0,len);
			}
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}finally{
			
			if(fw!=null)
				try {
					fw.close();
				} catch (IOException e) {
					
					throw new RuntimeException("写入关闭失败");
				}
			
			if(fr!=null)
				try {
					fr.close();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
		}
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值