java----IO流

来源:互联网 发布:手机点烟软件 编辑:程序博客网 时间:2024/06/15 01:43


IO流(输入、输出流)
(一)“字节”的定义
字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。
(二)“字符”的定义
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。
(三)“字节”与“字符”
它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同:
①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。

1、字节流
 1)InputStream,OutputStream
    InputStream抽象了应用程序读取数据的方式
    OutputStream抽象了应用程序读出数据的方式
 2)EOF = End 读到-1就读到结尾
 3)输入流的基本方法
    int b = in.read();读取一个字节无符号填充到int的低八位,-1是EOF
    in.read(byte[] buf)读取数据填充到字节数组buf
    in.read(byte[] buf,int start,int size)
4)输出流的基本方法
    out.write(int b)只写出一个byte到流,b的低八位
    out.write(byte[] buf)将buf字节数组到写入到流
    out.write(byte[] buf,int start,int size)
5)FileInputStream--->InputStream的子类
          具体实现的在文件上读取数据,相当于一个文件是一个字节流
6)FileOutputstream--->实现了向文件中写byte数据的方法
           与RandomAccessFile的write方法类似
    FileOutputStream构造时默认创建
7)对‘流’功能的拓展。更加方便的读取int,long,字符的数据类型
    DataOutputStream:writeInt(),writeDouble(),writeUTF()
    DataInputStream
8)BufferedInputStream/BufferedOutputStream
           这两个流类为IO提供了带缓冲区操作,一般对文件的读写以及操作,都会加上缓冲,
       这种流模式提高的IO的性能
           性能比较:从应用程序中把输入放入文件,相当于把一缸水倒入另一缸中
    BufferedOutputStream--->write方法相当于一瓢一瓢放入桶中,再倒入到缸中,最为方便
    FileOutputStream--->write()相当于把水一滴一滴的转移
    DataOutputStream--->write.xxx()相当于提供一个水勺,一瓢一瓢的转移更为方便一些
               
2、字符流
1)认识文本和文本文件
  java的文本(char)是16为无符号整数,是字符的Unicode编码(双字节编码)
     文件是byte,byte,byte...的数据序列
     文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结构
2)字符流(Reader,writer)--->操作的是文本文件
      字符的处理,一次处理一个字符
      字符的底层仍然是基本的字节序列
  字符流的基本实现
  InputStreamReader--->完成byte流解析为char流,按照编码解析
  OutputStreamWriter--->提供char流到byte流,按照编码处理
 
  FileReader/FileWriter--->构造简单,主要针对文件操作       
  字符流的过滤器
  BufferedReader--->readLine一次读一行
  BufferedWriter/PrintWriter--->写一行
 
3、对象的序列化,反序列化
1)对象序列化,将Object转化为byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是过滤流--->writeObject
     反序列化流(ObjectInputStream)--->readObject
3)序列化接口(implements Serializable)
     对象必须实现序列化接口,才能进行序列化,否则将出现异常
     这个接口,没有任何方法,只是标准           
4)transient修饰的元素:有时候可以提高性能
     该元素不会被jvm默认的序列化,不代表不能被序列化,也可以自己完成序列化
     情况1:有些元素在网络传输时,不需要被序列化
     情况2:不想被默认虚拟化,想自己完成
     private void writeObject(java.io.ObjectOutputStream s)
          throws java.io.IOException
  private void readObject(java.io.ObjectInputStream s)
          throws java.io.IOException, ClassNotFoundException          
5)序列化中子类父类函数的调用
     对子类对象进行反序列化操作时,如果父类没有实现序列化接口,其父类的构造函数会被调用       
                  
           
   
   

0 0
原创粉丝点击