• 廖雪峰Java6IO编程-1IO基础-1IO简介


    1.IO简介

    IO是指Input/Output,即输入和输出:

    • Input指从外部读取数据到内存,例如从磁盘读取,从网络读取。

      * 为什么要把数据读到内存才能处理这些数据呢?
      * 因为代码是在内存中运行的,数据也必须读取到内存。数据在Java中的表现形式是byte数组、字符串。

    • Output指把数据从内存输出到外部,例如写文件,输出到网络。
      * Output是把Java的表现格式如byte数组、字符串输出到某个地方,如硬盘的某个文件。

    IO流是一种顺序读写数据的模式:

    • 单向流动,类似水管中水的流动,因此称为IO流
    • 字节流:以byte为最小单位
    • 字符流:
      * Java提供了Reader/Writer表示字符流。Reader/Writer本质上是一个能自动编解码的InputStream/OutputStream。数据源是字节,读入的数据是char字符,原因是Reader内部把读入的byte做了编码,Writer也是一样的。
      * 字符流传输的最小数据单位是char
      * 字符流输出的byte取决于编码方式
            String fname = "Hi你好";
    
            //将String转化为byte数组,注意byte是10进制的,如果要转化为16进制,需要再次转换
            byte[] tbytes = fname.getBytes();
            System.out.println("字符串转换为byte数组:"+Arrays.toString(tbytes));
            //byte数组转换为String类型
            String fbyte = new String(tbytes);
            System.out.println("byte数组转换为字符串:"+fbyte);
    
            //将String转化为char数组
            char[] tchars = fname.toCharArray();
            System.out.println("字符串转换为char数组:"+Arrays.toString(tchars));
            //char数组转化为String类型
            String fchars = new String(tchars);
            System.out.println("char数组转换为字符串:"+fchars);
            //for(int i=0;i<tchars.length;i++){
    //            int c = tchars[i];
    //
    //            System.out.print(Integer.toHexString(c)+"	");
    //        }
            //System.out.println("u0048u0069u4f60u597d");
    
    使用Reader/Writer,还是InputStream/OutputStream,取决于具体的使用场景: 如果数据源不是文本,就只能使用InputStream/OutputStream,如果是文本,使用Reader/Writer更方便。

    同步IO:

    • 读写IO时代码等待数据返回后才继续执行后续代码
    • 代码编写简单,CPU执行效率低
    • 例子:肯德基吃饭,等待做好后开吃
    • JDK的Java.io是同步IO功能

      异步IO:
    • 读写IO时仅发出请求,然后立刻执行后续代码
    • 代码编写复杂,CPU执行效率高
    • 例子:肯德基吃饭,点好先去逛街,等待做好再回来吃
    • JDK的Java.nio是异步IO功能

    总结:

    • IO流是一种流式的数据输入/输出模型
    • 二进制数组以byte为最小单位在InputStream/OutputStream中单向流动
    • 字符数据以char为最小单位在Reader/Writer中单向流动
    • JDK的java.io包提供了同步IO功能
    • Java的IO流的接口和实现是分离的
      * 字节流接口:InputStream/OutputStream
      * 字符流接口:Reader/Writer

    2.File对象

    Java.io.File表示文件系统的一个文件或者目录,创建File对象本身不涉及IO操作

    2.1访问文件名相关的方法

    获取路径/绝对路径/规范路径:getPath()/getAbsolutePath()/getCanonicalPath()

    • getPath():获取的是pathName参数
    • 绝对路径是从根目录开始的完整路径
    • 相对路径是从相对当前工作目录的路径,传入当前路径的时候,相对路径前加上当前目录就是绝对路径
    • getName():返回File对象所表示的文件名或路径名
    • getParent():返回File对象对应目录的父目录
    • boolean renameTo(File newName):重命名次File对象所对应的文件或目录,如果重命名成功返回true;否则返回false。

    不同系统对于路径的表示不一样:

    • windows:C:Windows est.txt
    • Linux:/usr/Download/text.txt
    import java.io.File;
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            //获取当前目录
            System.out.println("System.getProperty("user.dir"):	"+System.getProperty("user.dir"));
            File f1 = new File("");
            System.out.println("绝对路径:	"+f1.getAbsolutePath());
            //获取当前目录下的子目录
            File f2 = new File("./src");
            System.out.println("./src:	"+f2.getPath());
            System.out.println("./src绝对路径:	"+f2.getAbsolutePath());
            System.out.println("./src规范路径:	"+f2.getCanonicalPath());
            //获取当前目录下的子目录
            File f3 = new File("src");
            System.out.println("src:	"+f3.getPath());
            System.out.println("src绝对路径:	"+f2.getAbsolutePath());
            System.out.println("src规范路径:	"+f2.getCanonicalPath());
            //获取上一级目录
            File f = new File("..");
            String path1 = f.getPath();
            String path2 = f.getAbsolutePath();
            String path3 = f.getCanonicalPath();
            System.out.println("..path:	"+path1);
            System.out.println("..绝对路径:	"+path2);
            System.out.println("..规范路径:	"+path3);
        }
    }
    

    2.2文件检测相关的方法

    • boolean exists():判断File对象所对应的文件或目录是否存在
    • isFile():是否是已存在的文件
    • isDirectory():是否是已存在的目录
    • boolean canRead():是否允许读取该文件
    • boolean canWrite():是否允许写入该文件
    • boolean canExcute():是否允许执行该文件
    • boolean isAbsolute():判断File对象所对应的文件或目录是否是绝对路径。该方法消除了不同平台的差异,可以直接判断File对象是否是绝对路径。Linux路径开头是“/”,Windows路径开头是盘符。
    import java.io.File;
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            File f1 = new File("log");
            File f2 = new File("log/all.log");
            System.out.println(f1.getCanonicalPath()+"是目录"+f1.isDirectory());
            System.out.println(f2.getCanonicalPath()+"是文件:"+f2.isFile());
            if(f2.isFile()){
                System.out.println(f2.getCanonicalPath()+"可以被读取:"+f2.canRead());
                System.out.println(f2.getCanonicalPath()+"可以被写入:"+f2.canWrite());
                System.out.println(f2.getCanonicalPath()+"可以被执行:"+f2.canExecute());
                System.out.println(f2.getCanonicalPath()+"文件大小:"+f2.length());
            }
        }
    }
    
    ### 2.3获取文件常规信息 * long lastModified():返回文件的最后修改时间 * long length():获取文件内容的长度

    2.4文件创建、删除

    当File对象表示一个文件时(isFile==true):

    • boolean createNewFile():创建一个新文件
    • static File createTempFile(String prefix, String suffix):创建一个临时文件,prefix文件名,suffix代表文件类型,可以为null,此时默认".tmp"
    • static File createTempFile(String prefix, String suffix, File directory):在执行目录创建一个临时文件
    • boolean delete():删除该文件
    • void deleteOnExit():在JVM退出时删除该文件
    import java.io.File;
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException, InterruptedException {
            File newFile = new File("log/feeling.txt");
            System.out.println(newFile.getCanonicalPath());
            newFile.createNewFile();
            Thread.sleep(3000);
            newFile.delete();
            File tempFile = File.createTempFile("log/tempfeeling","txt");
            System.out.println(tempFile.getCanonicalPath());
            Thread.sleep(3000);
            tempFile.deleteOnExit();
        }
    }
    
    ### 2.4目录操作的方法 目录操作(isDirectory()==true ): * String[] list():列出目录下的文件和子目录名,返回字符串数组。 * File[] listFiles():列出目录下的文件和子目录名,返回File对象数组 * File[] listFiles(FileFilter filter):过滤不想要的文件 * File[] listFiles(FilenameFilter filter) * boolean mkdir():创建该目录 * boolean mkdirs():创建该目录,并在必须要将不存在的父目录也创建出来,相当于Linux的mkdir -p * delete():删除该目录 ```#java import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.Arrays;

    public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
    File dir1 = new File("log/DasAuto/Audi");
    dir1.mkdirs();
    File dir2 = new File("log/feel");
    dir2.mkdir();
    File dir = new File("log");
    if (dir.isDirectory()){
    System.out.println(Arrays.toString(dir.list()));
    System.out.println(Arrays.toString(dir.listFiles()));
    File[] fs = dir.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
    return name.endsWith(".sh");
    }
    });
    System.out.println(Arrays.toString(fs));
    }
    dir1.delete();
    dir2.delete();
    }
    }

    <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190324195529024-2111250719.png" width="500" />
    
    ###    2.5文件过滤器
    File类的list方法还可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。这里的FilenameFilter接口和java.swing.filechooser包下的FileFilter抽象类的功能非常相似,可以把FileFilter当成FilenameFilter的实现类,当Sun并没有让FileFilter实现FilenameFilter接口。
    FilenameFilter接口接收2个参数,dir和name
    <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190325225021223-1993544036.png" width="500" />
    list方法接收FilenameFilter类型过滤器
    <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190325225223694-2094055769.png" width="500" />
    Main.java
    ```#java
    import java.io.File;
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            File file = new File(".");
            String[] list = file.list((dir,name)->name.endsWith(".java")||new File(name).isDirectory());
            for(String name:list){
                System.out.println(name);
            }
        }
    }
    

    2.6总结:

    File对象表示一个文件或者目录

    • 创建File对象本身不涉及IO操作
    • 获取路径/绝对路径/规范路径:getPath()/getAbsolutePath()/getCanonicalPath()
    • 可以获取目录的文件和子目录
    • 通过File对象可以创建或删除文件和目录

    3.File练习

    GetDir.java ```#java import java.io.File; import java.io.IOException;

    public class GetDir {
    private String pathName;
    public GetDir() {
    this.pathName = ".";
    }
    public GetDir(String pathName) {
    this.pathName = pathName;
    }
    public void getDir() throws IOException {
    File path = new File(".");
    int num = path.getCanonicalPath().split("/").length-1;
    System.out.println(path.getCanonicalPath().split("/")[num]);
    printdir(path,num);
    }
    static void printdir(File path,int num) throws IOException{
    File[] fs = path.listFiles();
    for(File f:fs){
    if(f.isDirectory()){
    path(f,num);
    printdir(f,num);
    }else if(f.isFile()){
    path(f,num);
    }
    }
    }

    static void path(File f,int n) throws IOException{
        String s = f.getCanonicalPath();
        String[] ss = s.split("/");
        for(int i=n;i<ss.length-1;i++){
            System.out.print("	");
        }
        System.out.println(ss[ss.length-1]);
    }
    

    }

    Main.java
    ```#java
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            GetDir getDir = new GetDir();
            getDir.getDir();
        }
    }
    
  • 相关阅读:
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第7节 内部类_7_内部类的概念与分类
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第6节 权限修饰符_6_四种权限修饰符
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_5_final关键字用于修饰成员变量
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_4_final关键字用于修饰局部变量
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_3_final关键字用于修饰成员方法
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_2_final关键字用于修饰类
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_1_final关键字概念与四种用法
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第4节 多态_24_笔记本USB接口案例_实现
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第4节 多态_23_笔记本USB接口案例_分析
    阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第4节 多态_22_用instanceof关键字进行
  • 原文地址:https://www.cnblogs.com/csj2018/p/10590014.html
Copyright © 2020-2023  润新知