首页 > 编程语言 >Java 文件 I/O流详解

Java 文件 I/O流详解

时间:2024-08-04 11:28:45浏览次数:14  
标签:文件 Java 字节 创建 详解 File java 目录

文件

文件操作是Java开发中一个重要的组成部分,它允许开发者对文件进行读取,写入,创建,删除和修改等操作,文件操作的主要通过java.io包中的类来实现的,其中的File类更是文件操作的核心类

File类的常用方法

创建文件或目录

  • 文件创建

    使用createNewFile();可以创建一个新的空文件,如果文件已存在则不建立,并放回false,反正创建文件并返回true

    public class Test1 {
        public static void main(String[] args) {
          File file = new File("D:\\java_develop\\demo.txt");
          //创建一个文件对象其路径为"D:\\java_develop\\demo.txt" 
          //这一步还没有创建文件 
            try {  //此处的try-catch主要用于捕获未找到文件路径的异常
                boolean isFileCreate=file.createNewFile();
                //使用createNewFile()方法尝试再指定文件创建文件
                //并将其放回值赋值给isFileCreate
                if (isFileCreate)
                {   //根据isFileCreate的值确定十分已创建了文件
                    System.out.println("File created successfully");
                }
                else
                {
                    System.out.println("File already exists");
                }
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }
    }
    

    该代码执行过后会再D盘下的java_develop文件下创建一个demo.txt的文件

  • 目录创建

    创建目录实际是在文件系统下生成一个新的目录(也可以称为文件夹),目录可以用于存储文件或者其他的目录,以便将文件分类分组管理

    • mkdir() :用于创建File对象表示的单级目录,若创建的目录没有夫级目录,则不会创建这些夫目录,并返回false ,例如你要在"D:\\java_develop\\demo\\folder” 路径创建目录,若dome目录不存在,则会创建失败
     File dir = new File("D:\\java_develop\\demo");
        //创建File对象传入其路径
        
            try {
                boolean isCreateDir=dir.mkdir();
                //使用mkdir()方法创建目录
                if (isCreateDir) //通过mkdir()返回值,判断目录是否创建
                {
                    System.out.println("dir creates successfully");
                }
                else
                {
                    System.out.println("fail to create dir");
                }
            } catch (Exception e) {
               e.printStackTrace();
            }
    

    上述代码执行之后会在D盘java_develop文件夹下创建一个demo文件夹

    • mkdirs():创建多级目录,于mkdir()相比之下,mkdirs() 在父目录不存在时,会优先创建父目录,再创建其下的子目录,即使一下目录层次不存在时,也可以创建整个目录路径,从而实现多级目录创建,创建成功返回true
    File dir = new File("D:\\java_develop\\demo\\inside");
    //创建带有路径的File对象
            try {
                boolean isDirCreate=dir.mkdirs();//使用mkdirs()创建多级目录
                if (isDirCreate)
                {
                    System.out.println("Dir creates successfully");
                }
                else
                {
                    System.out.println("Failed to create Dir");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    执行后会在D盘java_develop下创建demo文件夹,在demo文件夹会创建inside文件夹

获取文件信息

  • exists():判断文件或目录是否存在,存在返回true,反之返回false
  • getName():返回File对象的文件或目录的名称字符串
  • getParent() :获取文件或目录的父级路径,若文件或目录没有父级路径时,则返回null
  • isFile():判断此File对象是否为文件(而不是目录)
  • isDirectory() :判断此File对象是否为目录(而不是文件)
  • listFiles() :回一个File数组,这些File对象表示由此File对象表示的目录中的文件和目录。如果此File对象不表示一个目录,则此方法返回null ,可以用于获取某个目录下的所有文件夹/名
  • length(): 获取文件大小值
    File file = new File("D:\\java_develop");
        File fileArray[]=file.listFiles();
        for (File f : fileArray) {
            System.out.println(f.getName());
        }
    }

删除文件或目录

  • delete() :删除文件或空目录。如果删除的是目录,则该目录必须为空,否则删除失败并返回false
     File file = new File("D:\\java_develop\\demo.txt");
       if (file.exists())
       {
           file.delete();
       }
    }

重命名文件

renameTo(File dest): 将文件重命名为此File对象表示的路径名。如果目标文件已存在,则该文件将被删除,然后重命名操作将尝试进行

 File file = new File("D:\\java_develop\\demo.txt");
        File file1 = new File("D:\\java_develop\\demo1.txt");
        if (file.exists())//检查file对象是否存在 
        {//存在则将其重命名为file1的路径
            file.renameTo(file1);
        }
    }

上述代码运行之后,原本的demo.txt会更改为demo1.txt

IO流

Java中的IO(input/output)是实现输入输出的基础,可以方便的实现数据的输入输出操作,Java把不同的输入/输出源抽象成”流(stream)”,它通过了逐个/块数据的读写方式,流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两个设备间的传输成为流,流的本质是数据传输

IO流的类别

  • IO流分为字符流和字节流,其中有分为输入流和输出流,如果是音频文件、图片、歌曲、就用字节流好点,如果关系到中文的,用字符流好点。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流可以。

以下是IO流的基本分类类别:

字符流

字符流是以字符(char)为最下单位进行读写的数据流.主要用于处理文本数据,如字符,字符串等等.字符流的读写操作是通过ReaderWriter 类及其子类实现的

Reader

  • 是所有字符输入流的超类,它定义了一些基本方法,如read(),ready(),skip(),和close()
  • int read():返回的数据类型为int类型,读取单个字符时,返回的是其的Unicode值,读取到流的末尾时,返回-1
  • int read( char []ch):将字符写入数组,并返回读取的字符数,读取到流的末尾时,返回-1
  • void close():关闭流,释放与之关联的资源

Writer

  • 是所有字符输出流的超类
  • void write(int c):写入单个字符
  • void write(char []ch):写入字符数组
  • void write(char[] cbuf)void write(char[] cbuf, int off, int len):写入字符数组或字符数组的一部分。同样,这些方法也没有返回值
  • void flush():刷新writer的缓冲区,会强制所有缓冲字符被写出
  • void close(): 关闭该writer,并释放其所有与系统相关的资源,每次输出完都要进行close()操作,因为可能缓冲区的字符还没写入,用close()进行强制写出

Buffered

  • Buffered机制具体来说是在内存中创建一个缓冲区,来减少实际I/O流的操作次数
  • 底层原理:数据首先会被写入或被读入内存中的缓冲区,而不是直接进行I/O操作.一旦缓冲区满了或到达某个条件(如显性的调用flush()方法),缓冲区的内容会被一次性的写入或被次磁盘读取
  • Buffered与File的区别:
File Buffered(以BufferedReader为例)
定义与功能 封装了文件系统的操作功能,关注文件在磁盘上的存储。 提供带有缓冲区的输入/输出方式,关注数据的高效读取/写入。
主要方法 getName(), getPath(), exists(), createNewFile(), delete()等。 read(), readLine(), mark(), reset()等(BufferedReader特有)。
用途 用于表示文件和目录的路径名,进行文件或目录的创建、删除、重命名等操作。 用于高效地读取文本数据,特别是大文件。
处理数据的方式 直接操作文件系统的文件或目录,不涉及数据的缓冲处理。缓冲区为8192字节 通过内部缓冲区来减少I/O操作的次数,提高数据处理的效率。缓冲区为8192字符
try {
            FileReader reader = new FileReader("D:\\java_develop\\demo1.txt");
            FileWriter writer = new FileWriter("D:\\java_develop\\output.txt");
            int ch;
            while((ch=reader.read())!=-1) 
            {// 若read返回-1说明读取到文件末尾则直接跳出循环
              writer.write(ch);
            }
            reader.close();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

字节流

是用于处理原始字节数据,字节流非常适合用于处理二进制文件,如照片,音频,视频或任何非文本格式的数据.Java中的字节流的基本类是InputStreamOutputStream

InputStream和OutStream

  • InputStream:用于从数据源读取字节数据.数据源可以是文件,网络连接,内存中的字节数组等等
  • OutputStream :用于向目的地写入字节数据,与InputStream一样的数据源可以是文件,网络连接,内存中的字节数组等等

基本操作方法

  • int InputStream.read(): 读取单个字节或字节数组,返回值为int类型
  • int InputStream.read(byte b[]):将读取的数据存在在byte b[]数组中
  • void OutputStream.write(int b): 写入单个字节
  • void OutputStream.write(byte b[]):将byte b[]数组中的数据写入
  • void OutputStream.write(byte[] b, int off, int len): 写入字节数组的指定部分。
  • close(): 关闭流,释放系统资源。
  • getBytes():获取字节数组
  • 节点流
    • FileInputStream 和 FileOutputStream:用于读写文件中的字节数据。
    • ByteArrayInputStream 和 ByteArrayOutputStream:用于在内存中读写字节数组。
    • Socket.getInputStream() 和 Socket.getOutputStream():用于处理网络连接中的字节数据传输。
  • 过滤流
    • BufferedInputStream 和 BufferedOutputStream:为字节流添加缓冲机制,以提高读写效率。
    • DataInputStream 和 DataOutputStream:提供读写基本数据类型(如 intdouble 等)的能力。
    • ObjectInputStream 和 ObjectOutputStream:用于对象的序列化和反序列化,即对象的读写。
try {
            FileInputStream inputStream = new FileInputStream("D:\\java_develop\\input.txt");
            FileOutputStream outputStream = new FileOutputStream("D:\\java_develop\\output.txt");
            byte[] bytes = new byte[1024]; //设置缓冲区1024B
            int len;
            while ((len=inputStream.read(bytes))!=-1)//将读取的数据存入缓冲区
            {
                outputStream.write(bytes,0,len);//将缓冲区的数据写入
            }
            inputStream.close();
            outputStream.close();//关闭流
        } catch (IOException e) {
            e.printStackTrace();
        }

以上实例是从把input.txt的内容复制至output.txt

标签:文件,Java,字节,创建,详解,File,java,目录
From: https://www.cnblogs.com/ihave2carryon/p/18341571

相关文章

  • 【leetcode详解】另一棵树的子树 (C++递归:思路精析&& 过程反思)
    思路详解:总体框架:对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 以cur为根节点的树和子树是否结构一样?如何判断两棵树是否结构完全相同?分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树......
  • JavaScript 中 arguments 对象与剩余参数的对比及转换
    引言在JavaScript中,处理函数调用时传递的不同数量的参数是一项常见的任务。为此,JavaScript提供了两种不同的方法:arguments对象和剩余参数(RestParameters)。本文将探讨这两种方法的区别,并介绍如何将arguments对象转换为真正的数组。arguments对象vs.剩余参数arguments......
  • mdmmigrator.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mdmmigrator.dll文件(挑选合适的版本文件)把......
  • MbaeXmlParser.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个MbaeXmlParser.dll文件(挑选合适的版本文件)......
  • JavaEE 第1节 认识多线程
    本节目标(全是重点,都必须掌握)1、了解什么是线程、多线程、进程以及他们之间的关系2、了解多线程的优势以及各种特性3、用Java掌握多种创建线程的方法一、线程、多线程、进程1、概念1.基本概念这三个名词的概念可以用一个餐馆的厨房和厨师来进行超级形象的比喻。想象一下......
  • Java简单宠物系统案例和代码实现(控制台输出 “推荐小白练习”)
    文章目录案例要求1.主程序入口2.用户注册3.用户登录4.宠物管理界面5.寄养宠物6.领养宠物7.查看宠物列表8.退出程序注意事项代码实现1.数据结构定义Account.javaPet.java2.功能实现Main.java案例要求1.主程序入口初始化:创建账号数组和宠物数组来......
  • wkt格式文件详解(包含应用示例)
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......
  • SpringBoot配置文件高级用法实战
    ❃博主首页:「码到三十五」,同名公众号:「码到三十五」,wx号:「liwu0213」☠博主专栏:<mysql高手><elasticsearch高手><源码解读><java核心><面试攻关>♝博主的话:搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,......
  • 【网站项目】SpringBoot762企事业单位文件督办系统
    ......
  • Java计算机毕业设计酒店管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和消费者对住宿体验要求的不断提升,酒店业面临着前所未有的挑战与机遇。传统的手工管理模式已难以满足现代酒店对效率、准确性和......