黑马程序员—IO流(上)字符流、字节流

来源:互联网 发布:tweenmax.js 百叶窗 编辑:程序博客网 时间:2024/05/16 16:59

----------android培训、java培训、期待与您交流!----------

1.字符流和字节流体系



2.字符流和字节流的区别

二者仅仅是操作单位不一样。

InputStream和Reader是所有输入流的基类,OutStream和Writer是所有输出流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。

一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流


 字节流

字节流主要是操作byte(字节)的类型数据:

字节输出流:OutputStream

字节输入流:InputStream

 

字符流

Java中的字符是Unicode编码,是双字节的,1个字符 等于 2个字节;

使用字节来处理字符文本就不太方便了,此时可以考虑使用字符流;

字符流主要是操作char的类型数据:

字符输出流:Writer

字符输入流:Reader

 

 字节流和字符流的区别

 字节流和字符流在使用上的代码结构都是非常类似的,但是其内部本身也是有区别的,因为在进行字符流操作的时候会使用到缓冲区(内存中),而字节流操作的时候是不会使用到缓冲区的。

在输出的时候,OutputStream类即使最后没有关闭内容也可以输出。但是如果是Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区

3.流的一般操作规律

抓住4个明确:

1:明确源和目的。

        源:输入流。InputStream  Reader

        目的:输出流。OutputStream  Writer。

2:操作的数据是否是纯文本。

        是:字符流。

        不是:字节流。

 

3:当体系明确后,在明确要使用哪个具体的对象。

        通过设备来进行区分:

        源设备:内存,硬盘。键盘

        目的设备:内存,硬盘,控制台

4:是否需要而外功能,如缓冲区等

/*通过缓冲区复制一个.java文件。*/import java.io.*;class  CopyTextByBuf{public static void main(String[] args) {BufferedReader bufr = null;BufferedWriter bufw = null;try{bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));String line = null;while((line=bufr.readLine())!=null){bufw.write(line);bufw.newLine();bufw.flush();}}catch (IOException e){throw new RuntimeException("读写失败");}finally{try{if(bufr!=null)bufr.close();}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(bufw!=null)bufw.close();}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}

4.转换流:

字节流-->字符流转换:

OutputStreamWriter:把字节输出流对象转成字符输出流对象

InputStreamReader:把字节输入流对象转成字符输入流对象

FileWriterFileReader分别是OutputStreamWriterInputStreamReader的直接子类,而不是WriterReader的直接子类,区别于FileInputStream InputStream


class EncodeStream   {            public static void main(String[] args) throws IOException            {                               //writeText();                               readText();  // 用GBK编码,UTF—8解码,肯定会出现乱码          }                public static void readText()throws IOException            {                      InputStreamReader isr = new InputStreamReader(newFileInputStream("utf.txt"),"gbk");                          char[] buf = new char[10];                      int len = isr.read(buf);                          String str = new String(buf,0,len);                          System.out.println(str);                          isr.close();            }            public static void writeText()throws IOException            {                      OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("utf.txt"),"UTF-8");                          osw.write("你好");                          osw.close();            }       }

5.对象序列化

ObjectInputStreamObjectOutputStream

class ObjectStreamDemo {public static void main(String[] args) throws Exception{//writeObj();readObj();}public static void readObj()throws Exception{ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));Person p = (Person)ois.readObject();System.out.println(p);ois.close();}public static void writeObj()throws IOException{ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));oos.writeObject(new Person("lisi0",399,"kr"));oos.close();}}


在调用ObjectOutputStream的writeObject方法时,对象需要实现Serializable接口,把一个类或者对象保存到文件必须用ObjectOutStream,这个javaBean需要实现些约来则啵接口。意义:序列化到本地存储,持久化存储,File是文件文件之间互写,ObjectOutputStream是对象和文件之间互写。