今天重点学习了解了缓冲流和转换流的内容,标准输入输出流并不复杂,较为容易理解
一、缓冲流
缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,作用就是为了提高读写的效率,由于普通的输入流在读取文件时效率较低,建立自定义的缓冲区也造成了内存的浪费;同时,程序通过输出流向文件中写入内容时也有一定的局限性,缓冲流其实就是对他们进行再次包装(体现了装饰者设计模式),从而大大提高了读写的效率,增加了新的非常有用的方法。
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();
}
}
}