I/O输入输出-输入/ 输出流

 1,   流是一组有序的数据序列,根据操作类型,可以分为输入流和输出流,实际上是程序与文件/数组/网络连接/数据库的关系,但要以程序为中心。

 2,IO流分类

    1)按流向分:输入流与输出流

    2)按数据分:字节流:二进制,一切文件均可

                       字符流:文本文件,只处理纯文本

3,字符流与字节流(重点)

    1),字节流:输入流:InputStream(字节输入流)

                       输出流:OutputStream(字节输出流)

   2),字符流:输入流:Reader(字符输入流)

                      输出流:Writer(字符输出流)

4,操作

    举例:搬家------------->读取文件

   1)关联房子  ----------->建立与文件的联系---------------->创建file对象

   2)选择搬家------------->选择对应流---------------------->文件输入流(InputSream,FileInputStream)/文件输出流(InputSream,FileInputStream)

   3)搬家------------------>读取/写出

            a) 卡车大小------->数组大小

            b)运输------------->读取/写出

   4)打发over--------------->释放资源

---------读取文件内容-------------

public static void test()//读取文件内容操作
    {
        File src = new File("e:/test/zjf.txt");
        InputStream is = null;
        try {
            is = new FileInputStream(src);//使用src对象创建is对象
            int len = 0;
            byte[] car =new byte[100];
            try {
                //String info = null;
                while(-1!=(len=is.read(car)))//当len=-1时表示已经读到文件末尾
                {//将字节流转变成字符流,然后读取字符流
                    String info = new String(car,0,len);
                    System.out.println(info);//读取文件内容
                }
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(is!=null)//将数据读取完后需要释放资源
            {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

-------------向文件中写入内容----------------------

public static void test1()
    {
        File dest = new File("e:/test/zjf.txt");
        OutputStream is = null;
        try {
            is = new FileOutputStream(dest,false);//true代表在文件中追加内容,false代表更新文件内容,不保留原有的
            String src = "hkafhgkshgkag";
            byte[] data = src.getBytes();
            try {
                is.write(data);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 --------------文件的拷贝---------------------------------

比如:src = "e:/study/dir/zjf.txt"  dest = "e:/test/dir/zjf.txt"

/**
     * 将一个文件中的内容拷贝到另一个文件中,源文件必须是存在的
     * @throws IOException 
     */
    public  static void copyFile(File src,File dest) throws IOException
    {
        //1建立联系,file对象,源头,目的地
        //File src = new File(srcPath);
        //File dest = new File(destPath);
        //2选择流,文件输入流(InputStream,FileInputStream),文件输出流(OutahputStream,FileOutputStream)
         InputStream is  = new FileInputStream(src);
         OutputStream os  = new FileOutputStream(dest);
        //3 操作,循环读取+拷贝
        int len =0;
        byte[] flush = new byte[1024];
        while(-1!=(len=is.read(flush)))//不断将is中的内容读到flush,
        {
            //写出
            os.write(flush, 0, len);//将flush中的内容写到os中
        }
        os.flush();//强制刷出   
        //关闭流,先打开的后关闭
        os.close();
        is.close();
        
    }

------------------------文件夹的拷贝,也包括文件夹的内容也一起拷贝过去---------------------

比如:src="e:/study/dir" 中的dir文件夹以及dir文件夹中的文件拷贝到"e:/test/"下

最后形成的结果是e:/test/dir/1.txt.........e:/test/dir/6.txt

package fjz;

import java.io.File;
import java.io.IOException;

public class Demo005 {

    /**
     * 文件夹的拷贝
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
         copyDir();
    }
     
    public  static void copyDir() throws IOException
    {
        File src = new File("e:/study/dir");
        File dest = new File("e:/test");
        if(src.isDirectory())
        {
            dest = new File(dest,src.getName());
            System.out.println(dest);
        }
        copydir(src,dest);
        
    }
    public static void copydir(File src,File dest) throws IOException
    {
        if(src.isFile())//如果src是指向的是一个文件的话
        {
            /**
             * 将源文件的内容拷贝到目的文件中,并保持原来各自的格式,用的是上面文件拷贝的函数
             * src:e:\study\dir\1.jpg,e:\study\dir\2.pptx
             * dest:e:\test\dir\1.jpg,e:\test\dir\2.pptx
             */
             Demo004.copyFile(src,dest);
        }else if(src.isDirectory())//如果src指向的是一个文件夹的话
        {
            dest.mkdirs();//若目标文件夹没有,就自行创建父目录和子目录
            for(File sub:src.listFiles())
            {
                /**
                 * 依次遍历要拷贝的文件夹dir中的文件
                 *  sub指的是文件的路径,sub.getName()指的是文件的名字
                    new File(dest,sub.getName())是在目的文件夹下生成一个空的文件
                    即:e:\test\dir\1.jpg,e:\test\dir\2.pptx    
                 */
                copydir(sub,new File(dest,sub.getName()));//递归调用目录    
            }
        }
        
    }
}

 

posted on 2016-10-26 21:55  我想静静_zjf  阅读(149)  评论(0编辑  收藏  举报

导航