java中的io流(输入输出流,序列化与反序列化,字节流 , 字符流,包装流,缓冲流)

四大抽象类( InputStream     OutputStream  Reader  Writer  
八大子类( FileInputStream,    FileOutStream,  FileReader, FileWriter
                      DataOutputStream ,  DataInputStream ObjectInputStream, ObjectOutputStream )
输入输出流:
     在程序的角度   读取文件 输入流
                             写数据到文件中 输出流

IO流按照方向 输入流  /   输出流
     输入流 
InputStream 抽象类 -》子类   FileInputStream,         Reader 抽象类
     输出流
           OutputStream  抽象类 -》子类   FileOutStream,           Writer  抽象类


按照操作的字节数: 字节流  字符流
     字节流 
InputStream 抽象类 -》子类   FileInputStream,  输入字节流   单个字节读取
OutputStream  抽象类 -》子类   File OutputStream   ,   输出字节流   单个字节写入
    
     字符流 :按照一个字符来操作的2个字节
      Reader 抽象类
                    子类 InputStreamReader ->子类 FileReader
      Writer  抽象类
                     子类 OutputStreamReader ->子类 FileWriter
eg:实现文件的拷贝
public static void main(String[] args) throws IOException {
                   File file = new File("E:\\培训\\java\\index.jsp");
                   File file2 = new File("E:\\培训\\java\\copy\\copy5.jsp");
                   FileReader reader=null;
                   FileWriter writer =null;
                   try {
                              reader =new FileReader(file);
                              writer=new FileWriter(file2);
                             int a=reader.read();
                             char array[]=new char [(int)file.length()];
                             reader.read(array);
                             writer.write(array);
                             writer.flush();// 必须写,不然只是拷贝到文件的缓冲区,并无真实内容
                   } catch (Exception e) {
                             e.printStackTrace();
                   }finally{
                             if (writer!=null) {
                                      writer.close();
                             }
                             if (reader!=null) {
                                      reader.close();
                             }
                   }
包装流:
1.DataOutputStream    / DataInputStream
      1. 与机器底层无关的输入,输出 包装流
可以适当方式将基本 Java 数据类型写入输出流中
     

eg:向文件中写入数据
public static void main(String[] args) throws IOException {
                   File file = new File("E:\\培训\\java\\tt.txt");
                   try {
                             FileOutputStream out = new FileOutputStream(file);
                             DataOutputStream dOut = new DataOutputStream(out);
                             dOut.writeInt(20);
                             dOut.writeDouble(3.14);
                             dOut.writeChar('x');
                             dOut.writeUTF("好好学习");
                             dOut.flush();
                             dOut.close();

                             FileInputStream in = new FileInputStream(file);
                             DataInputStream din = new DataInputStream(in);
                             int a = din.readInt();
                             double d = din.readDouble();
                             char c = din.readChar();
                             String s = din.readUTF();

                             //必须按照写入的数据类型顺序来读才不会出现乱码
                             System.out.println(a);
                             System.out.println(d);
                             System.out.println(c);
                             System.out.println(s);

                   } catch (FileNotFoundException e) {
                             e.printStackTrace();
                   }
          }



   
2.序列化与反序列化
   读写对象的 序列化 反序列化
ObjectInputStream 反序列化

ObjectOutputStream 序列化
    序列化 ->就是把对象写入到文件中去保存 

     反序列化->就是把文件中的对象读取到内存中去

java.io.Serializable 接口 可序化接口
一个对象要实现 序列化与反序列化这个对象的类就必须实现Serializable 接口
序列化只能对类的成员属性,不能对类的static成员进行
eg:将person对象写入到文件中,然后从文件中读取对象到内存中去
public static void main(String[] args) {
                   try {
                             Person p = new Person(1, "张三丰", "男");
                             ObjectOutputStream objOut = new ObjectOutputStream(
                                                new FileOutputStream(new File("E:\\培训\\java\\object.txt")));
                             objOut.writeObject(p);
                             objOut.flush();
                             objOut.close();
                   } catch (Exception e) {
                             e.printStackTrace();
                   }
                   try {
                             ObjectInputStream inObj = new ObjectInputStream(
                                                new FileInputStream(new File("E:\\培训\\java\\object.txt")));
                             Person person = (Person) inObj.readObject();
                             System.out.println(person);
                             System.out.println(person.num);//
                   } catch (Exception e) {
                             e.printStackTrace();
                   }

缓冲流:
BufferedReader 
  可以实现文件一行行的读写内容    
eg:实现拷贝文件的功能

package com.zt;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferReaderDemo {
    public static void main(String[] args) throws IOException {
        File file1 =new File("E:\\培训\\java\\index.jsp");
        File file2 =new File("E:\\培训\\java\\index7.jsp");
        FileReader reader;
        FileWriter writer;
        try {
            reader = new FileReader(file1);
            writer = new FileWriter(file2);
            BufferedReader breader =new BufferedReader(reader);
            BufferedWriter bwriter=new BufferedWriter(writer);
            String str =breader.readLine();
            while (str!=null) {
                bwriter.write(str);
                bwriter.newLine();
                str=breader.readLine();
            }
            bwriter.flush();
            bwriter.close();
            breader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

eg:实现控制台复制输出功能,可以代替Scanner工具类实现同样的接收控制台输入数据的功能
public static void main(String[] args) {
                   BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
                   try {
                             String string="";
                             while (!"exit".equals(string)) {
                                      string=in.readLine();
                                      System.out.println(string);
                             }
                   } catch (Exception e) {
                             e.printStackTrace();
                   }
          }

创建对象的方法;
1:new 
2:反序列化  类就必须实现serializable接口
          通过ObjectInputStrem 的readObject
eg:

public  class SerializableUtil {
          //序列化方法
          public  static boolean Serializable(Object obj,String path) {
                   File file=new File(path);
                   FileOutputStream out =null;
                   ObjectOutputStream objOut=null;
                   boolean result =true;
                   try {
                              out =new FileOutputStream(file);
                              objOut=new ObjectOutputStream(out);
                             objOut.writeObject(obj);
                             objOut.flush();
                             objOut.close();
                   } catch (Exception e) {
                             result=false;
                             e.printStackTrace();
                   }finally{
                   try {
                             if (out!=null) {
                                      out.close();
                             }
                   } catch (Exception e2) {
                             e2.printStackTrace();
                   }
                   }
                   return result;
          }

          //反序列化方法
          public  static Object reverSerializable(String path ) {
                   Object obj =null;
                   File file =new File(path);
                   FileInputStream in =null;
                   ObjectInputStream ojbin=null;
                   try {
                             in =new FileInputStream(file);
                              ojbin=new ObjectInputStream(in);
                              obj=ojbin.readObject();
                   } catch (Exception e) {
                             e.printStackTrace();
                   }finally{
                   try {
                             if (in!=null) {
                                      in.close();
                             }
                             if (ojbin!=null) {
                                      ojbin.close();
                             }
                   } catch (Exception e2) {
                             e2.printStackTrace();
                   }
                   }
                   return obj;
          }
          public static void main(String[] args) {
                   //序列化
                   Person p = new Person(1, "张三丰", "男"); //注:person类必须实现Serializable接口
                   boolean f =Serializable(p,"E:\\培训\\java\\object2.txt");
                   System.out.println(f);
                   //反序列化
                   Person p2  =        (Person) reverSerializable("E:\\培训\\java\\object2.txt");
                   System.err.println(p2);
          }
}

3:克隆 类就必须实现Cloneable接口
          通过类对象的clone()方法进行克隆
eg:
public class Person  implements Cloneable{...}//必须实现Cloneable接口
      public static void main(String[] args) {
                   Person p = new Person(1, "张三丰", "男");
                   Person p2=(Person) p.clone();
                   System.out.println(p2);
          }

4:反射
     Class.forName(“类路径”).newIntance();
必须确保类里面有默认的构造器
eg:
package com.zt;
public class Pig {...}
public static void main(String[] args) {
          try {
                   Pig p =(Pig) Class.forName("com.zt.Pig").newInstance();
                   p.name="呆呆";
                   p.sex="公";
                   System.out.println(p);
          } catch (Exception e) {
                   e.printStackTrace();
          }
}


流的使用步骤:
     1:创建流     
     2:使用流
     3:关闭流
eg:实现文件的输出

package com.zt;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) {
        File file =new File("E:\\培训\\java\\index.jsp");

        try {
            FileInputStream in =new FileInputStream(file);
            try {
                //第一种方式  会出现中文乱码问题
                /*    int n  = in.read();
            while (n!=-1) {
                char c= (char) n;
                System.out.print(c);
                n  = in.read();
            }*/
                //第二种方式
        byte[] bs =new byte[(int) file.length()];
            in.read(bs);
            String str =new  String(bs);
            System.out.println(str);


            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

eg:实现文件的拷贝

package com.zt;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopyDemo3 {

    public static boolean copy(File file, File file2) {
        boolean f = true;
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(file);
            byte[] bs = new byte[(int) file.length()];
            in.read(bs);
            out = new FileOutputStream(file2);
            out.write(bs);
        } catch (Exception e) {
            f = false;
            e.printStackTrace();
        } finally {
            try {
                // 先关闭out输入流
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return f;

    }

    public static void main(String[] args) {
        File file = new File("E:\\培训\\java\\index.jsp");
        File file2 = new File("E:\\培训\\java\\copy\\copy4.jsp");
        copy(file, file2);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值