java-详解File类,InputStream和OutStream的用法

目录

File类

属性

常用的三种构造方法

public File(String parent,String child)

public file(String pathname)

public File(File  parent ,String child)

 常用的成员方法

 判断方法

 特殊的删除方法 :

mkdir() 和 mkdirs() 的区别 

 list()  和 Filelist() 

 renameTo() 

 InputStream 和 OutStream

InputStream

常用的方法

FileInputStream

利用Scanner进行字符读取

 OutStream

 实现一个简单的目录查询程序

 每日一言


File类

这里的重点主要就是File类中的属性,构造方法和他的一些常用方法

我们先来看看他的属性有哪些

属性

static String pathSeparator :   依赖于系统的路径分隔符.类型是String

static char pathSeparator :      依赖于系统路径的分隔符, 类型是char

static static separator:              系统中一个路径中多个名称之间的分隔符

常用的三种构造方法

public File(String parent,String child)

根据父目录 + 孩子文件路径,创建一个新的File实例

代码:

public static void main (String[] args) {
    File file1 = new File("D:\\parent\\chile","parent");
            System.out.println(file1.getName());
            System.out.println(file1);
}

java-详解File类,InputStream和OutStream的用法_第1张图片

public file(String pathname)

根据文件路径创建一个新的File实例,路径可以是绝对路径或者是相对路径

代码:

 public static void main(String[] args) throws IOException {
        //不要求这个文件真实存在
        //根据文件路径创建一个File实例,路径可以是绝对路径或者是相对路径
        // ./表示从当前路径下创建文件
        File file = new File("./tt.jpg");
        System.out.println("返回file对象的纯文件目录 :");
        System.out.println(file.getName());
 }
 
  

public File(File  parent ,String child)

根据父目录 + 孩子文件路径,创建一个新的File实例,父目录用文件路径表示

代码:

public static void main(String[] args) {
File file1 = new File("D:\\parent\\chile","parent");
        //System.out.println(file1.getName());
        System.out.println("file1 的文件路径 : " + file1);
        File file2 = new File(file1,"taat");
        System.out.println("file2 的文件路径 : " + file2);
}

java-详解File类,InputStream和OutStream的用法_第2张图片

 

常用的成员方法

String getParent() 返回 File 对象的父目录文件路径
String getName() 返回 FIle 对象的纯文件名称
String getPath() 返回 File 对象的文件路径
String getAbsolutePath() 返回 File 对象的绝对路径
String getCanonicalPath() 返回 File 对象的修饰过的绝对路径

代码示例:

    public static void main(String[] args) throws IOException {
        //不要求这个文件真实存在
        //根据文件路径创建一个File实例,路径可以是绝对路径或者是相对路径
        File file = new File("./tt.jpg");
        System.out.println("返回file对象的纯文件目录 :");
        System.out.println(file.getName());
        System.out.println("返回file父类对象的目录文件路径 :");
        System.out.println(file.getParent());
        System.out.println("返回file对象的文件路径 :");
        System.out.println(file.getPath());
        System.out.println("返回file对象的绝对路径 :");
        System.out.println(file.getAbsolutePath());
        System.out.println("返回file对象修饰过的绝对目录 :");
        System.out.println(file.getCanonicalPath());
    }

java-详解File类,InputStream和OutStream的用法_第3张图片

 

判断方法

boolean exists() 判断 File 对象描述的文件是否真实存在
boolean isDirectory() 判断 File 对象代表的文件是否是一个目录
boolean isFile() 判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile() 根据 File 对象,自动创建一个空文件。成功创建后返
回 true
boolean delete() 根据 File 对象,删除该文件。成功删除后返回 true

代码:

    public static void main(String[] args) throws IOException {
        File file = new File("./tt.jpg");
       //判断file对象代表的文件是不是一个普通的文件
        System.out.println(file.isFile());
        //判断file对象描述的文件是否真实存在
        System.out.println(file.exists());
        //判断file对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());

        //根据 File对象,自动创建一个空文件。成功创建后返回true
        file.createNewFile();
  
        System.out.println(file.isFile());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        //删除文件
        file.delete();
        System.out.println("删除文件之后");
        //删除之后判断这个文件还是否还真实存在
        System.out.println(file.exists());
    }

java-详解File类,InputStream和OutStream的用法_第4张图片

 

特殊的删除方法 :

deleteOnExit() 

//会把这文件标识删除,真正删除的操作会在JVM停止运行后进行

    public static void main(String[] args) throws IOException {
        File file = new File("./hello_world.txt");
       //判断file对象代表的文件是不是一个普通的文件
        System.out.println(file.isFile());
        //判断file对象描述的文件是否真实存在
        System.out.println(file.exists());
        //判断file对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());
        //根据 File对象,自动创建一个空文件。成功创建后返回true
        file.createNewFile();

        System.out.println(file.isFile());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        file.deleteOnExit();
        System.out.println("删除文件之后");
        //判断删除后这个文件还是否真实存在
        System.out.println(file.exists());
    }

java-详解File类,InputStream和OutStream的用法_第5张图片

mkdir() 和 mkdirs() 的区别 

mkdir() :  必须要在存在的目录下创建文件夹,否则会创建失败

mkdirs() : 优化了mkdir() 在不存在的目录下创建文件夹,会先创建不存在的目录然后创建这个文件夹

 class FileTest {
     public static void main(String[] args) {
         mkdir();
         mkdirs();
     }
    public static void mkdir() {
        boolean flag = false;
        //使用不存的目录创建文件夹
        String path = "D:\\cl1\\学习资料\\java";
        File file = new File(path);
        //他如果不存在,就开始创建
        if (!file.exists() && !file.isDirectory()) {
            //mkdir只能在已经存在的目录下进行创建
            flag = file.mkdir();
        }
        System.out.println(flag);
    }

    public static void mkdirs() {
        boolean flag = false;
        String path = "D:\\Lzm1\\学习资料\\C++";
        File file = new File(path);
        if (!file.exists() && !file.isDirectory()) {
            //mkdir 可以在不存在的目录下进行创建,如果整理目录不存在他会自己创建好这个目录
            flag = file.mkdirs();
        }
        System.out.println(flag);
    }
}

java-详解File类,InputStream和OutStream的用法_第6张图片

 list()  和 Filelist() 

    public static void main(String[] args) {
        File file = new File("test-dir");
        String[] results = file.list();
        //返回该目录下所有文件名
        System.out.println(Arrays.toString(results));
        File[] results2 = file.listFiles();
        //返回该目录下所有的文件名(File类型表示)
        System.out.println(Arrays.toString(results2));
    }

java-详解File类,InputStream和OutStream的用法_第7张图片

 renameTo() 

按照以下规则这样就可以完成重命名

    public static void main(String[] args) {
        File file = new File("D:\\Lzm\\666.txt"); // 这个文件需要存在
        File dest = new File("dest.txt"); // 他是不存在的
        System.out.println(file.exists());
        System.out.println(dest.exists());
        System.out.println(file.renameTo(dest));
        System.out.println(file.exists());
        System.out.println(dest.exists());
    }
 
  

 InputStream 和 OutStream

InputStream

常用的方法

最常用的就是read()-读取 和 colse()-关闭

read:

有三个常用的重载方法

read()  -- 读取一个字节的数据,返回-1表示已经读完了

read(byte[]  b)   --最多读取b.length字节的数据到b中,返回实际读到的数据量

read(byte[] b, int off,int len)   --最多读取len到off字节的数据到b中 ,返回实际读到的数量

void colse() --关闭资源

InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream

FileInputStream

//先执行了写入操作
java-详解File类,InputStream和OutStream的用法_第8张图片

 

 public static void main(String[] args) throws IOException {

        try (InputStream inputStream = new FileInputStream("d:/test.txt")) {
            // 读文件 返回值为int
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                   //读完之后直接结束
                    break;
                }
                System.out.printf("%x\n", b);
            }
        }
    }

        java-详解File类,InputStream和OutStream的用法_第9张图片

利用Scanner进行字符读取

对字符类型直接使用 InputStream 进行读取是非常麻烦的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner类

构造方法

Scanner(InputStream is,String charSet)  --使用charSet的字符集进行is的扫描读取

 class Main {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("D:\\Lzm\\666.txt")) {
            try (Scanner scanner = new Scanner(is, "UTF-8")) {
                while (scanner.hasNext()) {
                    String s = scanner.next();
                    System.out.print(s);
                }
            }
        }
    }
}

 

OutStream

常用的方法

write(int b)    --写入要给的字节数据

write(byte[] b)    --  将b这个字符数组的数据全部写入OS中

write(byte[] b,int off, int len)     --将b这个字符数组中从off开始的数据写入OS中,写入len个

close()     --关闭字节流

flush()     --调用flush (刷新) 操作,将数据刷到设备中

 public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

java-详解File类,InputStream和OutStream的用法_第10张图片

 

实现一个简单的目录查询程序

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
       //指定一个搜索的根目录
        System.out.println("请输入要扫描的根目录: ");
        File rootDir = new File(scanner.next());
        //判断如果不是一个目录就进行报错
        if (!rootDir.isDirectory()) {
            System.out.println("输入有误, 您输入的目录不存在!");
            return;
        }
        // 输入要查询的词
        System.out.println("请输入要查询的词: ");
        String word = scanner.next();

        // 然后进行目录的遍历查找,放入根目录和要查询的词
        scanDir(rootDir, word);
    }

    private static void scanDir(File rootDir, String word) {
        //列出根目录下的子菜单,如果为空直接结束
        File[] files = rootDir.listFiles();
        if (files == null) {
            return;
        }
        // 如果有东西就进行遍历查找
        for (File f : files) {
            System.out.println("当前搜索到: " + f.getAbsolutePath());
            if (f.isFile()) {
                //如果是文件就打开看看是否包含当前关键字
                String content = readFile(f);
                if (content.contains(word)) {
                    System.out.println(f.getAbsolutePath() + " 包含要查找的关键字!");
                }
            } else if (f.isDirectory()) {
                //如果是目录就继续递归
                scanDir(f, word);
            } else {
               //啥也不是就跳过
                continue;
            }
        }
    }

    private static String readFile(File f) {
        // 由于咱们匹配的是字符串, 此处只能按照字符流处理
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)) {
            //一次读一个字符,读出来的进行拼接,以String的方式进行返回
            while (true) {
                int c = reader.read();
                if (c == -1) {
                    break;
                }
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }

java-详解File类,InputStream和OutStream的用法_第11张图片

 

每日一言

奴才总不过是寻人诉苦。只要这样,也只能这样。——鲁迅先生

你可能感兴趣的:(文件,java,开发语言,jvm,java-ee)