1.字符流专门处理字符数据,文本数据
|--writer字符输出流,从java程序中写一个文件到目的地
|--FileWriter
|--构造方法传递文件名 FileWriter fw = new FileWriter(String fileName)
|--write(字符,字符串,数组)写出的方法
|--flush()刷新流冲的数据,数据必走目的地
|--close()关闭流资源关闭之前刷新
public class FileWriterDemo{
public static void main(String[] args){
FileWriter fw = null;
FileWriter fw1 = null;
try{
fw = new FileWriter("d:\\demo.txt");
fw1 = new FileWriter("d:\\demo1.txt");
fw.Write("qqq");
fw.flush();
fw1.write("sss");
fw1.flsh();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw!=null){
fw.close();
}catch(IOException e){
e.printStackTrace();
}
}try{
if(fw1!=null){
fw1.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
|--Reater字符输入流,从一个数据源读取数据到java程序
|--FileReader
|--构造方法 FileReader fr = new FileReader(String fileName);
|--read() 读取单个字符返回int值
|--read(字符数组) 返回数字中有效字符个数
|--读取到文件的结尾返回-1
|--close() 关闭读取流
public class ReaderWriterDemo1{
public static void main(String[] args){
FileReader fr = null;
try{//读取单个的字符 int read()
//read()方法特点:执行一次,就读一个字符,自动向后读名,读到末尾返回-1
//既然每次读取都是用read方法,可以采用循环来读,循环的次数不知道的
//能不能控制循环 呢,我就知道末尾结果是-1
fr = new FileReader("");
int x = 0;
while((x = fr.read())!=-1){
syo((char)x);
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fr!=null);
fr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
//第二种读取方式 效率高
public class ReaderWriterDemo2{
public static void main(Stirng[] args){
FileReader fr = null;
try{
fr = new FileWriter("d:\\demo");
int x = 0;
char[] ch = new char[1024];
while((x = fr.read(ch))!=-1){
syso(new String(ch,0,x))
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fr.read()!=null)
fr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
2.字符流的缓冲对象
|--BufferedWriter 字符输出流缓冲对象 提高流的操作效率
|--构造方法 传递一个字符串输出流 BufferedWriter bfw = new BufferedWriter(Writer out)
|--自己的方法 newLine() 写一个换行 跨平台
import java.io.*;
public class BufferedWriterDemo{
public ststic void main(String[] args)throws IOException{
FileWriter fw = new FileWriter("");
BufferedWriter bfw = new BufferedWriter(fw);
bfw.write("abc");
bfw.newLine();
bfw.fluse();
bfw.close();
}
}
|--BufferedRriter 字符输入流的缓冲区对象 提高字符输入流的操作效率
|--构造方法 传递一个字符串输入流对象 BufferedReader bfr = new BufferedReader(Reader in);
|--自己的方法 readLine() 读取文本一行返回字符串,没有换行符号,在结尾返回null
import java.io.*;
public class BufferedReaderDemo{
public ststic void main(String[] args)throws IOException{
FileReader fr = new FileReader("d:\\demo");
BufferReader bfr = new BufferedReader(fr);
String line = null;
while((line = bfr.readLine())!=null){
syso(line);
}
bfr.close();
}
}
3.复制文本文件案例,并且处理异常 字符流只能处理文本文件
|--第一种方法,读一个写一个,效率较低,一般不用
import java.io.*;
public class Copy{
public ststic void main(String[] args)throws IOException{
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("d:\\demo.txt");
fw = new FileWriter("d:\\copydemo.txt");
int x = 0;
while((x = fr.read())!=-1){
fw.write(x);
fw.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(fr!=null)
fr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
|--第二种方法 一次读取一批用数组 常用
import java.io.*;
public class Copy{
public ststic void main(String[] args){
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("d:\\demo.txt");
fw = new FileWriter("d:\\copydemo.txt");
int length = 0;
char[] ch = new char[1024];
while((length = fr.read(ch))!=-1){
fw.write(ch,0,length);
fw.flush();
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(fr!=null)
fr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
|--第三种 利用字符流的缓冲区对象赋值文件 **** 效率高推荐使用
import java.io.*;
public class Copy{
public ststic void main(String[] args){
FileReader fr = null;
FileWriter fw = null;
BufferedReader bfr = null;
BufferedWriter bfw = null;
try{
fr = new FileReader("d:\\demo.txt");
fw = new FileWriter("d:\\democopy.txt");
bfr = new BufferedReader(fr);
bfw = new BufferedWriter(fw);
//读一行写一行 写换行
String line = null;
while((line = bfr.readLine())!=null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(bfr!=null)
bfr.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(bfw!=null)
bfw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
4.装饰设计模式
|--装饰类,增强原有对象的功能
//模拟一个readLine方法
//读取需要read类中的read()方法读取
import java.io.*;
public class MyReadLineDemo{
//定义Reader对象
private Reader r;
//构造方法,对Reader对象进行赋值操作传递的是Reader类型的子类对象
public MyReadLineDemo(Reader r){
this.r = r;
}
//开始模拟readLine()
public String myReadLine(){
//定义一个字符串缓冲区
StringBuilder sb = new StringBuilder();
int length = 0;
while((length = r.read())!= -1){
//读取后的字符直接赋值给了length
if(length == '\r')
continue;
if(length == '\n')
return sb.toString();
//如果两次if都不成立说明有效字符,存储到缓冲区
sb.append((char)legnth);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myClose()throw IOException{
r.close;
}
}
5.流的使用规律
|--IO流中的对象
Writer Reader InputStream OutputStream
FileWriter FileReader
FileInputStream FileOutputStream
BufferedWriter BufferedReader
BufferedInputStream BufferedOutputStream
InputStreamWriter OutputStreamReader
|--选择对象的时候,首先确定操作数据源是什么
|--文本 FileReader读取操作 BufferedReader一次读取一行
|--非文本 FileIntputStream 读取操作 BufferedInputStream 用数组效率高
|--是一个控制台或另一个主机 字节流InputStream 如果确定是文本信息,转换流InputStreamReader,转换成字符流,如果不能确定是不是文本信息不能使用转换流只能使用字节流
|--再次确定操作的数据目的是什么
|--文本 FileWriter 写出操作 BufferedWriter 写一行效率高
|--非文本 FileOutputStream写出操作 BufferedOutputStream 用数组提高效率
|-控制台或者另一台主机 字节流 OutputStream 文本信息用转换流OutputStreamWriter,字符字节,不确定为文本用字节流
|
|