Java中IO字符流、File类

目录

一、概述

1、字符流分类:

2、FileWriter使用:

3、追加写入:

4、实现换行

5、五种writer方法的重载

6、FileReader的使用

7、BufferedXxx和FileXxx的区别:

8、BufferedWriter额外方法:

9、BufferedReader额外方法:

10、代码实例

二、File 类

1、File类的概述和作用

2、File类静态的成员变量

3、File 类的构造方法

4、File 类创建、删除文件(文件、文件夹)

5、File 类获取功能

6、File 类判断功能

7、File 类 list 获取功能

8、文件过滤器

9、递归全目录,寻找指定文件


一、概述

IO流是用来传输数据的,如文件的读写,有字节流和字符流之分,字节流可以处理任何文件数据,字符流只能处理纯文本文件,这里说的是字符流。

1、字符流分类:

  • 字符输入流:FileReader、BufferedReader
  • 字符输出流:FileWriter、BufferedWriter

2、FileWriter使用:

  • 创建:FileWriter fw  =  new FileWriter("xxx.txt");
  • 写入:fw.write("Hoello");
  • 关闭:fw.close();

3、追加写入:

  • FileWriter fw  =  new FileWriter("xxx.txt",true);    //第二个参数为 true

4、实现换行

  • 在Windows中: \r\n
  • 在macOS中:\r或\n
  • 在Linux中:\n

5、五种writer方法的重载

  • 写字符串的整体:public  void  writer(String  str);
  • 写字符串的部分:public  void  writer(String  str,int  offset,int  count);
  • 写字符数组的整体:public  void  writer(Char[]  array);
  • 写字符数组的部分:public  void  writer(Char[]  array,int  offset,int  count);
  • 写单个字符对应的数字(参考ASCII码或Unicode表):public  void  writer(int  ch);

6、FileReader的使用

  • 创建:FileReader  fr  =  new  FileReader("xxx.txt");
  • 读单个字符:
    int  ch;    //单个字符的ASCII值
    while((ch = fr.read()) != -1)
    {
        //......
    }
  • 读字符数组:
    char[]  buf  =  new  char[1024];
    int  len;    //有效个数
    while((len = fr.read(buf)) != -1)
    {
        String  str  =  new  String(buf,0,len);
    }

7、BufferedXxx和FileXxx的区别:

  • BufferedXxx有一个8192长度的char[]字符数组作为缓冲区
  • BufferedXxx性能更高

8、BufferedWriter额外方法:

  • public  void  newLine(),根据操作系统自动换行

9、BufferedReader额外方法:

  • public void newLine(),读取一行字符串,不包含换行符

10、代码实例

  • FileWriter  &  FileReader
package File;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        FileWriter fw1 = new FileWriter("test1.txt");     //创建FileWrite对象(覆盖写入)
        //重载一:写字符串的整体
        fw1.write("Hello,my love!");     //调用writer方法写数据
        fw1.write("\r\n");      //Windows系统中的换行方式
        fw1.write("LongRu\r\n");
        //重载二:写字符串的部分
        String str = "Hello,my love,Longru!";
        fw1.write(str,14,7);
        fw1.write("\r\n");
        //重载三:写字符数组的整体
        char[] array1 = {'H','e','l','l','o'};
        fw1.write(array1);
        fw1.write("\r\n");
        //重载四:写字符数组的部分
        char[] array2 = {'M','y',' ','l','o','v','e'};
        fw1.write(array2,3,4);
        fw1.write("\r\n");
        //重载五:写单个字符
        fw1.write(65);
        fw1.write(48);
        fw1.write("\r\n");
        fw1.close();     //调用close方法关闭流

        FileWriter fw2 = new FileWriter("test2.txt",true);     //创建FileWrite对象(追加写入)
        fw2.write("Hello,my love!");     //调用writer方法写数据
        fw2.write("LongRu");
        fw2.close();     //调用close方法关闭流

        System.out.println("==================================================");

        //重载一:读取单个字符
        FileReader fr1 = new FileReader("test1.txt");
        int ch;
        while ((ch = fr1.read()) != -1)
        {
            System.out.println((char) ch);
        }
        //重载二:读取指定长度字符
        FileReader fr2 = new FileReader("test2.txt");
        char[] buf = new char[2];
        int len;    //代表有效个数
        while ((len = fr2.read(buf)) != -1)
        {
            String str3 = new String(buf,0,len);
            System.out.println(str3);
        }
        fr2.close();
    }
}
  • BufferedWriter   &   BufferedReader 
package BufferFile;

import java.io.*;

public class Main {
    public static void main(String[] ages) throws IOException {
        FileWriter fw = new FileWriter("test3.txt");        //创建BufferedWriter
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write("hello");      //写入
        bw.newLine();       //BufferedWriter特有的自动根据操作系统换行功能
        bw.write("My love!");
        bw.close();     //关闭

        //读单个字符,其实是从8192的缓冲区读取单个字符
        FileReader fr = new FileReader("test3.txt");        // 创建BufferedReader
        BufferedReader br = new BufferedReader(fr);
        int ch;
        while ((ch = br.read()) != -1)
        {
            System.out.println((char)ch);
        }
        br.close();

        //BufferedReader提供了一个读取一行字符串的方法
        FileReader fr2 = new FileReader("test1.txt");        // 创建BufferedReader
        BufferedReader br2 = new BufferedReader(fr2);
        String line;        //代表一行字符串
        while ((line = br2.readLine()) != null)
        {
            System.out.println(line);
        }
    }
}

二、File 类

1、File类的概述和作用

  • File类是文件和目录路径名的抽象表示形式
  • Java中把文件或者目录(文件夹)都封装成File对象
  • 在硬盘上操作文件,直接使用 File 类

2、File类静态的成员变量

  • pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串
  • separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
public static void main(String[] args) {
    //File类静态成员变量
    //与系统有关的路径分隔符
    String separator = File.pathSeparator;
    System.out.println(separator);// 是一个分号,目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束)  Linux中是冒号 :
	
    //与系统有关的默认名称分隔符
    separator = File.separator;
    System.out.println(separator);// 向右 \  目录名称分割  Linux / 
}

3、File 类的构造方法

  • File(String pathname):将路径封装File类型对象
  • File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
  • File(File parent,String child):将parent封装成file对象
public static void main(String[] args){
    //将路径封装File类型对象
    String pathName = "F:\\TestPath";
    File f1 = new File(pathName);//将Test22文件封装成File对象。注意;有可以封装不存在文件或者文件夹,变成对象。
    System.out.println(f1);

    //根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
    File f2 = new File("F:\\TestPath","a.txt");
    System.out.println(f2);

    //将parent封装成file对象。
    File dir = new File("F:\\TestPath");
    File f3 = new File(dir,"a.txt");
    System.out.println(f3);
}

4、File 类创建、删除文件(文件、文件夹)

  • public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
  • public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
  • public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
  • public boolean delete():删除文件或者文件夹
public static void main(String[] args) throws IOException {
    //创建文件
    File F1 = new File("F:\\TestPath\\a.txt");
    boolean B1 = F1.createNewFile();
    System.out.println(B1);

    //创建文件夹
    File F2 = new File("F:\\TestPath\\a");
    boolean B2 = F2.mkdir();
    System.out.println(B2);

    //删除文件
    File F3 = new File("F:\\TestPath\\a.txt");
    boolean B3 = F3.delete();
    System.out.println(B3);
}

5、File 类获取功能

  • String getName():返回路径中表示的文件或者文件夹名(获取路径中的最后部分的名字)
  • long length(): 返回路径中表示的文件的字节数
  • String getAbsolutePath():获取绝对路径,返回String对象
  • File   getAbsoluteFile() :获取绝对路径,返回File对象
  • String getParent():获取父路径,返回String对象
  • File getParentFile():获取父路径,返回File对象
public static void main(String[] args) throws IOException {
    File F1 = new File("F:\\TestPath\\a.txt");
    F1.createNewFile();
    String S1 = F1.getName();   //返回路径中表示的文件或者文件夹名,即获取路径中最后部分的名字
    long L1 = F1.length();      //返回路径中表示的文件的字节数
    File absolute = F1.getAbsoluteFile();   //获取绝对路径,返回File对象
    File parent = F1.getParentFile();    //获取父路径,返回File对象
    System.out.println(S1);
    System.out.println(L1);
    System.out.println(absolute);
    System.out.println(parent);
}

6、File 类判断功能

  • boolean exists():判断File构造方法中封装路径是否存在
  • boolean isDirectory():判断File构造方法中封装的路径是不是文件夹
  • boolean isFile():判断File构造方法中封装的路径是不是文件

7、File 类 list 获取功能

  • String[] list():获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
  • File[] listFiles():获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
  • static File[] listRoots(): 列出可用的文件系统根 
public static void main(String[] args)
{
    File dir = new File("F:\\TestPath");
    //获取的是目录下的当前的文件以及文件夹的名称。
    String[] names = dir.list();
    for(String name : names){
        System.out.println(name);
    }
    System.out.println("========================");
    //获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
    File[] files = dir.listFiles();
    for(File file : files){
        System.out.println(file);
    }
}

注意:

  • 指定的目录必须存在
  • 指定的必须是目录,否则容易返回数组null,出现NullPointerException

8、文件过滤器

使用文件过滤器可以删选出某些关键字的文件或文件夹,即过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹

常用方法:

  • public String[] list(FilenameFilter filter):
  • public File[] listFiles(FileFilter filter):

自定义过滤器类

//自定义过滤器实现FileFilter接口,重写抽象方法
public class myFilter implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        return pathname.getName().endsWith(".txt");
    }
}

在main中调用

public static void main(String[] args)
{
    File F = new File("F:\\TestPath");
    File[] filearr = F.listFiles(new myFilter());
    for(File f : filearr)
    {
        System.out.println(f);
    }
}

分析:

  • listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname
  • accept方法接收了参数pathname,参数是listFiles传递来的
  • 在accept方法中,进行判断,如果这个路径是txt文件,返回true,走着返回false
  • 一旦方法返回了true,listFiles将路径保存到File数组中

9、递归全目录,寻找指定文件

自定义过滤器

//自定义过滤器实现FileFilter接口,重写抽象方法
public class myFilter implements FileFilter {
    public boolean accept(File pathname) {
        if(pathname.isDirectory()) {
            return true;
        }
        return pathname.getName().endsWith(".txt");
    }
}

在main中递归调用

public static void main(String[] args)
{
    File F = new File("F:\\TestPath");
    gitAllDir(F);   //递归遍历所有目录
    gitAllTxt(F);    //递归遍历所有txt文件
}

public static void gitAllDir(File F)
{
    //System.out.println(F);
    //调用方法listFiles()对目录,dir进行遍历
    File[] allFile = F.listFiles();
    for(File f : allFile)
    {
        //System.out.println(f);
        //判断变量f表示的路径是不是文件夹
        if(f.isDirectory())
        {
            //是一个目录,就要去调用getAllDir递归遍历这个目录
            gitAllDir(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

private static void gitAllTxt(File F)
{
    File[] fileTxt = F.listFiles(new myFilter());
    for(File f : fileTxt)
    {
        //System.out.println(f);
        if(f.isDirectory())
        {
            gitAllTxt(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ONESTAR博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值