Java 基础入门 | 第十四章 File以及I/O流

简介: File类的使用java.io.File类代表硬盘上的一个文件或者目录java.io.File类作用每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文

File类的使用

java.io.File类

代表硬盘上的一个文件或者目录

java.io.File类作用

每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管理操作,例如,创建、删除等操作。

Java中文件或者目录的路径表示

Windows中文件或者目录的表示D:\test\1.txt

Java中文件或者目录的表示D:\\test\\1.txt,或者D:/test/1.txt

File类的构造方法

由于File类的每一个对象都表示的是一个具体的目录或者文件,所以File类没有提供无参的构造方法,File类的所有构造方法都需要一个目录或者文件的路径作为参数

    • File(String pathname)
    • File(String parent, String child)
    • File(File parent, String child)

    创建File对象

    import java.io.File;
    public class FileDemo {
        public static void main(String[] args) {
            File f1=new File("D:\\file\\test.txt");
            File f2=new File("D:\\file","test.txt");
            File parent=new File("D:\\file");
            File f3=new File(parent,"test.txt");
        }
    }

    image.gif

    File类常用方法

      • boolean createNewFile()创建一个新文件
      • boolean mkdir() / mkdirs()创建新的目录
      • boolean delete() 删除文件或者目录
      • void deleteOnExit() 虚拟机退出时删除文件或者目录
      • boolean exists() 判断当前文件或者目录是否存在
      • boolean isFile() 判断File对象代表的是否是一个文件
      • boolean isDirectory() 判断File对象代表的是否是一个目录
      • String getPath() 返回当前File对象的字符串路径
      • String getName()返回当前File对象的文件名或者目录名
      • String getParent()返回当前File对象的父级目录
      • String getAbsolutePath()返回当前File对象的绝对路径
      • String[]list()返回当前File对象包含的子目录以及文件

      代码示例

      import java.io.File;
      import java.io.IOException;
      import java.util.Date;
      public class GetFileInfos {
          public static void main(String[] args) throws IOException {
              File file=new File("D:\\file\\test.txt");
              System.out.println("文件是否存在: "+file.exists());
              if(!file.exists()){
                  System.out.println("创建新文件: "+file.createNewFile());
              }
              System.out.println("文件名: "+file.getName());
              System.out.println("文件路径: "+file.getPath());
              System.out.println("父级目录: "+file.getParent());
              System.out.println("是否可读: "+file.canRead());
              System.out.println("是否可写: "+file.canWrite());
              System.out.println("是否隐藏: "+file.isHidden());
              System.out.println("是否是文件夹: "+file.isDirectory());
              System.out.println("是否是文件: "+file.isFile());
              System.out.println("文件路径是否是绝对路径: "+file.isAbsolute());
              System.out.println("文件最后修改时间: "+new Date(file.lastModified()));
              System.out.println("文件大小: "+file.length()+"bytes");
          }
      }

      image.gif

      I/O流

      流的概念

      什么是流  

        • 流是一组有序的,有起点和终点的字节集合,是对计算机中数据传输的总称或者抽象。
        • 即数据在两个设备间的传输称为流,流的本质是数据传输(传输数据的载体)。
        • 流序列中的数据可以是没有进行加工的原始数据(二进制字节数据),也可以是经过编码的符合某种格式规定的数据,Java中提供了不同的流类对它们进行处理。

        什么是I/O流

        I/O流是java中InputStream(输入流)和 OutputStream(输出流)的首字母简称。

        输入流(InputStream)

        在Java中,程序可以打开一个输入流,输入流的信息源可以位于文件、内存或网络套接字(socket)等地方,信息源的类型可以是包括对象、字符、图像、声音在内的任何类型。一旦打开输入流后,程序就可从输入流串行地读数据。

        image.gif编辑

        输出流(OutputStream)

        类似地,程序也能通过打开一个输出流并顺序地写入数据来将信息送至目的端。

        image.gif编辑

        流的分类

        按照流传输方向不同    

          • 输入流(InputStream)
          • 输出流(OutputStream)

          按照处理数据类型的不同

            • 字节流  
            • 字符流  

            按照流的基本功能不同

              • 节点流
              • 过滤流

              字节流

              字节流的概念

              传输的数据单位是字节,也意味着字节流能够处理任何一种文件

              字节流的组成

                • 字节输入流 InputStream
                • 字节输出流 OutputStream

                image.gif编辑

                InputStream 是所有输入流流的父类,是一个抽象类

                image.gif编辑 OutputStream 是所有输出流流的父类,是一个抽象类image.gif编辑

                FileInputStream文件输入流类

                FileInputStream常用方法

                构造方法

                  • FileInputStream(String filename)
                  • FileInputStream(File file)

                  常用方法

                    • close()
                    • int read()
                    • int read(byte[]b)
                    • int read(byte[] bs, int off, int len)

                    代码示例

                    import java.io.FileInputStream;
                    import java.io.IOException;
                    public class FileInputStreamTest {
                        public static void main(String[] args) throws IOException {
                            FileInputStream fis=new FileInputStream("D:\\file\\test.txt");
                            //读取一个字节的内容
                            int bt=fis.read();
                            System.out.println(bt);
                            byte[] bts=new byte[1024];
                            //读取多个多个字节的内容,放置到数组bts里,返回的是实际读取到的字节数
                            int kb=fis.read(bts);
                            System.out.println(kb);
                        }
                    }

                    image.gif

                    在test.txt文本文件里写上”哈喽,大家好,我是洛阳的泰山!“类似的内容

                    import java.io.FileInputStream;
                    import java.io.IOException;
                    public class FileInputStreamTest {
                        public static void main(String[] args) throws IOException {
                            FileInputStream fis=new FileInputStream("D:\\file\\test.txt");
                            //读取一个字节的内容
                            byte[] buf=new byte[1024];
                            while(true){
                                int length=fis.read(buf);
                                //读取结束时返回-1
                                if(length==-1){
                                    break;
                                }
                                System.out.println(new String(buf, 0, length));
                            };
                            //关闭文件输入流
                            fis.close();
                        }
                    }

                    image.gif

                    FileOutputStream字节输出流类

                    FileOutputStream常用方法

                    常用构造方法

                      • FileOutputStream(String path)
                      • FileOutputStream(File file)
                      • FileOutputStream(String path, boolean append)
                      • FileOutputStream(File file, boolean append)

                      常用方法

                        • close()
                        • void write(int v)
                        • void write(byte[] bs)
                        • void write(byte[] bs, int off, int len)

                        代码示例

                        import java.io.FileOutputStream;
                        import java.io.IOException;
                        import java.nio.charset.StandardCharsets;
                        public class FileOutputStreamTest {
                            public static void main(String[] args) throws IOException {
                                String text="洛阳泰山,yyds!!!";
                                //utf-8字符格式的字节
                                byte[] bytes=text.getBytes(StandardCharsets.UTF_8);
                                FileOutputStream fos=new FileOutputStream("D:\\file\\test.txt");
                                //将内容写入test.txt文本文件
                                fos.write(bytes);
                                //每次使用完I/O流后,记得关闭,节省计算机资源和安全
                                fos.close();
                            }
                        }

                        image.gif

                        字符流

                        字符流的组成

                          • Reader
                          • Writer

                          image.gif编辑

                          FileReader

                            • FileReader(String  fileName)
                            • close()
                            • int read(char[] cbuf)

                            FileWriter

                              • FileWriter(String fileName)
                              • close()
                              • write(String value)

                              InputStreamReader和OutputStreamWriter

                              特点:  

                                • 可以把一个字节流转换成一个字符流
                                • 在转换时可以执行编码方式

                                InputStreamReader

                                  • InputStreamReader(InputStream  is)
                                  • InputStreamReader(InputStream  is   String charSet)
                                  • int read(char[] cbuf)

                                  OutputStreamWriter

                                    • OutputStreamWriter(OutputStream  is)
                                    • OutputStreamWriter(OuputtStream  is   String charSet)
                                    • write(String value)

                                    代码示例

                                    import java.io.*;
                                    public class ReaderTest {
                                        public static void main(String[] args) {
                                            try {
                                            InputStream is = new FileInputStream("D:\\file\\test.txt");
                                            InputStreamReader reader=new InputStreamReader(is);
                                            char[] cbuf=new char[1024];
                                            int len=0;
                                            while ((len=reader.read(cbuf))!=-1){
                                                for (int i = 0; i < len; i++) {
                                                    char c = cbuf[i];
                                                    System.out.print(c);
                                                }
                                                System.out.println();
                                            }
                                            } catch (FileNotFoundException e) {
                                                e.printStackTrace();
                                            } catch (IOException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    }

                                    image.gif

                                    过滤流

                                    过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。

                                    几种常见的过滤流

                                      • BufferedInputStream和BufferedOutputStream 缓冲流,用于提高输入/输出处理的效率。DataInputStream和DataOutputStream不仅能读/写数据流,而且能读/写各种的java语言的基本类型,如:boolean,int,float等。
                                      • LineNumberInputStream 除了提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。
                                      • PushbackInputStream提供了一个方法可以把刚读过的字节退回到输入流中,以便重新再读一遍。
                                      • PrintStream打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流

                                      过滤流的开发步骤

                                        • 创建节点流
                                        • 基于节点流创建过滤流
                                        • 读/写数据
                                        • 关闭外层流

                                        代码示例

                                        import java.io.*;
                                        public class DataStreamTest {
                                            public static void main(String[] args) throws IOException {
                                                //文件地址
                                                String filePath="D:\\file\\test.txt";
                                                //创建文件输出流
                                                FileOutputStream fos=new FileOutputStream(filePath);
                                                //创建数据输出流
                                                DataOutputStream dos=new DataOutputStream(fos);
                                                //写入圆周率
                                                dos.writeDouble(3.1415);
                                                //关闭数据输出流
                                                dos.close();
                                                //关闭文件输出流
                                                fos.close();
                                                //创建文件输入流
                                                FileInputStream fis=new FileInputStream(filePath);
                                                //创建数据输入流
                                                DataInputStream dis=new DataInputStream(fis);
                                                //读取double类型的数据
                                                double PI=dis.readDouble();
                                                //关闭数据输入流
                                                dis.close();
                                                //关闭文件输入流
                                                fis.close();
                                                //打印数据
                                                System.out.println(PI);
                                            }
                                        }

                                        image.gif

                                        import java.io.BufferedOutputStream;
                                        import java.io.FileOutputStream;
                                        import java.io.IOException;
                                        import java.nio.charset.StandardCharsets;
                                        public class BufferedStreamTest {
                                            public static void main(String[] args) throws IOException {
                                                String data="洛阳泰山,牛逼666!!!";
                                                byte[] bts=data.getBytes(StandardCharsets.UTF_8);
                                                //创建文件输出流
                                                FileOutputStream fos=new FileOutputStream("D:\\file\\test.txt");
                                                //创建缓冲输出流
                                                BufferedOutputStream bos=new BufferedOutputStream(fos);
                                                //写入文本数据
                                                bos.write(bts);
                                                bos.close();
                                                fos.close();
                                            }
                                        }

                                        image.gif

                                        import java.io.FileOutputStream;
                                        import java.io.IOException;
                                        import java.io.ObjectOutputStream;
                                        import java.io.Serializable;
                                        public class ObjectStreamTest {
                                           static class Student implements Serializable {
                                                String name;
                                                int age;
                                                public Student(String name, int age) {
                                                    this.name = name;
                                                    this.age = age;
                                                }
                                            }
                                            public static void main(String[] args) throws IOException {
                                                Student stu=new Student("泰山",28);
                                                //创建文件输出流
                                                FileOutputStream fos=new FileOutputStream("D:\\file\\test.txt");
                                                //创建对象输出流
                                                ObjectOutputStream oos=new ObjectOutputStream(fos);
                                                //写入对象
                                                oos.writeObject(stu);
                                                oos.close();
                                                fos.close();
                                            }
                                        }

                                        image.gif

                                        BufferedReader  

                                          • 字符过滤流
                                          • 提供了缓冲功能
                                          • 可以一行一行的读取内容
                                          • public String readLine()

                                          完整的字符输入流的开发步骤

                                            • 创建节点流
                                            • 桥转换为字符流
                                            • 在字符流的基础上封装过滤流
                                            • 读/写数据
                                            • 关闭外层流
                                            import java.io.*;
                                            public class PrintStreamTest {
                                                public static void main(String[] args) throws IOException {
                                                    //创建文件输出流(true 表示数据可以拼接)
                                                    OutputStream os=new FileOutputStream("D:\\file\\test.txt",true);
                                                    //字创建符打印流
                                                    PrintWriter pw=new PrintWriter(os);
                                                    pw.print("hallo,洛阳泰山");
                                                    //刷新
                                                    pw.flush();
                                                    //关闭
                                                    os.close();
                                                }
                                            }

                                            image.gif

                                            PrintWriter 介绍

                                            具有自动行刷新的缓冲字符输出流,特点是可以按行写出字符串,并且可以自动行刷新。

                                            java.io.BufferedWriter是缓冲字符输出流,内部有缓冲区可以进行块写操作提供效率,

                                            而PrintWriter就是通过连接它实现的缓冲功能(PW的很多构造方法内部自动连接它)。

                                            PW支持两个直接对文件写操作的构造方法:

                                              • PrintWriter(File f)传文件名
                                              • PrintWriter(String s)传路径

                                              以上两种方法都支持一个重载,就是再传入一个参数

                                              PrintWriter 特性

                                                • 允许我们制定写出字符时的字符集。
                                                • PrintWriter给人一种可以直接对文件进行操作的假象
                                                • PW是一个高级流
                                                • 实际上PW包装了字节流、字符流和字符缓冲流。
                                                • PW负责自动行刷新
                                                • bw负责提高效率
                                                • osw负责读字符
                                                • fos负责写字节
                                                • 最后PW能够按行很快地把一个字符串变成字节写在文件中
                                                相关文章
                                                |
                                                20天前
                                                |
                                                算法 Java 开发者
                                                Java 编程入门:从零到一的旅程
                                                本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
                                                |
                                                21天前
                                                |
                                                存储 Java 程序员
                                                Java中的集合框架:从入门到精通
                                                【8月更文挑战第30天】在Java的世界里,集合框架是一块基石,它不仅承载着数据的存储和操作,还体现了面向对象编程的精髓。本篇文章将带你遨游Java集合框架的海洋,从基础概念到高级应用,一步步揭示它的奥秘。你将学会如何选择合适的集合类型,掌握集合的遍历技巧,以及理解集合框架背后的设计哲学。让我们一起探索这个强大工具,解锁数据结构的新视角。
                                                |
                                                23天前
                                                |
                                                Java 程序员 UED
                                                Java中的异常处理:从入门到精通
                                                【8月更文挑战第28天】在Java编程的世界里,异常处理是一块基石,它确保了程序的健壮性和可靠性。本文将通过深入浅出的方式,带你了解Java异常处理的基本概念、分类、以及如何有效地捕获和处理异常。我们将一起探索try-catch-finally结构的奥秘,并学习如何使用throws关键字声明方法可能会抛出的异常。此外,我们还会讨论自定义异常类的创建和使用,以及最佳实践。无论你是Java新手还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识,帮助你编写出更加稳定和可靠的代码。
                                                |
                                                23天前
                                                |
                                                编解码 网络协议 Oracle
                                                java网络编程入门以及项目实战
                                                这篇文章是Java网络编程的入门教程,涵盖了网络编程的基础知识、IP地址、端口、通讯协议(TCP和UDP)的概念与区别,并提供了基于TCP和UDP的网络编程实例,包括远程聊天和文件传输程序的代码实现。
                                                java网络编程入门以及项目实战
                                                |
                                                8天前
                                                |
                                                Java 程序员
                                                Java中的异常处理:从入门到精通
                                                在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
                                                |
                                                20天前
                                                |
                                                Java 程序员 UED
                                                Java 中的异常处理:从入门到精通
                                                【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。
                                                |
                                                20天前
                                                |
                                                Java 数据库连接 开发者
                                                Java中的异常处理:从入门到精通
                                                【8月更文挑战第31天】 在编程世界中,错误和异常就像是不请自来的客人,总是在不经意间打扰我们的程序运行。Java语言通过其异常处理机制,为开发者提供了一套优雅的“待客之道”。本文将带你走进Java异常处理的世界,从基础语法到高级技巧,再到最佳实践,让你的程序在面对意外时,也能从容不迫,优雅应对。
                                                |
                                                20天前
                                                |
                                                Java 开发者
                                                Java 中的异常处理:从入门到精通
                                                【8月更文挑战第31天】在Java的世界中,异常处理是保持程序健壮性的基石。本文将带你探索Java异常处理的奥秘,从基本的try-catch语句到深入理解自定义异常和最佳实践。你将学会如何优雅地处理错误,确保你的代码不仅能够面对意外情况,还能从中恢复。让我们一起开启这段旅程,掌握让程序更加稳定和可靠的技巧吧!
                                                |
                                                23天前
                                                |
                                                机器学习/深度学习 Java TensorFlow
                                                深度学习中的图像识别:从理论到实践Java中的多线程编程入门指南
                                                【8月更文挑战第29天】本文将深入探讨深度学习在图像识别领域的应用,从基础理论到实际应用案例,带领读者一步步理解如何利用深度学习技术进行图像识别。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库实现一个基本的图像识别模型。无论你是初学者还是有一定经验的开发者,都能从中获得启发和学习。 【8月更文挑战第29天】在Java世界里,线程是程序执行的最小单元,而多线程则是提高程序效率和响应性的关键武器。本文将深入浅出地引导你理解Java多线程的核心概念、创建方法以及同步机制,帮助你解锁并发编程的大门。
                                                |
                                                26天前
                                                |
                                                存储 Java 开发者
                                                Java数据类型:从入门到精通,你不得不看的“宝典”
                                                Java数据类型:从入门到精通,你不得不看的“宝典”
                                                36 0