zoukankan      html  css  js  c++  java
  • Java IO流(二)

    • File类
    • 字符流与字节流

    File 类

    1.1 File 概述

      打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可,那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢

    1.2 File类的构造函数

    File(String pathname) :将一个字符串路径封装成File对象

     File(String parent,String child):传入一个父级路径和子级路径

     File(File parent,String child):传入一个File类型的父级路径和子级路径

    1.2.1 案例代码一:

    package com.gao_01;
    import java.io.File;
    /*
     * File:文件和目录路径名的抽象表示形式,File 类的实例是不可变的
     * 
     * 构造方法:
     *         File(File parent, String child) 
     *         File(String pathname) 
     *         File(String parent, String child)      
     * 
     * 
     */
    public class FileDemo {
        public static void main(String[] args) {
            //File(String pathname) :将指定的路径名转换成一个File对象
            //File f = new File("D:\a\b.txt");
            
            //File(String parent, String child) : 根据指定的父路径和文件路径创建File对象
            //File f2 = new File("D:\a","b.txt");
            
            //File(File parent, String child) :根据指定的父路径对象和文件路径创建File对象
            //File parent = new File("D:\a");
            //File f3 = new File(parent,"b.txt");
            
            File f4 = new File(new File("D:\a"),"b.txt");
            
        }
    }

    1.3 类创建和删除功能

    boolean createNewFile():指定路径不存在该文件时时创建文件,返回true,否则返回false

    boolean mkdir():当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false

    boolean mkdirs():当指定的多级文件夹某一级文件夹不存在时,创建多级文件夹并返回true,否则返回false

    boolean delete():删除文件或者删除单级文件夹

    1.3.1 案例代码二:

    package com.gao_01;
    
    import java.io.File;
    import java.io.IOException;
    
    /*
     *     创建功能
     *         boolean createNewFile()  
     *         boolean mkdir()  
     *         boolean mkdirs()  
     *     删除功能
     *         boolean delete() 
     * 
     *  绝对路径:固定不可改变的路径,以盘符开头
     *  相对路径:相对某个参照物,不能以盘符开头
     *          在eclipse中相对路径相对应当前项目的根目录
     *  
     *  
     *  注意:删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹
    
     */
    public class FileDemo2 {
        public static void main(String[] args) throws IOException {
              File f = new File("d:\a\b.txt");//绝对路径
              File f2 = new File("a.txt");//相对路径
            
             //boolean createNewFile() : 当指定文件不存在时创建文件并返回true,否则返回false
             System.out.println(f2.createNewFile());
            
             
            //boolean mkdir()   : 当指定文件夹不存在时创建文件夹并返回true,否则返回false
            File f3 = new File("b");
            System.out.println(f3.mkdir());
            
            //boolean mkdirs() : 创建指定文件夹,当文件夹所在的目录不存在,则顺道一块创建了
            File f4 = new File("c\d\e");
            System.out.println(f4.mkdir());
            System.out.println(f4.mkdirs());
            
            File f5 = new File("c.txt");
            System.out.println(f5.mkdir());
            
            //boolean delete() :当指定的文件或文件夹存在时删除文件或者文件夹 并返回true,否则返回false
            System.out.println(f2.delete());
            System.out.println(f3.delete());
    
            File f6 = new File("c");
            System.out.println(f6.delete());
            
        }
    }

    1.4 File 类的判断功能

    boolean exists():判断指定路径的文件或文件夹是否存在

    boolean isAbsolute():判断当前路路径是否是绝对路径

    boolean isDirectory():判断当前的目录是否存在

    boolean isFile():判断当前路径是否是一个文件

    boolean isHidden():判断当前路径是否是隐藏文件

    1.4.1 案例代码三:

    package com.gao_01;
    import java.io.File;
    import java.io.IOException;
    
    /*
     *    判断功能
     *         boolean exists()  
     *         boolean isAbsolute()  
     *         boolean isDirectory() 
             boolean isFile()  
             boolean isHidden() 
     */
    public class FileDemo3 {
        public static void main(String[] args) throws IOException {
            //method();
            //method2();
            //method3();
            
            method4();
        }
    
        private static void method4() {
            File f = new File("d:\a\b.txt");
            //boolean isHidden() :判断File对象指向的路径是否有隐藏属性,如果隐藏了则返回true,否则返回false
            
            System.out.println(f.isHidden());
        }
    
        private static void method3() {
            File f = new File("a.txt");
            File f2 = new File("b");
            //boolean isDirectory() :判断File对象指向的路径是否是文件夹,如果是则返回true,否则返回false
            //boolean isFile()  : 判断File对象指向的路径是否是文件,如果是则返回true,否则返回false
            
            //System.out.println(f.isDirectory());
            //System.out.println(f2.isDirectory());
            
            System.out.println(f.isFile());
            System.out.println(f2.isFile());
        }
    
        private static void method2() {
            //File f = new File("a.txt");
            File f2 = new File("d:\a.txt");
            
            //boolean isAbsolute() :判断File对象指向的路径是否是绝对路径,如果是绝对路径则返回true,否则返回false
            System.out.println(f2.isAbsolute());
        }
    
        private static void method() {
            File f = new File("a.txt");
            //f.createNewFile();
            
            //boolean exists() : 判断文件或者文件夹是否存在,如果存在则返回true,否则返回false
            System.out.println(f.exists());
        }
    }

    1.5 File 类的获取功能和修改名字功能

      File getAbsoluteFile():获取文件的绝对路径,返回File对象

      String getAbsolutePath():获取文件的绝对路径,返回路径的字符串

      String getParent():获取当前路径的父级路径,以字符串形式返回该父级路径

      File getParentFile():获取当前路径的父级路径,以字File对象形式返回该父级路径

      String getName():获取文件或文件夹的名称

      String getPath():获取File对象中封装的路径

      long lastModified():以毫秒值返回最后修改时间

      long length():返回文件的字节数

      boolean renameTo(File dest): 将当前File对象所指向的路径 修改为 指定File所指向的路径

    1.5.1 案例代码四:

     package com.gao_01;
    
    import java.io.File;
    import java.io.IOException;
    
    /*
     *    获取功能
             File getAbsoluteFile()  
     *         String getAbsolutePath() 
     *         String getParent()  
     *         File getParentFile() 
     *         String getName() 
     *         String getPath()  
              long lastModified() 
              long length() 
          修改功能:
             boolean renameTo(File dest)
     */
    public class FileDemo4 {
        public static void main(String[] args) throws IOException  {
            //method();
            //method2();
            //method3();
            
            File f = new File("d.txt");
            File f2 = new File("e.txt");
            
            //boolean renameTo(File dest) : 将当前File对象所指向的路径 修改为 指定File所指向的路径
            //注意:修改的文件路径不能存在,如果存在则修改失败
            System.out.println(f.renameTo(f2));
        }
    
        private static void method3() {
            File f = new File("a.txt");
            File f2 = new File("d:\a\b.txt");
            File f3 = new File("b");
            
            //String getName() : 获取文件和文件夹的名称
            //System.out.println(f.getName());
            //System.out.println(f2.getName());
            //System.out.println(f3.getName());
            
            //String getPath() : 返回创建File对象时给的路径
            //System.out.println(f.getPath());
            //System.out.println(f2.getPath());
            //System.out.println(f3.getPath());
            
            //long lastModified() : 以毫秒值的形式返回最后修改时间
            //System.out.println(f.lastModified());
            //2514023311294
            //Date d = new Date(2514023311294L);
            //System.out.println(d.toLocaleString());
            
            //long length() : 返回文件的字节数
            System.out.println(f.length());
            System.out.println(f3.length());
        }
    
        private static void method2() throws IOException {
            //File f = new File("a.txt");
            
            //File f2 = new File("b","c.txt");
            //System.out.println(f2.createNewFile());
            
            File parent = new File("b");
            File f3 = new File(parent,"c.txt");
            if(!parent.exists()) {
                parent.mkdirs();
            }
            System.out.println(f3.createNewFile());
            
            //String getParent() 
            System.out.println(f3.getParent());
            //File getParentFile() 
            System.out.println(f3.getParentFile());
        }
    
        private static void method() {
            File f = new File("d:\a\b.txt");
            File f2 = new File("a.txt");
            
            //File getAbsoluteFile()  :以File对象的形式返回当前File对象所有指向的绝对路径
            System.out.println(f2.getAbsoluteFile());
            //String getAbsolutePath() : 返回File对象所指向的绝对路径
            System.out.println(f2.getAbsolutePath());
        }
    }

    1.6 File 类的其他获取功能

    String[] list():以字符串数组的形式返回当前路径下所有的文件和文件夹的名称

    File[] listFiles():以File对象的形式返回当前路径下所有的文件和文件夹的名称

    static File[] listRoots():获取计算机中所有的盘符

    1.6.1 案例代码五:

    package com.gao_01;
    import java.io.File;
    
    /*
     *     String[] list() 
         File[] listFiles() 
         static File[] listRoots() 
     */
    public class FileDemo5 {
        public static void main(String[] args)  {
            //method();
            //method2();
            
            //static File[] listRoots() :  返回的是所有盘符
            File[] files = File.listRoots();
            for (File file : files) {
                System.out.println(file);
            }
        }
    
        private static void method2() {
            File f = new File("b");
            File f2 = new File("D:\workspace\myFile");
            File f3 = new File("c.txt");
            
            //File[] listFiles()
            File[] files = f3.listFiles();
            for (File file : files) {
                System.out.println(file.getName());
            }
        }
    
        private static void method() {
            File f = new File("b");
            File f2 = new File("D:\workspace\myFile");
            File f3 = new File("c.txt");
            
            //String[] list() : 返回当前路径下所有的文件和文件夹名称
            //注意:只有指向文件夹的File对象才可以调用该方法
            String[] files = f3.list();
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i]);
            }
        }
    }

    1.7 File 类的两个案例

    1.7.1 案例代码六:

    输出指定目录下所有的java文件名(包含子目录)

    package com.gao_02;
    
    import java.io.File;
    
    /*
     * 需求:输出指定目录下所有的java文件名(包含子目录)
     */
    public class RecurrenceTest {
        public static void main(String[] args) {
            File f = new File("src");
            //File f = new File("src\com\itheima_01\RecurrenceDemo.java");
            method(f);
        }
        
        public static void method(File file) {
            if(file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    //判断是否是文件对象
                    if(f.isFile()) {
                        if(f.getName().endsWith(".java")) {
                            System.out.println(f.getName());
                        }
                    }
                    else if(f.isDirectory()){
                        //是一个目录对象
                        method(f);
                    }
                }
            }
        }
        
        
        //输出指定目录下的所有java文件名(不包含子目录)
        public static void method2(File file) {
            if(file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    //判断是否是文件对象
                    if(f.isFile()) {
                        if(f.getName().endsWith(".java")) {
                            System.out.println(f.getName());
                        }
                    }
                }
            }
        }
        
    }

    1.7.2 案例代码七

    删除指定的目录(包含子目录)

    package com.gao_02;
    
    import java.io.File;
    
    /*
     * 需求:删除指定的目录(包含子目录)
     * 
     * 注意:如果要删除一个目录,则需要先删除这个目录下的所有子文件和子目录
     * 
     */
    public class RecurrenceTest2 {
        public static void main(String[] args) {
            File f = new File("d:\a");
            method(f);
        }
        
        //删除指定目录下所有文件和目录
        public static void method(File file) {
            if(file.isDirectory()) {
                //干掉自己所有的子文件和子目录
                //获取所有的子文件和子目录
                File[] files = file.listFiles();
                for (File f : files) {
                    if(f.isFile()) {
                        //直接干掉他
                        System.out.println(f.getName());
                        f.delete();
                    }
                    else if(f.isDirectory()) {
                        //继续查看是否还有文件和子目录
                        method(f);
                    }
                }
                
                //干掉自己
                System.out.println(file.getName());
                file.delete();
            }
        }
    }

    1.7.3 案例代码八:

    将指定目录(包含内容)复制到另一个目录中

    package com.itheima_02;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*
     * 需求:将指定目录(包含内容)复制到另一个目录中
     * 
     * 源目录        目标目录
     * 
     * 
     * 分析:
     *         首先我们要获取源目录下所有的文件和子目录,
     *                 我们可以把源目录封装成一个File对象,
     *                 我们可以调用File类listFiles()方法,
     *                 我们可以获取源目录下所有的文件和子目录所对应的File对象。
     *         如果我们获取到的是文件
     *                 先在目标目录中创建该文件所对应的目录,
     *                 进行文件的复制。
     *         如果我们获取到的是子目录
     *                 看看子目录下面是否还有其他的文件和更深层次的子目录
     * 
     * 
     * 
    
     */
    public class RecurrenceTest3 {
        public static void main(String[] args) throws IOException  {
            //源目录
            File src = new File("d:\myAPI");
            //目标目录
            File dest = new File("d:\a");
            
            copyDir(src,dest);
        }
        
        public static void copyDir(File src,File dest) throws IOException {
            //为了严谨起见,我们首先对源目录和目标目录进行判断,看他们到底是不是目录
            if(src.isDirectory() && dest.isDirectory()) {
                
                File newDir = new File(dest , src.getName());
                if(!newDir.exists()) {
                    newDir.mkdir();
                }
                    
                //获取源目录下所有的文件和子目录
                File[] files = src.listFiles();
                
                for (File file : files) {
                    if(file.isFile()) {
                        //如果File对象是文件,我们就进行文件的复制
                        /*
                         * 
                         * 假设file对象指向的文件是d:\myAPI\classpath,
                         * 我们要把这个文件复制到d:\a\myAPI
                         * 
                         * src:        d:\myAPI
                         * dest:    d:\a
                         * file:    d:\myAPI\classpath
                         * 
                         * "d:\a" + "myAPI" =  d:\a\myAPI
                         * 
                         */
                        
                        //d:\a\myAPI
                        /*File newDir = new File(dest , src.getName());
                        if(!newDir.exists()) {
                            newDir.mkdir();
                        }*/
                        
                        //创建输入流对象
                        FileInputStream fis = new FileInputStream(file);
                        //创建输出流对象
                        // "d:\a\myAPI" + "classpath" = d:\a\myAPI\classpath
                        FileOutputStream fos = new FileOutputStream(new File(newDir,file.getName()));
                        
                        byte[] bys = new byte[1024];
                        int len;
                        
                        while((len = fis.read(bys)) != -1) {
                            fos.write(bys, 0, len);
                        }
                        
                        fis.close();
                        fos.close();
                    }
                    else if(file.isDirectory()) {
                        //如果File对象是子目录,递归,看看子目录下面到底有什么
                        /*
                         * src: d:\myAPI
                         * dest: d:\a
                         * 
                         * 新的源目录:d:\myAPI\bin
                         * 新目标目录:d:\a\myAPI
                         * 
                         * 
                         */
                        
                        //File newDir = new File(dest,src.getName());
                                
                        copyDir(file,newDir);
                    }
                }
            }
        }
    }

    字符流与字节流

    2.1 概述

     IO流分类:

        流向

            输入流       读取数据       FileReader    Reader

             输出流     写出数据       FileWriter     Writer

         数据类型

               字节流 

                    字节输入流   读取数据     InputStream

                     字节输出流   写出数据     OutputStream

                字符流

                      字符输入流  读取数据     Reader

                      字符输出流  写出数据    Writer

    2.2 利用字符流复制文本文件

    利用字符流将当前工程下的IODemo.java拷贝到d盘的a文件夹下

    2.2.1 案例代码九:

    package com.gao_02;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /*
     * 使用字符流复制文本文件
     * 
     * 数据源        IODemo.java
     * 目的地        d:\IODemo.java
    
     *     
     */
    public class FileCopyDemo {
        public static void main(String[] args) throws IOException  {
            //创建字符输入流对象
            FileReader fr = new FileReader("IODemo.java");
            //创建字符输出流对象
            FileWriter fw = new FileWriter("d:\IODemo.java");
            
            //一次读写一个字符
            
            /*int ch;
            while((ch = fr.read()) != -1) {
                fw.write(ch);
                fw.flush();
            }*/
            
            //一次读写一个字符数组
            int len;//用于存储读到的字符个数
            char[] chs = new char[1024];
            while((len = fr.read(chs)) != -1) {
                fw.write(chs,0,len);
                fw.flush();
            }
            
            //释放资源
            fw.close();
            fr.close();
        }
    }

    2.2.2 字符流复制图片的问题解析

    2.3 利用字节流复制文本文件

    利用字节流将当前工程下的IODemo.java拷贝到d盘下

    2.3.1 案例代码十

    package com.gao_03;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*
     * 使用字节流复制文本文件
     * 
     * 数据源        IODemo.java
     * 目的地        d:\a\IODemo.java
     * 
     */
    public class FileCopyDemo {
        public static void main(String[] args) throws IOException  {
            //创建字节输入流对象
            FileInputStream fis = new FileInputStream("IODemo.java");
            //创建字节输出流对象
            FileOutputStream fos = new FileOutputStream("d:\a\IODemo.java");
            
            //一次读写一个字节
            /*int by;
            while((by = fis.read()) != -1) {
                fos.write(by);
            }*/
            //一次读写一个字节数组
            int len;//存储读到的字节个数
            byte[] bys = new byte[1024];
            while((len = fis.read(bys)) != -1) {
                fos.write(bys,0,len);
            }
            
            
            //释放资源
            fos.close();
            fis.close();
        }
    }

    2.4 复制图片

    字节流可以操作所有类型的文件,因为所有的文件在计算机中都是以字节形式存储

    而字符流只能用来操作纯文本类型的文件,不能操作字节类型的文件

    2.4.1 案例代码十一:

    package com.gao_04;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /*
     * 分别使用字符流和字节流复制图片
     * 
     * 二进制文件只能使用字节流进行复制(使用windows自带记事本打开读不懂的)
     * 文本文件的复制即可使用字符流,也可以使用字节流
     * 
     */
    public class CopyImage {
        public static void main(String[] args) throws IOException  {
            //method();
            
            //创建字节输入流对象
            FileInputStream fis = new FileInputStream("传智学院.jpg");
            //创建字节输出流对象
            FileOutputStream fos = new FileOutputStream("d:\传智学院.jpg");
            
            //一次读写一个字节数组
            int len;//用于存储读到的字节个数
            byte[] bys = new byte[1024];
            while((len = fis.read(bys)) != -1) {
                fos.write(bys,0,len);
            }
            
            //释放资源
            fos.close();
            fis.close();
        }
    
        private static void method() throws FileNotFoundException, IOException {
            //创建字符输入流对象
            FileReader fr = new FileReader("传智学院.jpg");
            //创建字符输出流对象
            FileWriter fw = new FileWriter("d:\传智学院.jpg");
            
            //一次读写一个字符数组
            int len;//用于存储读到的字符个数
            char[] chs = new char[1024];
            while((len = fr.read(chs)) != -1) {
                fw.write(chs,0,len);
                fw.flush();
            }
            
            //释放资源
            fw.close();
            fr.close();
        }
    }

    2.5 复制指定目录的所有文件到努力文件

    package com.gao;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopyDirTest {
        public static void main(String[] args) throws IOException {
            File src = new File("D:\Java重点笔记及作业");
            File dest = new File("D:\杂七杂八");
            copyDir(src, dest);
        }
    
        public static void copyDir(File src, File dest) throws IOException {
            if (src.isDirectory() && dest.isDirectory()) {
                File dir = new File(dest, src.getName());
                if (!dir.exists()) {
                    dir.mkdir();
                }
                File[] files = src.listFiles();
                for (File file : files) {
                    if (file.isFile()) {
                        copyFile(file, new File(dir, file.getName()));
                    } else {
                        copyDir(file, dir);
                    }
                }
            }
        }
    
        public static void copyFile(File file, File dir) throws IOException {
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(dir);
    
            int len;
            byte[] by = new byte[1024];
            while ((len = fis.read(by)) != -1) {
                fos.write(by, 0, len);
            }
            fis.close();
            fos.close();
        }
    }
  • 相关阅读:
    【作业】Python面向对象
    Python使用使用第三方源(国内源:豆瓣)下载包文件 超快!!!
    【案例】Python
    【个人笔记】Python
    定义函数相关内容
    列表,for循环相关.
    while应用和函数学习
    斗地主发牌器
    字符串索引切片.
    随机生成20以内加减法,5次答题并统计正确和错误题数
  • 原文地址:https://www.cnblogs.com/yoke/p/7469902.html
Copyright © 2011-2022 走看看