IO流 InputStreamReader(),OutputStreamWriter() and FileReader,FileWriter() BufferedReader() BufferedWriter(): (2)
package listdamo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class iofiledamo2 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
//inputStreamReaderDemo();
//inputStreamReaderDemo2();
//outputStreamWriterDemo();
fileReaderFileWriterCopyDemo();
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
/*
* InputStreamReader(InputStream is):用默认的编码读取数据
* InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
* 一次读取一个字符
*/
public static void inputStreamReaderDemo() throws IOException {
// 创建对象
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"listdamo4.java"), "GBK");
// 读取数据
// 一次读取一个字符
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
// 释放资源
isr.close();
}
/*
* InputStreamReader的方法:
* int read():一次读取一个字符
* int read(char[] chs):一次读取一个字符数组
*/
public static void inputStreamReaderDemo2() throws IOException {
// 创建对象
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"listdamo4.java"));
// 读取数据
// 一次读取一个字符
char[] ch =new char[1024];
int len =0;
while ((len= isr.read(ch)) != -1) {
System.out.print(new String(ch,0,len));
}
// 释放资源
isr.close();
}
/*
* OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流
* OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
* 把字节流转换为字符流。
* 字符流 = 字节流 +编码表。
* OutputStreamWriter的方法:
* public void write(int c):写一个字符
* public void write(char[] cbuf):写一个字符数组
* public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
* public void write(String str):写一个字符串
* public void write(String str,int off,int len):写一个字符串的一部分
*
* 面试题:close()和flush()的区别?
* A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
* B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
*/
public static void outputStreamWriterDemo() throws IOException{
// 创建对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
"osw.txt"), "GBK");// 指定UTF-8
// 写数据
osw.write("u中国 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流");
// public void write(String str,int off,int len):写一个字符串的一部分
osw.write("我爱java", 2, 3);
// 刷新缓冲区
osw.flush();
// 释放资源
osw.close();
}
/*
* 由于我们常见的操作都是使用本地默认编码,所以,不用指定编码。
* 而转换流的名称有点长,所以,Java就提供了其子类供我们使用。
* OutputStreamWriter = FileOutputStream + 编码表(GBK)
* FileWriter = FileOutputStream + 编码表(GBK)
*
* InputStreamReader = FileInputStream + 编码表(GBK)
* FileReader = FileInputStream + 编码表(GBK)
*
/*
* 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
*
* 数据源:
* listdamo4.java-- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader
* 目的地:
* osw.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter
*/
public static void fileReaderFileWriterCopyDemo() throws IOException {
// 封装数据源
FileReader fr = new FileReader("listdamo4.java");
// 封装目的地
FileWriter fw = new FileWriter("osw1.txt");
// 一次一个字符
/*
* int ch=0; while((ch=fr.read())!=-1){ fw.write(ch);
*
* }
*/
// 一次一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
fw.flush();
}
// 释放资源
fw.close();
fr.close();
}
/*
* 字符缓冲流的特殊方法:
* BufferedWriter:
* public void newLine():根据系统来决定换行符
* BufferedReader:
* public String readLine():一次读取一行数据
* 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
*/
public static void bufferedReader() throws IOException{
//创建字符缓冲输入流对象
BufferedReader br =new BufferedReader(new FileReader("listdamo4.java"));
// 最终版代码
//方式1
/*String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}*/
//方式2
/*int ch=0;
while((ch=br.read())!=-1){
System.out.println((char)ch);
}*/
//方式3
char[] chs=new char[1024];
int len=0;
while((len=br.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
br.close();
}
public static void bufferedWriter() throws IOException{
// 创建字符缓冲输出流对象
BufferedWriter bw =new BufferedWriter(new FileWriter("bw2.txt"));
for(int x=0;x<=10;x++){
bw.write("hello wrold java "+x);
//bw.write("\r\n");
bw.newLine();
bw.flush();
}
bw.close();
}
/*
* 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
*
* 数据源:
* listdamo4.java -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
* 目的地:
* bw3.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
*/
public static void bufferedWriterAndBufferedReaderCopyFile() throws IOException{
// 封装数据源
BufferedReader br =new BufferedReader(new FileReader("listdamo4.java"));
// 封装目的地
BufferedWriter bw =new BufferedWriter(new FileWriter("bw3.txt"));
//方法一
// 两种方式其中的一种一次读写一个字符数组
/* char[]chs=new char[1024];
int len =0;
while((len=br.read(chs))!=-1){
bw.write(chs, 0, len);
bw.flush();
}*/
//方法二
String line =null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
// 释放资源
bw.close();
br.close();
}
// end class
}