黑马程序员——字节流和字符流

来源:互联网 发布:c语言swap是什么意思 编辑:程序博客网 时间:2024/04/29 23:36

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

java.io  通过数据流,序列化的文件系统提供系统输入和输出

按数据传输单位可以分为

字节流:以字节为单位传输的数据流,在字节流中输入输出数据主要使用OutputStream和InputStream完成

字符流:以字符为单位传输的数据流,在字符流中主要使用Writer类和Reader类完成

OutputStream,InputSteam,Reader,Writer,都是抽象类,一个字符占两个字节,字节流主要处理字节或二进制对象,字符流主要用来处理字符字符串。字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,对多国语言支持性比较好!

所有文件的储存都是以字节的形式储存在磁盘上的,字符流要先转变成字节,在储存到磁盘上。对于关于文字的用字符流比较好,其他的用字节流。

字节流可用于任何类型的对象,而字符流只能处理字符或者字符串。

字符流和字节流是通过,InputSteamReader,OutputStreamWriter来关联的

实际开发中出现的汉字问题实际上都是字节流和字符流之间转化不同意而造成的

文件的操作流程:

1.使用File类打开一个文件

2.通过自己饿流或字符流的子类,指定输出的位置

3.进行读写操作

4.关闭输入输出操作(io操作输出资源操作,一定要记得关闭)

io异常处理:

打开,读写和关闭都要进行异常处理。一般需要两个try{}catch{}块,在最后关闭处理的时候要先判断流是否为空

package test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class Test7 {public static void main(String[] args)throws IOException {//字节流文件写入操作FileOutputStream out = null;OutputStreamWriter writer = null;try {out = new FileOutputStream("OutputStream.txt");writer = new OutputStreamWriter(out);//字节流转换为字符流String s = "hello world 字节流";//字符writer.write(s);} catch (Exception e) {e.printStackTrace();}finally{try {if(writer!=null)writer.close();if(out!=null)out.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//字节流文件续写try {out = new FileOutputStream("OutputStream.txt",true);writer  = new OutputStreamWriter(out);//字节流转换为字符流String s2 = " 续写文件";//字符writer.write(s2);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(writer!=null)writer.close();if(out!=null)out.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//字节流文件读取操作FileInputStream in = null;InputStreamReader reader = null;try {in = new FileInputStream("OutputStream.txt");reader = new InputStreamReader(in);//字节流转换为字符流char[] buf = new char[1024];//大小为1024最String str="";while(reader.read(buf)!=-1){str = str+new String(buf);}System.out.println(str);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(reader!=null)reader.close();if(in!=null)in.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//字符流文件写入操作FileWriter fw = null;try {fw = new FileWriter("writer.txt");fw.write("hello world 字符流");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(fw != null)fw.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//字符流文件续写try {fw =  new FileWriter("writer.txt",true);fw.write(" 续写文件");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(fw != null)fw.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//字符流文件读取操作FileReader fr = null;try {fr = new FileReader("writer.txt");char[] buff = new char[1024];String stri = "";while (fr.read(buff)!=-1) {stri = stri+new String(buff);}System.out.println(stri);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(fr!=null)fr.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

修正:在上面字节流转换为字符流然后对文件进行操作的代码中,在最后关闭流的操作应该只关闭字符流就可以了,

OutputStreamWriter.close()会在内部调用OutputStream.close();

0 0
原创粉丝点击