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能够按行很快地把一个字符串变成字节写在文件中
                                                相关文章
                                                |
                                                19天前
                                                |
                                                存储 缓存 Oracle
                                                Java I/O流面试之道
                                                NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
                                                Java I/O流面试之道
                                                |
                                                10天前
                                                |
                                                监控 安全 Java
                                                Java中的多线程编程:从入门到实践####
                                                本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
                                                |
                                                16天前
                                                |
                                                Java 大数据 API
                                                14天Java基础学习——第1天:Java入门和环境搭建
                                                本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
                                                |
                                                22天前
                                                |
                                                存储 安全 Java
                                                🌟Java零基础-反序列化:从入门到精通
                                                【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
                                                62 5
                                                |
                                                19天前
                                                |
                                                安全 Java 调度
                                                Java中的多线程编程入门
                                                【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
                                                32 1
                                                |
                                                22天前
                                                |
                                                Java 编译器 Maven
                                                Java“class file contains wrong class”解决
                                                当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
                                                |
                                                25天前
                                                |
                                                Java 数据处理 开发者
                                                Java多线程编程的艺术:从入门到精通####
                                                【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
                                                43 3
                                                |
                                                27天前
                                                |
                                                Java
                                                Java中的多线程编程:从入门到精通
                                                本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
                                                |
                                                29天前
                                                |
                                                存储 安全 Java
                                                从入门到精通:Java Map全攻略,一篇文章就够了!
                                                【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
                                                44 4
                                                |
                                                28天前
                                                |
                                                Java
                                                [Java]Socket套接字(网络编程入门)
                                                本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
                                                23 1