JavaEE初阶--File类的用法,InputStream,OutputStream的用法

目录

一、引言

二、File类

2.1属性

2.2构造方法

2.3方法

三、文件内容的读写--数据流

3.1InputStream概述

1.方法

3.2OutputStream概述

1.方法

四、小程序练习

五、总结


一、引言

  本篇博客继续讲解文件IO的知识,本次讲解的是File类的用法以及InputStream,OutputStream的用法。

二、File类

2.1属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String类型的表示
static charpathSeparator依赖于系统的路径分隔符,char类型的表示

2.2构造方法

签名说明
File(File paren,String child)根据父目录+孩子文件路径,创建一个新的File实例
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径
File(String parent,String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示

2.3方法

代码示例:

public class Main{
    public static void main(String args[]){
        File file= new File("..\\test.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    } 
}

  File的创建以及删除:

public class Test {
    public static void main(String[] args) throws IOException {
        File file= new File("text.txt");
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());
    }
}

普通文件的删除:

public class Test2 {
    public static void main(String[] args) throws IOException {
        File file=new File("test2.txt");
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        System.out.println(file.delete());
        System.out.println(file.exists());
    }
}

观察deleteOnExit的现象:

public class Test3 {
    public static void main(String[] args) throws IOException {
        File file=new File("test.txt");
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        file.deleteOnExit();
        System.out.println(file.exists());
    }
}

观察目录的创建:

public class Test4 {
    public static void main(String[] args) {
        File dir = new File("some-dir");
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdir());
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
    }
}

观察目录创建2:

public class Test5 {
    public static void main(String[] args) {
        File dir =new File("some-dir2\\some-dir1");
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdir());
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
    }
}

//上述结果全是false,与上面一个代码结果不同,
//这是因为mkdir()若中间目录不存在,
//则无法创建成功,这时需要使用mkdirs();

观察文件重命名:

public class Test6 {
    public static void main(String[] args) {
        File file=new File("test.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());
    }
}

三、文件内容的读写--数据流

3.1InputStream概述

1.方法

修饰符及返回值类型方法签名说明
intread()读取一个字节的数据,返回-1代表已经完全读完了。
intread(byte [] b)最多读取b.length字节的数据到b中,返回实际读到的数量,-1代表以及读完了。
intread(byte[] b ,int off,int len)最多读取len-off字节的数据到b中,返回实际读取的数量,-1代表以及读完了
voidclose()关闭字节流

说明

InputStream只是一个抽象类,要使用还需要具体的类。

FileInputStream

构造方法:

签名说明
FileInputStream(File file)利用File构造文件输入流
FIleInputStream(String name)利用文件路径构造文件输入流

代码示例:

public class Test7 {
    public static void main(String[] args) {
        try(InputStream is =new FileInputStream("test.txt")){
            while(true){
                int b=is.read();
                if(b==-1){
                    break;
                }
                System.out.printf("%c",b);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
public class Test8 {
    public static void main(String[] args) throws FileNotFoundException {
        try(InputStream is =new FileInputStream("test.txt")){
            byte [] buf =new byte[1024];
            int len;
            while(true){
                len= is.read(buf);
                if(len==-1){
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c",buf[i]);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

利用Scanner进行字符读取

public class Test9 {
    public static void main(String[] args) {
        try(InputStream is =new FileInputStream("test.txt")){
            try(Scanner scanner = new Scanner(is,"UFT-8")){
                while(scanner.hasNext()){
                    String s=scanner.next();
                    System.out.print(s);
                }
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3.2OutputStream概述

1.方法

代码示例:

public class Test10 {
    public static void main(String[] args) {
        try(OutputStream os =new FileOutputStream("output.txt")){
            os.write('H');
            os.write('E');
            os.write('L');
            os.write('L');
            os.write('O');
            os.flush();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

四、小程序练习

1.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
public class Demo11 {
    public static void main(String[] args) {
        //1.输入必要的信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要搜索的目录:");
        String rootPath=scanner.next();
        System.out.println("请输入要查询的词:");
        String searchWord=scanner.next();

        //构造File对象,检查路径是否合法
        File rootFile=new File(rootPath);
        if(!rootFile.isDirectory()){
            System.out.println("输入的路径非法!");
            return;
        }

        //3.进行递归搜索
        searchFile(rootFile,searchWord);
    }

    private static void searchFile(File rootFile,String searchWord){
        //1.列出当前目录有哪些内容
        File [] files=rootFile.listFiles();
        if(files==null){
            //空目录,返回
            return;
        }
        //2.遍历目录下的每个结果,进行判定。
        for(File f:files){
            if(f.isFile()){
                String fileName =f.getName();
                if(fileName.contains(searchWord)){
                    System.out.println("找到匹配结果为:"+f.getAbsolutePath());
                }
            }else if (f.isDirectory()){
                searchFile(f,searchWord);
            }
        }
    }
}

2.进行普通文件的复制

public class Demo12 {
    public static void main(String[] args) {
        //1.输入必要信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要复制的文件路径:");
        String srcPath=scanner.next();
        System.out.println("请输入要复制到的目标路径:");
        String destPath=scanner.next();

        //2.验证上述路径是否合法
        File srcFile=new File(srcPath);
        if(!srcFile.isFile()){
            System.out.println("输入的要复制的文件路径非法!");
            return ;
        }
        File destFile=new File(destPath);
        if(!destFile.getAbsoluteFile().isDirectory()){
            System.out.println("输入的要复制的目标路径非法!");
            return ;
        }

        //3.读写文件
        try(InputStream inputStream=new FileInputStream(srcFile);
            OutputStream outputStream=new FileOutputStream(destFile)){
            while(true){
                byte [] bytes=new byte[1024];
                int n=inputStream.read(bytes);
                if(n==-1){
                    break;
                }
                outputStream.write(bytes,0,n);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

3. 扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

public class Demo13 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要搜索的路径:");
        String path=scanner.next();
        System.out.println("请输入要查询的词:");
        String searchWord=scanner.next();

        File rootFile =new File(path);
        if(!rootFile.isDirectory()){
            System.out.println("当前输入的路径非法!");
            return ;
        }

        search(rootFile,searchWord);
    }

    private static void search(File rootFile,String searchWord){
        File [] files=rootFile.listFiles();
        if(files==null){
            return ;
        }
        for(File f:files){
            if(f.isFile()){
                matchWord(f,searchWord);
            }else if(f.isDirectory()){
                search(f,searchWord);
            }
        }
    }

    private static void matchWord(File f,String searchWord){
        try(Reader reader=new FileReader(f)){
            StringBuilder stringBuilder=new StringBuilder();
            while(true){
                int c=reader.read();
                if(c==-1){
                    break;
                }
                stringBuilder.append((char)c);
            }
            // 循环结束, 此时文件所有的内容, 就都进入 stringBuilder 了
            if(stringBuilder.indexOf(searchWord)>=0){
                System.out.println("找到了匹配的结果:"+f.getAbsolutePath());
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

五、总结

  本篇博客简单介绍了IO中的InputStream和OutputStream的方法以及小程序练习,欢迎大家在评论区讨论,感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值