Java IO,2021最新百度、头条等公司Java社招面试题目

| 方法 | 作用 |

| — | — |

| length() | 返回由此抽象路径名表示的文件的长度 |

    • File​(File parent, String child)

      从父抽象路径名和子路径名字符串创建新的 File实例。

      File​(String pathname)

      通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

      File​(String parent, String child)

      从父路径名字符串和子路径名字符串创建新的 File实例。

传入的路径的字符串如果是相对路径是相对于Project所在路径的。


File file = new File("D:\\java\\file1.txt"); //双\\为转义字符

System.out.println(file);

File file2 = new File("D:\\java","file2.txt");//父路径,子路径

System.out.println(file2);

File parent = new File("D:\\java");

File file3 = new File(parent,"file3.txt");//父路径,子路径

System.out.println(file3);

//获取文件分隔符

    String separator=File.separator;

    File d=new File("c:"+separator+"test");

    if(!d.exists()) {

        /*

            创建新的目录(文件夹),这里只有一级目录,所以可以使用mkdir()创建

            如果是C://test//abc,test目录不存在,必须使用mkdirs()创建,否则报错



        */

        d.mkdirs();

    }

  

    System.out.println("这是目录?"+d.isDirectory());

    //声明文件

    File f=new File("c:"+separator+"test"+separator+"ab.txt");

    //判断文件/文件夹是否存在,!表示flase时执行下面语句

    if(!f.exists()) {

        //创建新的文件

        f.createNewFile();

    }

    //获取文件名

    System.out.println(f.getName());

    //获取上一级目录

    System.out.println(f.getParent());

    //获取全局路径

    System.out.println(f.getPath());

    //判断是不是文件

    System.out.println(f.isFile());

    //获取长度

    System.out.println(f.length());

    //获取目录下的文件/文件夹

    String[] fe=d.list();

    //遍历目录下的所有文件

    for(String s:fe) {

        System.out.println(s);

    }

    //删除文件

    f.delete();

    //删除目录

    d.delete();

    }

 public static void listFiles(File[]files){

        if (files!=null&&files.length>0){

            for (File file : files) {

                if (file.isFile()){

                    if (file.getName().endsWith(".avi")){

                        if (file.length()>200*1024*1024){

                            file.delete();

                            System.out.println(file.getAbsolutePath()+"已被删除");

                        }

                    }

                }else {

                    File[] files1 = file.listFiles();

                    listFiles(files);

                }

            }

        }

    }//递归删除大小超过200MB的.avi文件(删除会彻底删除不会到回收站,因此千万不要随便删除文件,尤其是c盘的文件)

```



 以上方法可以使用`listFiles(FileFilter f)方法简化`



### 什么是IO流?  



流是一种抽象概念,它代表了数据的无结构化传递(`数据的流从源头流到目的地`)。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。`比如文件拷贝,包括了输入流和输出流。输入流从文件中读取数据存储到进程(process)中,输出流从进程中读取数据然后写入到目标文件。`简而言之,以流的形式对文件读写操作。数据的传输类似”水流"。所有 I/O 都被视为单个的 字节的移动,通过一个称为 Stream 的对象一次移动一个字节。



### Java 中 IO 流的分类?



1 按照流的方向:**输入流**(inputStream)和**输出流**(outputStream)



2 按照实现功能分:**节点流**(可以从或向一个特定的地方读写数据(直接对文件的读写操作),如 FileReader)和**处理流**(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写如BufferedReader)



3 按照处理数据的单位: **字节流**和**字符流**。分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个)其余的流都是由它们派生出来的。



*   InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输⼊流。

*   OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。



1.  字节流:操作 byte 类型数据,主要操作类是 OutputStream、InputStream 的子类;不用缓冲区,直接对文件本身操作。字节流适合所有类型文件的数据传输(因为计算机字节(Byte)是电脑中表示信息含义的最小单位)若只是读写文件,和文件内容无关时,一般选择字节流.

2.  字符流:操作字符类型数据,主要操作类是 Reader、Writer 的子类;使用缓冲区缓冲字符, 不关闭流就不会输出任何内容。字符流只能够处理纯文本数据,其他类型数据不行,但是字符流处理文本要比字节流处理文本方便。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流.



**节点流(类)**有:(能直接对文件的读写操作)



1.  字节流:`OutputStream`(输出)、`InputStream`(输入)  -- 子类:FileOutputStream,FileInputStream

2.  字符流:`Writer`(输出)、`Reader`(输入)  -- 子类FileWriter,FileReader



**处理流可以分为****转化流和装饰流**



**转化类:**在读取文件的时候会常常遇到乱码,而转化类可以帮助转换为对应的字符编码格式。



OutputStreamWriter(输出流使用),InputStreamReader(输入流使用)



**装饰类:**在流的传输过程中,使用**缓存**进行了”装饰“。



*   字节缓存流:`BufferedOutputStream`(输出缓存)、`BufferedInputStream`(输入缓存)

*   字符缓存流:`BufferedWriter`(输出缓存)、`BufferedReader`(输入缓存)



![](https://img-blog.csdnimg.cn/20210723185721158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzE4MzE2OA==,size_16,color_FFFFFF,t_70)



![](https://img-blog.csdnimg.cn/2021072318580564.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzE4MzE2OA==,size_16,color_FFFFFF,t_70)



**既然有了字节流,为什么还要有字符流?**



不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流 操作要分为字节流操作和字符流操作呢? 因为字节流是由 Java 虚拟机将字节转换得到的,但是这个过程十分耗时,并且,如果不知道编码类型就**很容易出现乱码**。所以, I/O 流就提供了⼀个直接操作字符的接口, 方便平时对字符进行流操作。音频,图片等媒体文件使用字节流比较好,如果涉及到字符的话使用字符流比较好。



> Java一个汉字占几个字节

> 

> [https://www.cnblogs.com/lslk89/p/6898526.html](https://codechina.csdn.net/m0_60958482/java-p7)



 **字节流和字符流哪个好?**  

大多数情况下使用字节流会更好,因为字符流是字节流的包装,而大多数时候IO操作都是直接操  

作磁盘文件、所以**任何流在传输时都是以字节的方式进行的**(图片,视频等文件都是按字节存储)  

如果对于操作需要通过IO在内存中频繁处理字符串的情况使用字符流会好些,因为字符流具备缓冲区,提高了性能。



**字节流如何转为字符流?**



字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对 象。 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。




# 更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

![image](https://img-blog.csdnimg.cn/img_convert/00700af7bf8db979850ddbc156bbc939.png)



> **[点击免费领取我的学习笔记:学习视频+大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图](https://codechina.csdn.net/m0_60958482/java-p7)**

# 高效学习视频

eeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中...(img-4lESh8AU-1630207246521)]



> **[点击免费领取我的学习笔记:学习视频+大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图](https://codechina.csdn.net/m0_60958482/java-p7)**

# 高效学习视频

![image](https://img-blog.csdnimg.cn/img_convert/a63cd85d31ad50a481a2340d6a4d076a.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值