【黑马】程序员————IO(三)打印流,合并/切割,对象序列化,RandomAccessFile,其他流。

时间:2023-02-18 15:01:34

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

 一、打印、合并切割。

1、打印流

打印流提供了print,println方法,可以讲各种类型的数据原样打印。

字节打印流 PrintStream:

  Constructor() 参数列表

  1.File f

  2.String str (“字符串路径”)

  3.字节输出流  FileOutputStream

字符打印流 PrintWriter:(常用于WEB开发)

 

Constructor() 参数列表

 

  1.File f

 

  2.String str (“字符串路径”)

 

  3.字节输出流  FileOutputStream

 

  4.字符输出流,Writer

<例>  BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

    PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);  //true参数代表自动刷新。boolean autoflush

注意:

 

 

2、合并切割

SequenceInputStream(序列流):用于整合多个输入流对象

Constructor() :构造方法:

1、SequenceInputStream(Enumeration en); //枚举类型(老版迭代器),集合Vector. 

2、SequenceInputStream(InputStream s1,InputStream s2);

 

<示例1>将1.txt,2.txt,3.txt文件合并为一个文件。

/*示例:合并文件
 * 思路:建立三个输入流关联三个文件
 *     将三个流对象存入Vector集合中
 *     利用Vector对象的 elements()方法建立Enumeration
 *     将Enumeration对象作为参数传递至SequenceInputStream()的参数,合并输入流
 *     IO操作。
 */
import java.io.*;
import java.util.*;


public class IoTest1 {
        
    public static void main(String[] args) throws IOException  {
        
        
        Vector<FileInputStream> v = new Vector(); //创建结合对象,泛型规定集合元素类型为 FileInputStream字节输入
        
        v.add(new FileInputStream("D:\\1.txt"));  //添加元素
        v.add(new FileInputStream("D:\\2.txt"));
        v.add(new FileInputStream("D:\\3.txt"));
        v.add(new FileInputStream("D:\\4.txt"));
         
        Enumeration en = v.elements();            //获取Enumeration对象
        
        SequenceInputStream sis = new SequenceInputStream(en); //创建序列流,合并输入流
        
        PrintStream ps = new PrintStream("d:\\5.txt");  //打印字节流关联输出文件
        
        byte[] temp  = new byte[1024];
        int len = 0;
        
        while(( len = sis.read(temp)) != -1)  {
            
            ps.write(temp,0,len);
            
        }
        
        ps.close();
        sis.close();
    }
    
    


}    

 

切割思路:定义一个数组:Byte[] temp = new byte[注意大小避免内存溢出]

     while((fis.read(temp)) != -1) {

        fos = new FileOuputStream("d:\\"+(count++) + ".bmp");

        fos.write("f");

        fos.close();

       }

<练习,切割并合并一个魔兽大脚文件>

/*切割合并综合示例
 */
import java.io.*;
import java.util.*;


public class IoTest1 {
        
    public static void main(String[] args) throws IOException  {
        
        //splitFile(new File("d:\\BigFoot_WOW_5.0.0.5.exe"));
        
        mergeFile();
    }
    
    
    
    
    /*将某文件切割成大小为5MB的碎片*/
    public static void splitFile(File f1) throws IOException {
        
        FileInputStream fis = new FileInputStream(f1); //输入
        FileOutputStream fos = null; //输出
        
        byte[] temp = new byte[1024*1024] ; //定义字节数组存放读取的文件
        
        int i = 1;     //文件名计数器
        int count = 0;  //输出次数计数器
        int len = 0;
        
        while((len = fis.read(temp)) != -1) {
            
            fos = new FileOutputStream("F:\\Bigfoot_"+i+".part",true); //想f1_i.part文件中续写内容
            fos.write(temp,0,len);  //每次写入1MB文件
            count ++;
            if (count % 5 == 0) {  //档写入大小为5MB时,关闭输出流,并且计数器i自加,下一次循环生成信的文件
                i++;
                fos.close();
            }
        }
        fis.close();
    }
    
    public static void mergeFile() throws IOException {
        
        ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
        
        for(int i = 1; i<=5;i++) {
            
            al.add(new FileInputStream("F:\\Bigfoot_"+i+".part"));
        }
        
        
        final Iterator<FileInputStream> it = al.iterator();
        Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {

            
            public boolean hasMoreElements() {
                
                return it.hasNext();
            }

        
            public FileInputStream nextElement() {
                
                return it.next();
            }
            
        };
        
        SequenceInputStream sis = new SequenceInputStream(en);
        FileOutputStream fos =new FileOutputStream("F:\\BIGFOOT.EXE");
        
        byte[] temp = new byte[1024*1024];
        int len = 0;
        while((len = sis.read(temp)) != -1) {
            
            
            fos.write(temp,0,len);
        }
        
        fos.close();
        sis.close();
    }
    

}    

【黑马】程序员————IO(三)打印流,合并/切割,对象序列化,RandomAccessFile,其他流。

 

三、RandomAccessFile

RandomAccessFile简介:

  

  此类继承至Object,并不是IO体系中的子类,但它是IO包内的成员,它的内部封装了流。

  其内部封装了一个数组,而且通过数组的指针对元素进行操作,通过getFilePointer获取指针,通过seek改变指针位置。

 只能操作文件,而且操作文件有四种模式:r rw rws rwd.

 方法:  read(各种基本数据类型), readLine();

 

RandomAccessFile raf  = new RandomAccessFile("D:\\abc.txt","rw");

raf.getFilePointer();

raf.seek();

raf.readInt();

raf.writeInt();

一个汉子 为一个字符,两个字节,16bits.  int型数据4个字节,33bits.

 

 

 

三、Object流,Data流,ByteArray流

 

1、对象的序列化:

ObjectInputStream/ObjectOutputStream:用于操作对象的流。  被操作的对象需要实现Serializable接口。

 

Class Person implements Serializable {

  public static final longVersionId = 42L;

 

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("abc.txt"));

Person p = (Person)ois.readObject();

ois.close();

 

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("xyz.txt"));

oos.writeObject(new Person("",""));

oos.close();

1、DataStream:基本数据类型流对象。

DataInputStream/DataOutputSteam可以用于操作基本数据类型的数据流对象。

常用方法:

readInt();readBoolean();readUTF();

1、ByteArrayStream:

用于操作字节数组的流对象,构造函数接受数据源。

流读写思想:

源设备 键盘System.in  硬盘FileStream  内存ByteArrayStream

目的设备控制台System.out  硬盘FileStream  内存:ByteArrayStream

    FileInputStream fis = new FileInputStream("a.txt");             //创建字节输入流,关联a.txt
    ByteArrayOutputStream baos = new ByteArrayOutputStream();       //创建内存输出流
    byte[] arr = new byte[5];                                       //创建字节数组,大小为5
    int len;
    while((len = fis.read(arr)) != -1) {                            //将文件上的数据读到字节数组中
        baos.write(arr, 0, len);                                    //将字节数组的数据写到内存缓冲区中
    }
    System.out.println(baos);                                       //将内存缓冲区的内容转换为字符串打印
    fis.close();