
目录1. File 文件操作类详解1.1 构造方法1.2 方法2. InputStream 字节输入流与OutputStream 字节输出流2.1 构造方法2.2 read2.3 write3. FileReader字符输入流与FileWrite字符输出流3.1 构造方法3.2 read3.3 write4. PrintWriter便捷打印输出流4.1 构造方法4.2 常用方法前言在 Java IO 体系当中我们首先需要分清一个核心概念File 对象只能够管理文件路径、文件属性不具备读取和写入文件内部数据的能力。真正负责传输文件数据的是 IO 流IO 流分为字节流、字符流两大类。字节流适配全部格式的文件字符流专门服务于纯‑文本文件可以自动处理编码减少中文乱码问题。下面顺着目录逐层讲解。1. File 文件操作类详解1.1 构造方法签名说明File(File parent, String child)传入父File对象 子文件名称File(String pathname)直接传入文件路径字符串,可以是绝对路径也可以是相对路径File(String parent, String child)拆分父目录路径、子文件名日常开发中文件中最常使用的构造方法是:File(String pathname)当我们创建完对象之后,就可以通过方法对对象进行一系列的操作; 返回目录1.2 方法这里我将所有 方法分成信息获取方法、状态判断方法、创建‑删除‑遍历方法、判断用户是否有条件方法四类第一类:信息获取方法:返回类型方法功能说明StringgetName()获取文件 / 文件夹名称只拿名字不带目录StringgetParent()获取父目录路径字符串StringgetPath()获取构造 File 时传入的原始路径相对 / 绝对取决于构造参数StringgetAbsolutePath()获取文件完整绝对路径StringgetCanonicalPath()获取规范化之后的绝对路径会解析 …/、./ 这类相对符号此处我们具体讲解:getAbsolutePath与getCanonicalPath的区别假设我们的文件路径为:javastudio/Java20260807/test.txt这一个文件的路径如果我们同时调用这两个方法得到的结果都是一样的;此时我们区分不出任何区别,当我们将构造方法中写成相对路径时:此时就能很清楚的看见区别:getAbsolutePath:相当于在获取到父目录的情况下对字符串进行拼接getCanonicalPath:在获取到绝对路径时,对绝对路径中多余的符号进行优化消除第二类:状态判断方法返回类型方法功能说明booleanexists()判断磁盘当中该路径下的文件或者文件夹是否真实存在booleanisFile()判断当前路径是不是普通文件txt、图片等不是文件夹booleanisDirectory()判断当前路径是否为文件夹(目录)第三类:创建‑删除‑遍历方法返回类型方法功能说明booleancreateNewFile()根据 File 对象自动创建一个空文件。成功创建后返回 truebooleandelete()根据 File 对象删除该文件。成功删除后返回 truevoiddeleteOnExit()根据 File 对象标注文件将被删除删除动作会到 JVM 运行结束时才会进行String[]list()返回 File 对象代表的目录下的所有文件名File[]listFiles()返回 File 对象代表的目录下的所有文件以 File 对象表示booleanmkdir()创建 File 对象代表的目录booleanmkdirs()创建 File 对象代表的目录如果必要会创建中间目录booleanrenameTo(File dest)进行文件改名也可以视为我们平时的剪切、粘贴操作renameTo方法操作时,如果我们当前路径是一样的,但是此时的操作就是修改名字:例如:此时就会将名字修改为test1.txt处于不同目录下,就会触发移动操作:例如:我们创建:aaa的路径并移动到aaa路径下;deleteOnExit执行当前操作时,不会立刻删除文件,而是在JVM运行结束时删除;第四类:判断用户是否有条件方法返回类型方法功能说明booleancanRead()判断用户是否对文件拥有可读权限booleancanWrite()判断用户是否对文件拥有可写权限此处取决有用户有一个怎么样的用户权限,类似于word文档中的权限,我们可以查看是可读还是可写权限; 返回目录2. InputStream 字节输入流与OutputStream 字节输出流2.1 构造方法签名说明FileInputStream(File file)利用 File 构造文件输入流FileInputStream(String name)利用文件路径构造文件输入流//方式1传入File对象FilefilenewFile(test.txt);InputStreamin1newFileInputStream(file);//方式2传入路径字符串InputStreamin2newFileInputStream(test.txt);我们可以直接new一个FileInputStream对象也可以使用Reader抽象类来实现向上转型的写法,企业常规写法:ReaderreadernewFileReader(note.txt);同理:OutputStream的构造方法和InputStream类似:签名说明OutputStream(File file)利用 File 构造文件输出流OutputStream(String name)利用文件路径构造文件输出流 返回目录2.2 readread方法进行读操作,Java中实现了3个read方法的重载操作:修饰符及返回值类型方法签名说明intread()读取一个字节的数据返回‑1 代表已经全部读完了intread(byte[] b)最多读取 b.length 字节的数据到 b 中返回实际读到的数量‑1 代表已经读完了intread(byte[] b, int off, int len)最多读取 len 字节的数据放到 b 数组从 off 的位置开始返回实际读到的数量‑1 代表已经读完了voidclose()关闭字节流例如:此时我们在E:/javastudio/Java20260807/test.txt当前文件中写入ABCEDFG这个数据;通过Input Stream来进行读取;当读取到文件末尾时,会返回一个-1的值;此处我们也可以传入一个输出型参数:Java由于当时设计的局限性,一个方法只能返回一个值,这就导致如果我想要返回多个值的时候,就没有办法进行返回,采用数组这样的输出型参数,能有效解决这类问题:形如这样的操作就能有效解决返回多个值的问题; 返回目录2.3 writewrite也有3个Java官方实现的重载方法:修饰符及返回值类型方法签名说明voidwrite(int b)写入单个字节的数据voidwrite(byte[] b)将 b 字节数组当中的数据全部写入输出流voidwrite(byte[] b, int off, int len)将 b 字节数组里从 off 下标开始的数据写入流一共写入 len‑个字节voidclose()关闭字节流voidflush()重要我们知道 I/O 的速度是很慢的所以大多的 OutputStream 为了减少设备操作的次数在写数据的时候都会将数据先暂时写入内存的一个指定区域里直到该区域满了或者其他指定条件时才真正将数据写入设备中这个区域一般称为缓冲区。但造成一个结果就是我们写的数据很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置调用 flush刷新操作将数据刷到设备中。例如此时:我们向E:/javastudio/Java20260807/test.txt文件中写入hello world!!;我们也可以在构造方法中添加一个参数true此时,我们在进行下一次写入数据的时候,就不会清空文件中的内容; 返回目录3.FileReader字符输入流与FileWrite字符输出流3.1 构造方法签名说明FileWriter(File file)根据File对象创建字符输出流默认覆盖写入FileWriter(String fileName)根据文件路径创建字符输出流默认覆盖写入FileWriter(File file, boolean append)appendtrue 开启文件末尾追加模式FileWriter(String fileName, boolean append)路径形式设置是否追加写入当然我们也可以使用Read和Writer来实现多态,这也是日常开发中常使用的方法;//父类引用指向子类对象ReaderinnewFileReader(test.txt);WriteroutnewFileWriter(out.txt); 返回目录3.2 read同理read方法中也提供了3个重载的方法:方法签名返回值详细说明public int read()int读取单个字符读到文件结尾返回 -1正常返回该字符对应的 int 编码值public int read(char[] cbuf)int将读取到的字符存入字符数组 cbuf返回本次成功读取到的字符数目无数据返回 -1public int read(char[] cbuf, int off, int len)intoff数组起始存放下标len最多读取字符数量只往数组指定区间填充读取内容例如:此时我们在E:/javastudio/Java20260807/test.txt当前文件中写入:此时我们可以进行读操作:使用方法和InputStream类似,也能传入输出型参数; 返回目录3.3 writewrite也提供了多个重载的方法:方法签名返回值详细说明public void write(int c)void写入单个字符传入字符对应的 int 编码public void write(char[] cbuf)void写入整个字符数组当中全部字符public void write(char[] cbuf, int off, int len)voidoff‑数组起始下标len‑写入长度写入数组指定区间public void write(String str)void直接写入字符串字符流独有的便捷方法public void write(String str, int off, int len)void写入字符串指定下标区间的内容具体使用方法,与OutStream类似,这里不过多进行讲解;FileWriter 具备缓冲区write 之后数据暂存内存必须 flush () 或者 close () 才会把数据落地磁盘构造方法开启追加模式 new FileWriter(“xxx.txt”,true)不会清空旧文件字节流没有直接写入字符串的重载这是字符流的优势。 返回目录4 PrintWriter便捷打印输出流FileWriter属于基础字符输出流只能够写入字符、字符数组、字符串。如果需要写入数字、布尔值我们需要手动拼接字符串转换fileWriter.write(666);而PrintWriter 是增强型装饰字符输出流专门用来简化文本写入能够自动将 int、double、boolean、对象转换成字符串写入文件适合书写日志、导出文本。字节流与PrintWriter选取:视频、图片、压缩包 → 使用字节流txt、日志、配置文件 → 使用字符流优先选用 PrintWriter4.1 构造方法构造方法作用说明PrintWriter(String fileName)根据文件路径创建打印流PrintWriter(Writer out)包装普通字符输出流 FileWriterPrintWriter(Writer out, boolean autoFlush)开启自动刷新println、printf 执行之后自动刷新缓冲区 返回目录4.2 常用方法方法签名返回值详细说明void print(Object obj)void输出数据不会自动换行内部自动转为字符串void println(Object obj)void输出数据并且自动换行开启自动刷新时刷新缓冲区void printf(String format, Object… args)void格式化输出文本%d、%s、%f占位符void write(int c)void写入单个字符不会自动转换数字void write(char[] cbuf)void写入完整字符数组void write(String str)void写入字符串void flush()void强制刷新缓冲区内存数据写入磁盘void close()void关闭流关闭前自动刷新缓冲区print() / println()底层调用String.valueOf()自动把数字、布尔、对象转为文本。pw.println(97) 写入文件内容为字符串97write(int c)把参数当作字符编码写入对应字符。pw.write(97) 写入文件内容为字符a例如;注意事项:print() 就算开启自动刷新也不会刷新缓冲区只有 println、printf 触发自动刷新字符流带有缓冲区忘记 flush/close文件内容为空PrintWriter 只是装饰流底层依旧依赖FileWriter完成文件写入。 返回目录