声明:由于学习所用环境为JDK1.8,所有java代码均在JDK1.8环境中测试通过,如果环境发生变化,可能会有错误发生!
一.缓冲流
缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,还增加了一些新的方法
JDK提供四种缓冲流
BufferedInputStream 可以对任何的InputStream流进行包装
BufferedOutputStream 可以对任何的OutputStream流进行包装
BufferedReader 可以对任何的Reader流进行包装
新增了readLine()方法用于一次读取一行字符串
package buffer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class BufferedReaderDemo {
public static void main(String[] args) {
File f=new File("c:"+File.separator+"test.txt");
Reader r=null;
BufferedReader br=null;
try {
r=new FileReader(f);
br=new BufferedReader(r);
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
BufferedWriter 可以对任何的Writer流进行包装
新增了newLine()方法用于写出一个行分隔符
package buffer;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class BufferedWriterDemo {
public static void main(String[] args) {
File f=new File("c:"+File.separator+"test1.txt");
Writer w=null;
BufferedWriter bw=null;
try {
w=new FileWriter(f);
bw=new BufferedWriter(w);
bw.write("床前明月光");
bw.newLine();
bw.write("疑是地上霜");
bw.newLine();
bw.write("举头望明月");
bw.newLine();
bw.write("低头思故乡");
bw.flush();
System.out.println("写入成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出。
关闭缓冲流时,会自动关闭缓冲流所包装的所有底层流。
课堂练习:复制图片
package buffer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyImage {
public static void main(String[] args) {
File srcFile=new File("e:"+File.separator+"picture"+File.separator+"6.jpg");
File destFile=new File("c:"+File.separator+srcFile.getName());
InputStream input=null;
BufferedInputStream bis=null;
OutputStream output=null;
BufferedOutputStream bos=null;
try {
input=new FileInputStream(srcFile);
bis=new BufferedInputStream(input);
output=new FileOutputStream(destFile);
bos=new BufferedOutputStream(output);
int len=0;
while((len=bis.read())!=-1){
bos.write(len);
}
System.out.println("复制完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
二.转换流
1、在IO包中,实际上只有字节流,字符流是在字节流的基础上转换出来的。
转换流用于在字节流和字符流之间转换。
JDK提供了两种转换流
InputStreamReader:
是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。
InputStreamReader需要和InputStream“套接”,它可以将字节流中读入的字节解码成字符
OutputStreamWriter:
是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。
OutputStreamWriter需要和OutputStream“套接”,它可以将要写入字节流的字符编码成字节
2、转换步骤
package convert;
import java.io.*;
public class InputStreamReaderDemo {
public static void main(String[] args) {
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
System.out.println("请输入:");
try {
String content=br.readLine();
System.out.println("输入的内容是:"+content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package convert;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class OutputStreamWriterDemo {
public static void main(String[] args){
OutputStream out=null;
OutputStreamWriter osw=null;
BufferedWriter bw=null;
try {
out=new FileOutputStream("c:"+File.separator+"test.txt");
osw= new OutputStreamWriter(out);
bw=new BufferedWriter(osw);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
课堂练习:模拟记录用户登录日志(采用追加方式记录),从控制台接收用户输入的用户名和密码,在文件中记录用户名和密码以及登录时间, 格式如下: name=zhangsan,pwd=123456,时间=2014-06-05 18:22:33
package convert;
import java.io.*;
import java.util.Date;
import java.util.Properties;
import java.text.SimpleDateFormat;
public class Exercise {
public static void main(String[] args) {
Properties pro=new Properties();
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
OutputStream out=null;
OutputStreamWriter osw=null;
BufferedWriter bw=null;
try {
System.out.println("请输入用户名:");
pro.setProperty("name", br.readLine());
System.out.println("请输入密码:");
pro.setProperty("password", br.readLine());
out=new FileOutputStream("c:"+File.separator+"test.properties",true);
osw=new OutputStreamWriter(out);
bw=new BufferedWriter(osw);
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
pro.setProperty("time", sdf.format(date));
pro.store(out, "this is information");
System.out.println("写入成功!");
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三.标准输入、输出流
1. System.in 标准输入流
2. System.out标准输出流
3. System.err“标准”错误输出流
四.扩展(Properties类--Hashtable的子类)
一般用于配置属性文件
package properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesLoad {
public static void main(String[] args) {
Properties pro=new Properties();
InputStream input=null;
try {
input=new FileInputStream("c:"+File.separator+"test1.txt");
pro.load(input);
System.out.println(pro.getProperty("name"));
System.out.println(pro.getProperty("sex"));
System.out.println(pro.getProperty("hobby"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
package properties;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;
public class PropertityStore {
public static void main(String[] args) {
Properties pro=new Properties();
pro.setProperty("name", "lily");
pro.setProperty("sex", "female");
pro.setProperty("hobby", "code");
OutputStream out=null;
try {
out=new FileOutputStream("c:"+File.separator+"test1.txt");
pro.store(out, "this is information");
System.out.println("属性文件写入成功!");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}