java__io__序列流(合并MP3)和对象序列化

来源:互联网 发布:网络大电影众筹平台 编辑:程序博客网 时间:2024/05/17 15:05
package day22;/*字节流输入字节流:-----------| InputStream  所有输入字节流的基类  抽象类-----------------| FileInputStream 读取文件数据的输入字节流-----------------| BufferedInputStream  缓冲输入字节流       该类出现的目的是为了提高读取文件 数据的效率。 这个类其实只不过是在内部维护了一个8kb的字节数组而已。输出字节流:-----------| OutputStream 所有输出字节流的基类。  抽象类。----------------| FileOutputStream 向文件输出数据的输出字节流  ----------------| BufferedOutputStream 缓冲输出字节流   该类出现的目的也是为了提高向文件写数据的效率。 这个类的也只不过是在内部维护了一个8kb的字节数组而已。字符流 :  字符流 = 字节流  + 编码(解码)输入字符流:---------| Reader   所有输入字符流的基类。  抽象类。----------------| FileReader 读取文件数据的输入字符流。 ----------------| BufferedReader 缓冲输入字符流           该类出现的目的是为了提高读取文件数据的效率与拓展FileReader的(readLine)功能。  这个类的也只不过是在内部维护了一个8kb的字符数组而已。输出字符流:---------| Writer 所有输出字符流的基类。  抽象类----------------| FileWriter 向文件输出数据的输出字符流  ----------------| BufferedWriter 缓冲输出字符流        该类出现的目的是为了提高写文件数据的效率与拓展FileWriter的(newLine)功能. */
package cn.itcast.other;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.SequenceInputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.Vector;/*SequenceInputStream(序列流)需求:把a.txt与b.txt 文件的内容合并。 */public class Demo1 {    public static void main(String[] args) throws IOException {        merge3();    }    //把三个文件合并成一个文件    public static void merge3() throws IOException{        //找到目标文件        File file1 = new File("F:\\a.txt");        File file2 = new File("F:\\b.txt");        File file3 = new File("F:\\c.txt");        File file4 = new File("F:\\d.txt");        //建立对应 的输入输出流对象        FileOutputStream fileOutputStream = new FileOutputStream(file4);        FileInputStream fileInputStream1 = new FileInputStream(file1);        FileInputStream fileInputStream2 = new FileInputStream(file2);        FileInputStream fileInputStream3 = new FileInputStream(file3);        //创建序列流对象        Vector<FileInputStream> vector = new Vector<FileInputStream>();        vector.add(fileInputStream1);        vector.add(fileInputStream2);        vector.add(fileInputStream3);        Enumeration<FileInputStream> e = vector.elements();        SequenceInputStream sequenceInputStream = new SequenceInputStream(e);        //读取文件数据        byte[] buf = new byte[1024];        int length = 0;         while((length = sequenceInputStream.read(buf))!=-1){            fileOutputStream.write(buf,0,length);        }        //关闭资源        sequenceInputStream.close();        fileOutputStream.close();    }//  使用SequenceInputStream合并文件。    public static void merge2() throws IOException{        //找到目标文件        File inFile1 = new File("F:\\a.txt");        File inFile2 = new File("F:\\b.txt");        File outFile = new File("F:\\c.txt");        //建立数据的输入输出通道        FileOutputStream fileOutputStream = new FileOutputStream(outFile);        FileInputStream fileInputStream1 = new FileInputStream(inFile1);        FileInputStream fileInputStream2 = new FileInputStream(inFile2);        //建立序列流对象        SequenceInputStream inputStream = new SequenceInputStream(fileInputStream1,fileInputStream2);        byte[] buf = new byte[1024];        int length = 0 ;         while((length = inputStream.read(buf))!=-1){            fileOutputStream.write(buf,0,length);        }        //关闭资源        inputStream.close();        fileOutputStream.close();    }    //需求:把a.txt与b.txt 文件的内容合并。    public static void merge1() throws IOException{        //找到目标文件        File inFile1 = new File("F:\\a.txt");        File inFile2 = new File("F:\\b.txt");        File outFile = new File("F:\\c.txt");        //建立数据的输入输出通道        FileOutputStream fileOutputStream = new FileOutputStream(outFile);        FileInputStream fileInputStream1 = new FileInputStream(inFile1);        FileInputStream fileInputStream2 = new FileInputStream(inFile2);        //把输入流存储到集合中,然后再从集合中读取        ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();        list.add(fileInputStream1);        list.add(fileInputStream2);        //准备一个缓冲数组        byte[] buf = new byte[1024];        int length = 0 ;         for(int i = 0 ; i< list.size() ; i++){            FileInputStream fileInputStream = list.get(i);            while((length = fileInputStream.read(buf))!=-1){                fileOutputStream.write(buf,0,length);            }            //关闭资源            fileInputStream.close();        }        fileOutputStream.close();    }}
package cn.itcast.other;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.SequenceInputStream;import java.util.Enumeration;import java.util.Vector;/* 需求: 把一首mp3先切割成n份,然后再把这些文件合并起来。 */public class Demo2 {    public static void main(String[] args) throws IOException {//      cutFile();        mergeFlile();    }    //合并    public static void mergeFlile() throws IOException{        //找到目标文件        File dir = new File("F:\\music");        //通过目标文件夹找到所有的MP3文件,然后把所有的MP3文件添加到vector中。        Vector<FileInputStream> vector = new Vector<FileInputStream>();        File[] files = dir.listFiles();        for(File file : files){            if(file.getName().endsWith(".mp3")){                vector.add(new FileInputStream(file));            }        }        //通过Vector获取迭代器        Enumeration<FileInputStream> e = vector.elements();        //创建序列流        SequenceInputStream inputStream = new SequenceInputStream(e);        //建立文件的输出通道        FileOutputStream fileOutputStream = new FileOutputStream("F:\\合并.mp3");        //建立缓冲数组读取文件        byte[] buf = new byte[1024];        int length = 0 ;         while((length =  inputStream.read(buf))!=-1){            fileOutputStream.write(buf,0,length);        }        //关闭资源        fileOutputStream.close();        inputStream.close();    }    //切割MP3    public static void cutFile() throws IOException{        File file = new File("F:\\美女\\1.mp3");        //目标文件夹        File dir = new File("F:\\music");        //建立数据的输入通道        FileInputStream fileInputStream = new FileInputStream(file);        //建立缓冲数组读取        byte[] buf = new byte[1024*1024];        int length = 0;        for(int i = 0 ;  (length = fileInputStream.read(buf))!=-1 ; i++){            FileOutputStream fileOutputStream = new FileOutputStream(new File(dir,"part"+i+".mp3"));            fileOutputStream.write(buf,0,length);            fileOutputStream.close();        }        //关闭资源        fileInputStream.close();    }}
package cn.itcast.other;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/* 对象的输入输出流 : 对象的输入输出流 主要的作用是用于写对象的信息与读取对象的信息。 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream .对象的输入流: ObjectInputStream  ObjectOutputStream的使用步骤:    1.  对象输入输出流要注意的细节:    1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。    2. 对象的反序列化创建对象的时候并不会调用到构造方法的、    3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。    4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID    进行对比,如果这两个id不一致,那么反序列化就失败了。    5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后    在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。    6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。    7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口。 */class Address implements Serializable{    String country;     String city;    public Address(String country,String city){        this.country = country;        this.city = city;    }}class User implements Serializable{    private static final long serialVersionUID = 1L;    String userName ;    String password;    transient int age;  // transient 透明    Address address ;    public User(String userName , String passwrod) {        this.userName = userName;        this.password = passwrod;    }    public User(String userName , String passwrod,int age,Address address) {        this.userName = userName;        this.password = passwrod;        this.age = age;        this.address = address;    }    @Override    public String toString() {        return "用户名:"+this.userName+ " 密码:"+ this.password+" 年龄:"+this.age+" 地址:"+this.address.city;    }}public class Demo3 {    public static void main(String[] args) throws IOException, Exception {        writeObj();//      readObj();    }    //把文件中的对象信息读取出来-------->对象的反序列化    public static void readObj() throws  IOException, ClassNotFoundException{        //找到目标文件        File file = new File("F:\\obj.txt");        //建立数据的输入通道        FileInputStream fileInputStream = new FileInputStream(file);        //建立对象的输入流对象        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);        //读取对象信息        User user = (User) objectInputStream.readObject(); //创建对象肯定要依赖对象所属 的class文件。        System.out.println("对象的信息:"+ user);    }    //定义方法把对象的信息写到硬盘上------>对象的序列化。    public static void writeObj() throws IOException{        //把user对象的信息持久化存储。        Address address = new Address("中国","广州");        User user = new User("admin","123",15,address);        //找到目标文件        File file = new File("F:\\obj.txt");        //建立数据输出流对象        FileOutputStream fileOutputStream = new FileOutputStream(file);        //建立对象的输出流对象        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);        //把对象写出        objectOutputStream.writeObject(user);        //关闭资源        objectOutputStream.close();    }}
0 0