您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第三季学习笔记-IO之字符流
发布时间:2017-08-10 14:59:58编辑:雪饮阅读()
字符输出流
public abstract class Writer
extends Object
implements Appendable,Closeable,Flushable
写入字符流的抽象类。子类必须实现的方法仅有Write(char[],int,int)、flush()和close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其它功能。
与OutputStream一样,对文件的操作使用:
FileWrite类完成,此类的构造方法如下:
代码示例:
package com.vince.charstream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterDemo {
/*
* 字符输出流方式一:以字符数组方式输出
* */
public static void writer1(){
File f=new File("E:"+File.separator+"duminjie_love_gaojiupan"+File.separator+"BaiduNetdiskDownload.txt");
try {
//构造一个字符输出流对象(true表示追加输出)
Writer out=new FileWriter(f,true);
String info="杜姐姐,十一长假我带你去亚特兰蒂斯玩玩哦!";
//转换为字符串数组并向文件中写入
out.write(info.toCharArray());
//也可以不用转换成字符数组,直接输出写入
out.write(info);
//关闭流,每个流用完要关闭哦,否则很影响性能的
out.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
writer1();
}
}
字符输入流
public abstract class Reader
extends Object
implements Readable,Closeable
用于读取字符流的抽象类。子类必须实现的方法只有read(char[],int,int)和close。
但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其它功能。
示例代码:因为使用了字节流读取了字符,而一个字符等于2个字节,所以如果读取过程中若读取到某个字符的一半字节,然后紧接着读取了下一个字符的一半字节,这样就会出现某些文字乱码的情况。
package com.vince.charstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class WriterDemo {
/*
* 字符输出流方式一:以字符数组方式输出
* */
public static void writer1(){
File f=new File("E:"+File.separator+"duminjie_love_gaojiupan"+File.separator+"BaiduNetdiskDownload.txt");
try {
InputStream in=new FileInputStream(f);
byte[] bytes=new byte[20];
int len=-1;
StringBuffer sb=new StringBuffer();
while((len=in.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
in.close();
System.out.println(sb);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
writer1();
}
}
如下,使用字符流来处理则没有该问题了:
package com.vince.charstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
public class WriterDemo {
public static void writer1(){
File f=new File("E:"+File.separator+"duminjie_love_gaojiupan"+File.separator+"BaiduNetdiskDownload.txt");
try {
Reader in=new FileReader(f);
char[] cs=new char[20];
int len=-1;
StringBuffer sb=new StringBuffer();
while((len=in.read(cs))!=-1){
sb.append(new String(cs,0,len));
}
in.close();
System.out.println(sb);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
writer1();
}
}
字节流与字符流的区别
在所有的流操作里。字节永远是最基础的。任何基于字节的操作都是正确的。无论你是文本文件还是二进制文件。
如果确认流里面只有可打印的字符,包括英文和各种国家的文字,也包括中文,那么可以考虑使用字符流。
由于编码不同,多字节的字符可能占用多个字节。比如GBK的汉字就占用2个字节,而UTF-8的汉字就占用3个字节。
所以,字符流是根据指定的编码,将一个或多个字节转化为java里面的unicode的字符,然后进行操作。
字符操作一般使用Writer,Reader等,字节操作一般都是InputStream,OutputStream以及各种包装类,比如BufferedInputStream和BufferedOutputStream等。
总结:如果你确认你要处理的流是可打印的字符,那么使用字符流会看上去简单一点。如果不确认,那么用字节流总是不会错的。
代码示例:通过字节流实现文件复制
package com.vince.charstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class WriterDemo {
public static void writer1(){
//源文件
File srcFile=new File("E:"+File.separator+"duminjie_love_gaojiupan"+File.separator+"BaiduNetdiskDownload.txt");
//目标文件
File destFile=new File("E:"+File.separator+"duminjie_love_gaojiupan"+File.separator+"Dujiejie.txt");
InputStream in=null;
OutputStream out=null;
//构造输入输出流
try{
in=new FileInputStream(srcFile);
out=new FileOutputStream(destFile);
byte[] bytes=new byte [512];//定义每次要读取的字节数组
int len=-1;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
}
}
catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
finally{
//流关闭
try {
if(in!=null)in.close();
if(out!=null)out.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void main(String[] args) {
writer1();
}
}
关键字词:javasse,io,字符流