IO流 字符流 字节流 缓冲流 文件的复制

IO流

IO概述

IO流就是一个管道,是用来在设备之间传输数据

input:相对于内存/程序 往进走输入流

output:相对于内存/程序 往硬盘写入

分类

根据数据进出方式

1、输出流:

  • FileWriter 字符输出流
  • BufferedWriter 字符缓冲输出流

2、输入流:
- FileReader
- BufferedReader

根据读写数据的方式

  • 字符流:文本文件 字符存储。读写过程可以按照一个或多个字符进行读写
  • 字节流:图片、视频、音频 可以读取任何格式的文件。读写过程中可以一个或多个字节的读写

  • OutputStream

    • FileOutSteram
    • BufferedOutputSteram
  • InputStream
    • FileInputStream
    • BufferedInputStream

在计算机底层存储任何文件是,都是按照字节的形式进行存储的。

利用字符流实现文件拷贝

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

/**
 * 利用字符流实现文件的拷贝
 * @author YandeHu
 *
 */
public class DemoFileCopy {

    public static void main(String[] args) throws Exception {
        //创建输入输出对象
        FileReader fr=new FileReader("E:\\01\\01\\a.txt");
        FileWriter fw=new FileWriter("E:\\01\\01\\b.txt");
        BufferedReader br=new BufferedReader(fr);
        BufferedWriter bw= new BufferedWriter(fw);

        //定义字符串类型的变量
        String line=null;
        while((line=br.readLine())!=null){
            System.out.println(line);
                bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //关闭流
        bw.close();
        br.close();
        System.out.println("拷贝完成");
    }
}

字节流

  • InputStream
    • 构造方法
    • read方法
  • OutputStram
    • 构造方法
    • writer方法

文件字节输入\输出流的使用

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class DemoCoqyStream {

    public static void main(String[] args) throws Exception {
        //创建字节输入、输出流
        copyFile01();
        copyFile02();
    }

    /**
     * 封装方法
     * @throws Exception 
     */
    public static void copyFile01() throws Exception{
        FileInputStream fi=new FileInputStream("E:\\01\\01\\1.jpg");
        FileOutputStream fo=new FileOutputStream("E:\\01\\01\\2.jpg");

        //读文件
        int len=-1;
        while((len=fi.read())!=-1){
            fo.write(len);
        }
        System.out.println("复制成功");
        fi.close();
        fo.close();
    }

    /**
     * 封装方法 一次复制一个数组的
     * @throws Exception 
     */
    public static void copyFile02() throws Exception{
        FileInputStream fi=new FileInputStream("E:\\01\\01\\1.jpg");
        FileOutputStream fo=new FileOutputStream("E:\\01\\01\\3.jpg");

        //读取文件
        byte [] b=new byte[1024];
        int len=-1; //0 代表没有数据
        while((len=fi.read(b))!=-1){
            fo.write(b,0,len);
        }
        fi.close();
        fo.close();
        System.out.println(len+"复制成功");

    }
}

缓冲字节流输入\输出的使用

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 利用缓冲字节流
 * @author YandeHu
 *
 */
public class DemoStreamBuffer {

    public static void main(String[] args) throws Exception {
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("b.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("c.txt"));
        //硬盘写
        bos.write("hello".getBytes());
        System.out.println("写入成功");

        //读
        byte []b=new byte[10];
        int len=-1;
        while((len=bis.read(b))!=-1){
            System.out.print(new String(b,0,len));
        }
        //bos.close();
        bis.close();
    }
}

利用字符输出流实现对文件内容的复制

过程是:先将要拷贝的文件读入到内存中,在将内容写入到另一个文件

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

/**
 * 利用字符流实现文件的拷贝
 * @author YandeHu
 *
 */
public class DemoFileCopy {

    public static void main(String[] args) throws Exception {
        //创建输入输出对象
        FileReader fr=new FileReader("E:\\01\\01\\a.txt");
        FileWriter fw=new FileWriter("E:\\01\\01\\b.txt");
        BufferedReader br=new BufferedReader(fr);
        BufferedWriter bw= new BufferedWriter(fw);

        //定义字符串类型的变量
        String line=null;
        while((line=br.readLine())!=null){
            System.out.println(line);
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //关闭流
        bw.close();
        br.close();
        System.out.println("拷贝完成");
    }
}

利用缓冲字节输入\输出流实现单击文件目录内容的拷贝

步骤:方法的功能是 将指定文件的内容拷贝到目标目录,main函数的里的功能是遍历指定文件目录,如果文件的目录存在则复制文件到目标文件。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 复制单级文件夹
 * @author YandeHu
 *1、创建缓冲输入输出对象
 *2、读数据(一个字节数组,存储每次读到的一个数组的数据 ,定义一个整型 记录读取字节个数)
 *3、循环
 *
 */
public class DemoText {

    public static void main(String[] args) throws Exception {
        File file=new File("E:\\01\\01\\3.jpg");
        String destPath="E:\\01\\02";
        File dir=new File("E:\\01");
        File[] listFiles = dir.listFiles();
        if(listFiles==null){
            return;
        }else{
            //遍历文件列表
            for (File f : listFiles) {
                if(f.exists()){
                    copy(file, destPath);
                }
            }
            System.out.println("拷贝成功");
        }

    }
    public static void copy(File file,String destPath) throws Exception{
        //创建缓冲流
                BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
                BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destPath+"\\"+file.getName()));

                byte []bArray=new byte[1024];
                int len=-1;
                while((len=bis.read(bArray))!=-1){
                    bos.write(bArray,0,len);//将数组的内容写入到文件中
                }
                bis.close();
                bos.close();
    }
}
posted @ 2017-10-25 16:06  yinder  阅读(205)  评论(0编辑  收藏  举报