20180119:缓冲流、转换流、标准输入输出流

今天重点学习了解了缓冲流和转换流的内容,标准输入输出流并不复杂,较为容易理解

一、缓冲流

 缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,作用就是为了提高读写的效率,由于普通的输入流在读取文件时效率较低,建立自定义的缓冲区也造成了内存的浪费;同时,程序通过输出流向文件中写入内容时也有一定的局限性,缓冲流其实就是对他们进行再次包装(体现了装饰者设计模式),从而大大提高了读写的效率,增加了新的非常有用的方法。

JDK提供了四种缓冲流:

  BufferedInputStream:可以对任何InputStream流进行包装;

  BufferedOutputStream:可以对任何的OutputStream流进行包装

BufferedReader:可以对任何的Reader流进行包装(新增了readLine()方法用于读取一行字符串

BufferedWriter:可以对任何的Writer流进行包装(新增了newLine()方法用于写出一个行分隔符

  对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据写出。关闭缓冲流时,

会自动关闭缓冲流所包装的所有底层流。

1.1 BufferedInputStream(字节缓冲流)

package buffer;

import java.io.*;

public class BufferedInputStreamDemo {
	
	public static void main(String[] args) {
		
		File file = new File("e:"+File.separator+"test.txt");
		
		InputStream is = null;
		BufferedInputStream bis = null;
		
		try {
			is = new FileInputStream(file);
			bis = new BufferedInputStream(is);
			int data = 0;
			while((data=bis.read()) != -1){
				System.out.print((char)data);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

1.2 BufferedOutputStream(缓冲字节输出流)

package buffer;

import java.io.*;

public class BufferedOutputStreamDemo {
	
	public static void main(String[] args) {
		
		File file = new File("e:"+File.separator+"test.txt");
		
		OutputStream os = null;
		BufferedOutputStream bos = null;
		
		try {
			os = new FileOutputStream(file);
			bos = new BufferedOutputStream(os);
			
			bos.write("做人不可好勇斗狠,谦虚谨慎四平八稳!".getBytes());
			bos.flush(); //需要刷新缓冲区才能将内容写入到文件中
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
}
1.3 BufferedReader(缓冲字符输入流)
package buffer;

import java.io.*;

public class BufferedReaderDemo {
	
	public static void main(String[] args) {
		
		File file = new File("E:"+File.separator+"test.txt");
		
		Reader r = null;
		BufferedReader br = null;
		
		try {
			r = new FileReader(file);
			br = new BufferedReader(r);
			int row=0;
			//读取每一行的数据并加上行号
			String str = "";
			while((str=br.readLine()) != null){
				row++;
				System.out.println(row + ".\t" + str);
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				br.close();
				r.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		
	}
	
}
1.4 BufferedWriter(缓冲字符输出流)
package buffer;

import java.io.*;

public class BufferedWriterDemo {
	
	public static void main(String[] args) {
		
		File file = new File("d:"+File.separator+"test.txt");
		
		Writer w = null;
		BufferedWriter bw = null;
		
		try {
			
			w = new FileWriter(file);
			bw = new BufferedWriter(w);
			
			//对文件内容进行操作了
			bw.write("我是你爹");
			bw.newLine();
			bw.write("我是你爸爸");
			bw.newLine();
			bw.write("开心不?");
			bw.newLine();
			//上面仅仅是将内容写入缓冲区,还要刷新缓冲区将内容真正写入文件中
			bw.flush();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
}

二、转换流

IO包中实际上只有字节流,字符流是在字节流的基础上转换出来的,转换流用于字节流和字符流的转换。

JDK提供了两种转换流:

 1. InputStreamReader: 是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。

 InputStreamReader需要和InputStream”套接”,它可以将字节流中读入的字节解码成字符。即:InputStreanReader虽然是Reader的子类,但是它包装的是InputStream流对象。

 2. OutputStreamWriter:Writer的子类,将输出的字符流转变为字节流,即:将一个字符的输出对象变为字节流的输出对象。

 OutStreamWriter需要和OutputStream”套接”,它可以将要写入字节流的字符编码成字节。

三、转换步骤

1.写出程序: 程序—>字符数据(内存中的数据)-->转换流(OutputStreamReader,将输出的字符流变为字节流)-->字节流-->文件

2.读入程序:文件-->字节流—>InputStreamWriter(将输入的字节流转变为字符流)-->字符数据-->程序

 注:InputStreamReader可以代替Scanner类在控制台接收键盘输入。
 四、Properties

 Properties是HashTable的一个子类,主要用于读取java配置文件的信息,各种语言都有自己的配置的文件,这样做主要是为了方便用户,使得程序员能够脱离程序修改相应的变量值。

在java中的配置文件是.propertie的文件,格式为文本文件,文件的内容通常是"键 = 值"的形式,文本注释信息通常用"#"来进行注释。

 Properties的类继承如下:


它提供了几个主要的方法:

1.getProperty(String key):用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。

2.load(InputStream is): 从输入流中读取属性列表(键值对),通过对指定的文件进行装载来获取该文件中所有的键值对,以供getProperty(String key)来搜索

3.setProperty(String key,String value):调用HashTable的方法put,调用此方法来设置键值对

4.store(OutputStream os,String comments):以适合使用load方法加载到Properties表中的格式,将此Properties表中的属性列表(键和元素对)写入到指定的文件中去

5.clear(): 清除所有的键值对,该方法在基类中提供。

举一个存储属性文件并读取的例子:

属性文件的创建并存储在磁盘上:

package properties;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

public class PropertiesStore {
	
	//利用Properties属性集合创建属性文件,属性文件可以是.properties或者是.xml文件
	public static void main(String[] args) {
		
		Properties pro = new Properties();
		//设置属性值
		pro.setProperty("name","Tom");
		pro.setProperty("sex", "male");
		pro.setProperty("age","three");
		//写入到磁盘文件中
		OutputStream os = null;
		try {
			os = new FileOutputStream("E:"+File.separator+"dnf.properties");
			//向文件中写入内容并添加注释
			pro.store(os, "this is a boys");
			System.out.println("创建属性文件成功了!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
}

 读取 的属性文件如下:

读取该磁盘文件,并通过key值得到value值:

package properties;

import java.io.*;
import java.util.Properties;

public class PropertiesLoad {
	
	public static void main(String[] args) {
		Properties pro = new Properties();
		
		InputStream is = null;
		try {
			is = new FileInputStream("E:"+File.separator+"dnf.properties");
			pro.load(is);
			System.out.println(pro.getProperty("name"));
			System.out.println(pro.getProperty("age"));
			System.out.println(pro.getProperty("sex"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值