美文网首页
[java]11、文件

[java]11、文件

作者: 史记_d5da | 来源:发表于2021-10-10 21:02 被阅读0次

    1、File

    1、文件的分隔符和,路径分隔符

    // 获取路径分隔符,文件分隔符
    // 路径中的两个反斜杠代表一个反斜杠
    System.out.println(File.pathSeparator);
    System.out.println(File.separator);
    

    2、文件路径打印

    File fil1 = new File("C://a.txt");
    System.out.println(fil1.toString());
    // 路径分成两部分
    File fil2 = new File("C://", "a.txt");
    System.out.println(fil2.toString());
    // 路径组合
    File parent = new File("C://");
    File file = new File(parent, "hello.java");
    System.out.println(file.toString());
    

    3、getAbsolutePath() 、getPath()

    File file1 = new File("/Users/shiji/PacketTracer7/nets");
    System.out.println(file1.getAbsolutePath()); // /Users/shiji/PacketTracer7/nets
    // 获取当前文件夹下面nets文件路径
    File file2 = new File("nets");
    System.out.println(file2.getAbsolutePath()); // /Users/shiji/study/java/itcast/nets
    // getPath()
    File file3 = new File("/Users/shiji/PacketTracer7/nets");
    System.out.println(file3.getPath()); // /Users/shiji/PacketTracer7/nets
    // 获取当前文件夹下面nets文件路径
    File file4 = new File("nets");
    System.out.println(file4.getPath());  // nets
    System.out.println(file4.toString()); // nets
    
    // getName
    File file5 = new File("/Users/shiji/PacketTracer7/nets");
    System.out.println(file5.getName()); // nets
    File file6 = new File("/Users/shiji/PacketTracer7");
    System.out.println(file6.getName()); // PacketTracer7
    

    4、length()、exists()、isDirectory()、isFile()

    // Length
    File file7 = new File("/Users/shiji/PacketTracer7/nets");
    System.out.println(file7.length()); // 130字节
    // 判断构造方法中路径是否存在
    System.out.println(file7.exists()); // true
    // 判断构造方法中给定的路径是否以文件夹结尾
    System.out.println(file7.isDirectory()); // false
    // 判断构造方法中给定的路径是否以文件结尾
    System.out.println(file7.isFile()); // true
    

    4、createNewFile()、mkdir()、mkdirs()

    // 1、文件不存在创建文件返回true,否则返回false,
    // 2、此方法只能创建文件不能创建文件夹
    // 3、createNewFile 抛出IOException异常,路径不存在时抛出异常
    File file8 = new File("/Users/shiji/PacketTracer7/1.txt");
    System.out.println(file8.createNewFile()); // true
    // 1、mkdir 单级文件夹
    // 2、mkdirs 单级多级都可以创建
    // 3、文件夹不存在返回 true,否则返回false
    // 4、此方法只能创建文件夹不能创建文件
    File file9 = new File("/Users/shiji/PacketTracer7/a");
    System.out.println(file9.mkdir()); // true
    File file10 = new File("/Users/shiji/PacketTracer7/b/c/d");
    System.out.println(file10.mkdirs()); // true
    // delete 删除文件或者目录
    File file11 = new File("/Users/shiji/PacketTracer7/b/c/d");
    System.out.println(file11.delete());
    

    5、list()、listFiles()

    // list() 返回一个string数组,返回目录中的所有子文件或目录
    // File[] listFiles() 返回一个File文件数组,返回目录中的所有子文件或目录
    File file12 = new File("/Users/shiji/PacketTracer7");
    String[] arr = file12.list();
    for (String fileName : arr) {
          System.out.println(fileName);
    }
    File file13 = new File("/Users/shiji/PacketTracer7");
    File[] files = file13.listFiles();
    for (File fileName : files) {
         System.out.println(fileName);
    }
    

    6、打印文件目录下面所有.txt文件

    public class Demo01File {
        public static void main(String[] args) throws IOException {
            File file8 = new File("/Users/shiji/PacketTracer7");
            getAllFiles(file8);
        }
        public static void getAllFiles(File dir) {
            File files[] = dir.listFiles();
            for (File f : files) {
                if (f.isDirectory()) {
                    getAllFiles(f);
                } else  {
                    String filename = f.getName();
                    if (filename.endsWith(".txt"))
                        System.out.println(f.toString());
                }
            }
        }
    }
    

    2、文件过滤器

    1、FileFilter

    // 匿名类
    File files[] = dir.listFiles(new FileFilter() {
           @Override
           public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".txt");
           }
    });
    

    2、FilenameFilter

    File files[] = dir.listFiles(new FilenameFilter() {
           @Override
           public boolean accept(File dir, String name) {
               return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".txt");
           }
    });
    

    3、IO字节流

    1、OutputStream:字节输出流
    1)、相关方法

    • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
    • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
    • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
    • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
    • public abstract void write(int b) :将指定的字节输出流。
      2)、写入数据的原理(内存-->硬盘)
      java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中

    构造方法的作用:

    • 创建一个FileOutputStream对象
    • 会根据构造方法中传递的文件/文件路径,创建一个空的文件
    • 会把FileOutputStream对象指向创建号的文件
    public class Demo01OutputStream {
        public static void main(String[] args) throws IOException {
            FileOutputStream fos = new FileOutputStream("/Users/shiji/study/java/itcast/day01-code/src/com/sj/IOAndProperties/a.txt");
            // 写数据的时候,会把10机制的整数97转换为二进制整数1100001
            // 记事本存储的是ASCII表中的a
            fos.write(97);
            fos.close();
        }
    }
    
    

    2)、追加写/续写:使用两个参数的构造方法

    public class Demo03OutputStream {
        public static void main(String[] args) throws IOException {
            FileOutputStream fos = new FileOutputStream("b.txt", true);
            for (int i = 0; i < 5; i++) { 
                fos.write("你好".getBytes());
                //换行符-- windows: \r\n  linux: \n  mac: \r
                fos.write("\r".getBytes());
            }
            fos.close();
        }
    }
    

    2、FileOutStream
    1)、一次读取一个字节

    public class Demo01InputStream {
        public static void main(String[] args) throws IOException {
            // a.txt   ===>  abc
            FileInputStream fis = new FileInputStream("a.txt");
            int len = 0;
            while ((len = fis.read()) != -1) {
                System.out.print((char) len);
            }
            fis.close();
        }
    }
    

    2)、一次读取多个字节

    public class Demo02InputStream {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("a.txt");
            // byte可以起到缓冲作用,一次读取多个字节
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fis.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }
            fis.close();
        }
    }
    

    4、IO字符流

    字节流在读取中文时,可能会出现读取不完整的情况,出现乱码现象
    1、FileReader
    文件字符输入流
    作用:把硬盘文件中的数据以字符的方式读取到内存中
    java.io.FileReader extends InputStreamReader extends Reader

    public class Demo02Reader {
        public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("b.txt");
            char[] cs = new char[1024];
            int len = 0;
            while ((len = fr.read(cs)) != -1) {
                System.out.println(new String(cs, 0, len));
            }
            fr.close();
        }
    }
    

    2、FileWriter
    文件字符输出流:把内存中的字符数据写入到文件中
    java.io.FileWriter extends OutputStreamWriter extends Writer
    使用步骤
    1)、创建FileWriter对象,构造方法中绑定要写入数据的目的地
    2)、使用FileWriter中的方法writer,把数据写入到内存缓冲区中(字符转换为字节的过程)
    3)、使用flush,把内存缓冲区中数据,刷新到文件中,对象可以继续使用。
    4)、释放资源(先刷新到缓存区中,然后通知系统释放资源,流对象不可用)

    public class Demo03Writer {
        public static void main(String[] args) throws IOException {
            FileWriter fw = new FileWriter("");
            fw.write(97); // 写入到内存缓冲区中
            fw.flush();
            fw.close(); // 也可以将数据写入到文件中
        }
    }
    

    try catch 处理

    public class Demo01TryCatch {
        public static void main(String[] args) {
            //提高变量fw的作用域,让finally可以使用
            //变量在定义的时候,可以没有值,但是使用的时候必须有值
            //fw = new FileWriter("09_IOAndProperties\\g.txt",true); 执行失败,fw没有值,fw.close会报错
            FileWriter fw = null;
            try{
                //可能会产出异常的代码
                fw = new FileWriter("w:\\09_IOAndProperties\\g.txt",true);
                for (int i = 0; i <10 ; i++) {
                    fw.write("HelloWorld"+i+"\r\n");
                }
            }catch(IOException e){
                //异常的处理逻辑
                System.out.println(e);
            }finally {
                //一定会指定的代码
                //创建对象失败了,fw的默认值就是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在把资源释放
                if(fw!=null){
                    try {
                        //fw.close方法声明抛出了IOException异常对象,所以我们就的处理这个异常对象,要么throws,要么try catch
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    JDK7的异常处理情况

    public class Demo02JDK7 {
        public static void main(String[] args) {
            try(//1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
                FileInputStream fis = new FileInputStream("c:\\1.jpg");
                //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
                FileOutputStream fos = new FileOutputStream("d:\\1.jpg");){
                //可能会产出异常的代码
                //一次读取一个字节写入一个字节的方式
                //3.使用字节输入流对象中的方法read读取文件
                int len = 0;
                while((len = fis.read())!=-1){
                    //4.使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
                    fos.write(len);
                }
            } catch (IOException e){
                //异常的处理逻辑
                System.out.println(e);
            }
        }
    }
    

    JDK9异常处理情况

    public class Demo03JDK9 {
        public static void main(String[] args) throws IOException {
            //1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
            FileInputStream fis = new FileInputStream("c:\\1.jpg");
            //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
            FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
    
            try(fis;fos){
                //一次读取一个字节写入一个字节的方式
                //3.使用字节输入流对象中的方法read读取文件
                int len = 0;
                while((len = fis.read())!=-1){
                    //4.使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
                    fos.write(len);
                }
            }catch (IOException e){
                System.out.println(e);
            }
            //fos.write(1);//Stream Closed
        }
    }
    

    相关文章

      网友评论

          本文标题:[java]11、文件

          本文链接:https://www.haomeiwen.com/subject/sgckoltx.html