码迷,mamicode.com
首页 > 编程语言 > 详细

Java IO之DataInputStream,ObjectInputStream,ByteArrayInputStream等

时间:2015-05-24 18:57:01      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:datainputstream   打印流   序列化   反序列化   

一、节点流

1、字节数组 字节 节点流

输入流 ByteArrayInputStream read(byte[] b, int off, int len)+close()
输出流 ByteArrayOutputStream write(byte[] b, int off, int len)+ toByteArray() 这是个新增方法,不要使用多态

package IOOthers;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 字节数组流  节点流
 * 数组的长度有限,数据量不会很大
 * 
 * 节点  数据源(文件,字节数组<可以理解为服务器内存>)
 * 文件内容不用太大
 * 1、文件-文件输入流-程序-字节数组输出流->字节数组
 * 2、字节数组-字节数组输入流-程序-文件输出流->文件
 */
public class Demo01 {
    public static void main(String[] args) {
        try {
            //程序-字节数组输出流->字节数组-字节数组输入流-程序
            read(write());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /**
     * 输入流的操作与文件输入流操作一致
     * 读取字节数组
     * @throws IOException 
     */
    public static void read(byte[] src) throws IOException
    {
        /*//数据源
        String msg  = "操作与文件输入流操作一致";
        byte[] src = msg.getBytes();*/
        //选择流  
        InputStream is = new BufferedInputStream(
                new ByteArrayInputStream(src)
                );      
        //操作
        byte[] flush = new byte[1024];
        int len = 0;
        while(-1!=(len = is.read(flush)))
        {
            System.out.print(new String(flush,0,len));
        }
        //释放资源
        is.close();
    }   

    //输出流与操作文件输出流 有些不同,有新增方法,不能使用多态
    public static byte[] write() throws IOException
    {
        //目的地
        byte[] dest;
        //选择流  不同点  新增方法不能使用多态
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //操作写出
        String msg = "操作与文件输入流操作一致";
        byte[] info = msg.getBytes();
        bos.write(info,0,info.length);

        //获取数据   数据量不会很大
        dest = bos.toByteArray();
        //释放资源
        bos.close();
        return dest;
    }   
}

运行结果:

操作与文件输入流操作一致
package IOOthers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


/**
 * 1、文件----------程序------------->字节数组
 *       文件输入流     字节数组输出流
 * 
 * 2、字节数组--------------程序----------->文件
 *           字节数组输入流       文件输出流
 */
public class Demo02 {
    public static void main(String[] args) throws IOException {
        byte[] data = getBytesFromFile("g:/writer.txt");
        System.out.println(new String(data));
        toFileFromByteArray(data,"g:/ouba.txt");        
    }

    //文件---程序-->字节数组
    public static  byte[] getBytesFromFile(String srcPath) throws IOException
    {
        //创建文件源
        File src = new File(srcPath);
        //创建字节数组目的地
        byte[] dest = null;

        //选择流
        //文件输入流
        InputStream is = new BufferedInputStream(new FileInputStream(src)); 
        //字节数组输出流不能使用多态
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        //操作 不断读取文件,写出到字节数组流中
        byte[] flush = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(flush)))
        {
            //写出到字节数组流中
            bos.write(flush,0,len);
        }
        bos.flush();

        //获取数据
        dest = bos.toByteArray();       
        bos.close();
        is.close();

        return dest;    
    }

    /**
     * 2、字节数组--程序-->文件
     * @throws IOException 
     */
    public static  void  toFileFromByteArray(byte[] src,String destPath) throws IOException
    {
        //1、创建源   src
        //目的地   dest
        File dest  = new File(destPath);        
        //2、选择流
        //字节数组输入流
        InputStream is = new BufferedInputStream(new ByteArrayInputStream(src));
        //文件输出流
        OutputStream os = new BufferedOutputStream(new FileOutputStream(dest));
        //3、操作  不断读取字节数组
        byte[] flush = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(flush)))
        {
            //写出到文件中
            os.write(flush,0,len);
        }
        os.flush(); 
        //4、释放资源
        /*os.close();
        is.close();*/
        FileUtil.close(os,is);
    }
}

运行结果:

每个人都有青春,
每个青春都有一个故事,
每个故事都有一个遗憾,
每个遗憾却都存在着他的美好。ouye

二、处理流

1、基本数据类型+String , 保留数据+基本类型

输入流:DataInputStream readXxx()
输出流:DataOutputStream writeXxx()

package IOOthers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 输出到文件中或者从文件中读取
 * 
 * 数据类型(基本数据类型+字符串)处理流
 * 1、输入流DataInputStream   readXxx()
 * 2、输出流DataOutputStream  writeXxx()
 * 新增方法不能使用多态
 * java.io.EOFException:没有读取到相关的内容
 */

@SuppressWarnings("all")
public class Demo03 {
    public static void main(String[] args) {
        try {
            write("g:/try/321.txt");
            read("g:/try/321.txt");
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
    /**
     * 基本数据类型+字符串  输出到文件
     * @param destPath
     * @throws IOException
     */
    public static void write(String destPath) throws IOException
    {
        double point = 2.5;
        long num = 100L;
        String str  = "数据类型";
        //创建源
        File dest = new File(destPath);
        //选择流 DataOutputStream
        DataOutputStream dos = new DataOutputStream(
                new BufferedOutputStream(new FileOutputStream(dest))
                );
        //操作  写出的顺序-->为读取做准备
        dos.writeDouble(point);
        dos.writeLong(num);
        dos.writeUTF(str);

        dos.flush();
        //释放资源
        dos.close();
    }

    /**
     * 从文本中读取 (字符串+基本数据类型)
     * @throws IOException 
     */
    public static void read(String destPath) throws IOException 
    {
        //创建源
        File src = new File(destPath);
        //输入流
        DataInputStream dis = new DataInputStream(
                new BufferedInputStream(new FileInputStream(src))
                );  

        //操作 读取的顺序与写出一致,必须先存在才能读取
        //顺序与写的时候不一致,可能存在顺序问题
        double point = dis.readDouble();
        long num = dis.readLong();
        String str = dis.readUTF();
        dis.close();
        System.out.println(point+"--"+num+"--"+str);
    }
}

运行结果:

2.5--100--数据类型
package IOOthers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
/**
 * 输出到字节数组中或者从字节数组中读取
 * 
 * @author liguodong
 */

@SuppressWarnings("all")
public class Demo04 {
    public static void main(String[] args) {
        try {
            byte[] data = write();
            read(data);
            System.out.println(data.length);        
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 数据+类型   输出到   字节数组中
     * @return
     * @throws IOException
     */
    public static byte[] write() throws IOException
    {
        //目标数组
        byte[] dest = null;

        double point = 2.5;
        long num = 100L;
        String str  = "数据类型";


        //选择流DataOutputStream   存在多态行为
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        DataOutputStream dos = new DataOutputStream(
                new BufferedOutputStream(bos));
        //操作 写出的顺序
        dos.writeDouble(point);
        dos.writeLong(num);
        dos.writeUTF(str);

        dos.flush();
        //获取数据
        dest =bos.toByteArray();
        //释放资源
        dos.close();        
        return dest;
    }

    /**
     * 从字节数组中读取数据+类型
     */
    public static void read(byte[] src) throws IOException 
    {   
        //输入流    没有所谓的多态行为
        DataInputStream dis = new DataInputStream(
                new BufferedInputStream(new ByteArrayInputStream(src)));

        //操作 读取的顺序与写出一致,必须先存在才能读取
        //顺序与写的时候不一致,可能存在顺序问题
        double point = dis.readDouble();
        long num = dis.readLong();
        String str = dis.readUTF();
        dis.close();
        System.out.println(point+"--"+num+"--"+str);
    }
}

运行结果:

2.5--100--数据类型
30

2、引用类型(对象),保留对象类型+数据

反序列化 — 输入流ObjectInputStream
序列化—输出流:ObjectOutputStream
注意:
先序列化,后反序列化,反序列化顺序必须与序列化顺序一致。
不是所有的对象都可以序列化,必须实现java.io.Serializable接口。
不是所有的属性都需要序列化,不需要使用序列化的属性使用transient

package IOOthers;

/**
 * 空接口只是一个标识,标识可以序列化。
 */
@SuppressWarnings("all")
public class Employee implements java.io.Serializable{
    //不需要序列化
    private transient String name;
    private double salary;
    public Employee(){
    }
    public Employee(String name, double salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}
package IOOthers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;

/**
 * 不是所有的`对象`都可以序列化,必须实现java.io.Serializable接口。
 * 不是所有的`属性`都需要序列化,不需要使用序列化的属性使用transient。
 * @author liguodong
 */

public class Demo05 {
    public static void main(String[] args) throws ClassNotFoundException {
        try {
            seri("g:/try/ser.txt");
            readseri("g:/try/ser.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //序列化
    public static void seri(String destPath) 
            throws FileNotFoundException, IOException
    {
        Employee emp = new Employee("Mark",1000000);
        int[] arr = {1,2,4,32};// 数组对象,它的内部就可以进行序列化。
        //创建源
        File dest = new File(destPath);
        //选择源DataOutputStream
        ObjectOutputStream dos = new ObjectOutputStream(
                    new BufferedOutputStream(new FileOutputStream(dest)));  
        //操作写出的顺序 为读写准备     
        dos.writeObject(emp);
        dos.writeObject(arr);
        //释放资源
        dos.close();

    }   

    //反序列化
    public static void readseri(String destPath) 
            throws FileNotFoundException, IOException, ClassNotFoundException
    {
        //1、创建院
        File src = new File(destPath);      
        //2、选择流
        ObjectInputStream dis = new ObjectInputStream(
                new BufferedInputStream(new FileInputStream(src)));
        //3、读取
        Object obj = dis.readObject();
        if(obj instanceof Employee)
        {
            Employee emp= (Employee)obj;
            System.out.println(emp.getName()+"-->"+emp.getSalary());
        }

        obj = dis.readObject();     
        int[] arr = (int [])obj;
        System.out.println(Arrays.toString(arr));
        //4、释放资源
        dis.close();
    }
}

运行结果:

null-->1000000.0
[1, 2, 4, 32]

3、关闭流两种方式

package IOOthers;

import java.io.Closeable;
import java.io.IOException;

@SuppressWarnings("all")
public class FileUtil {
    //工具类关闭流
    //多态方式
    //可变参数:...  <只能放在形参最后一个位置>   处理方式与数组一致  
    public static void close(Closeable ... io)
    {
        for(Closeable temp:io)
        {
            try {
                if(null!=temp)
                {
                    temp.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 泛型方法  和上一种一样的效果 
     */ 
    public static <T extends Closeable> void cloaseAll(T ... io)
    {
        for(Closeable temp:io)
        {
            try {
                if(null!=temp)
                {
                    temp.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }   
}

4、打印流

package IOOthers;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
/**
 * PrintStream  打印流 -->处理流
 */

public class Demo06 {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("test");
        PrintStream ps = System.out;
        ps.println(false);

        //输出到文件
        File src = new File("g:/try/test.txt");
        //false覆盖  true追加
        ps = new PrintStream(
                new BufferedOutputStream(new FileOutputStream(src,true)));      
        ps.println("io is so easy2fdsf13");
        ps.close();      
    }
}

运行结果:

test
false

package IOOthers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

/**
 *三个常量
 *1、System.in   输入流  键盘输入
 *2、System.out  输出流  标准输出
 *3、System.err  
 *  ==>重定向
 *  setIn()
 *  setOut()
 *  setErr()
 *  static FileDescriptor in  输入
 *  static FileDescriptor out  输出
 */
@SuppressWarnings("all")
public class Demo07 {
    public static void main(String[] args) throws FileNotFoundException {
        test1();
        System.out.println("=====@@@=====");
        test2();
        System.out.println("=====@@@=====");        
        test3();

    }

    public static void test1()
    {
        System.out.println("test");
        System.err.println("err");
    }

    //不再使用控制台输入,而是从文件中获取
    public static void test2() throws FileNotFoundException
    {
        InputStream is = System.in;//键盘输入
        is = new BufferedInputStream(new FileInputStream("g:/try/test.txt"));
        Scanner sc = new Scanner(is);
        System.out.println("从文件中读取:");
        //System.out.println(sc.nextLine());//注意这只是读取了一行
        while(sc.hasNextLine())
        {
            System.out.println(sc.nextLine());
        }
    }

    public static void test3() throws FileNotFoundException
    {
        //重定向 到文件中 
        //PrintStream(OutputStream out, boolean autoFlush)  
        //创建新的打印流,后面一个形参,true表示自动flush到文件中,而不需要手动flush
        System.setOut(new PrintStream(new BufferedOutputStream(
                new FileOutputStream("g:/try/print.txt")),true));
        System.out.println("file--a");//控制台到文件
        System.out.println("file--test");
        //重定向回控制台  要加true  将流flush出去     FileDescriptor不能直接使用
        System.setOut(new PrintStream(new BufferedOutputStream(
                new FileOutputStream(FileDescriptor.out)),true));
        System.out.println("console--test");
    }
}

运行结果:

err
test
=====@@@=====
从文件中读取:
io is so easy2fdsf13
io is so easy2fdsf13
io is so easy2fdsf13
=====@@@=====
console--test

package IOOthers;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
 * 封装输入   类似于Scanner的操作
 */
public class Demo08 {
    public static void main(String[] args) throws IOException {
        InputStream is = System.in;//字节流
        //InputStreamReader 是字节流通向字符流的桥梁    转换流
        //字符流--转换流--字节流    使用了新增方法不能使用多态
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("请输入:");
        String msg = br.readLine();//处理一行
        System.out.println(msg);
    }
}

运行结果:

请输入:
123-->这是自己输入的
123-->这是打印到控制台的

**注:**Java IO流的设计采用的就是装饰设计模式。
装饰设计模式相关案例:
http://blog.csdn.net/scgaliguodong123_/article/details/44044135

Java IO之DataInputStream,ObjectInputStream,ByteArrayInputStream等

标签:datainputstream   打印流   序列化   反序列化   

原文地址:http://blog.csdn.net/scgaliguodong123_/article/details/45938555

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!