ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java IO 核心总结:File 类、字节流与字符流详解

Java IO 核心总结:File 类、字节流与字符流详解 在 Java 开发中文件操作和 IO 流是非常基础且重要的内容。无论是读取配置文件、保存日志还是实现文件上传下载都离不开 IO 操作。本文从实战角度出发系统总结File类的常见用法字节流InputStream/OutputStream的用法字符流Reader/Writer的用法字节流与字符流的区别与选择资源管理与综合示例一、File 类文件与目录的抽象java.io.File是 Java 对文件系统中文件包括目录的抽象描述。注意创建一个File对象并不代表该文件在磁盘上真实存在。它只是路径的抽象表示。1. 构造方法构造方法说明File(String pathname)根据路径字符串创建 File 对象可以是绝对路径或相对路径File(File parent, String child)根据父目录 File 对象和子路径创建File(String parent, String child)根据父目录路径字符串和子路径创建示例Filefile1newFile(hello.txt);Filefile2newFile(D:\\test,hello.txt);FileparentnewFile(D:\\test);Filefile3newFile(parent,hello.txt);2. 路径相关方法FilefilenewFile(..\\hello-world.txt);System.out.println(file.getParent());// ..\System.out.println(file.getName());// hello-world.txtSystem.out.println(file.getPath());// ..\hello-world.txtSystem.out.println(file.getAbsolutePath());// 绝对路径System.out.println(file.getCanonicalPath());// 修饰后的绝对路径会解析 . 和 ..3. 文件与目录操作方法说明exists()判断文件或目录是否真实存在isDirectory()判断是否为目录isFile()判断是否为普通文件createNewFile()创建普通文件已存在返回 falsedelete()删除文件或空目录deleteOnExit()程序退出时删除文件mkdir()创建单级目录父目录不存在会失败mkdirs()创建多级目录父目录不存在会一并创建renameTo(File dest)重命名或移动文件listFiles()返回目录下的子文件和子目录示例创建、删除文件FilefilenewFile(test.txt);System.out.println(file.exists());// falseSystem.out.println(file.createNewFile());// trueSystem.out.println(file.exists());// trueSystem.out.println(file.delete());// trueSystem.out.println(file.exists());// false示例创建目录FiledirnewFile(some-parent\\some-dir);// mkdir() 如果父目录不存在会失败System.out.println(dir.mkdir());// false// mkdirs() 可以创建多级目录System.out.println(dir.mkdirs());// true二、IO 流的分类在 Java 中IO 流按照处理数据的单位分为两类字节流Byte Stream以字节8位为单位读写适合处理图片、音频、视频等二进制文件。输入流InputStream输出流OutputStream字符流Character Stream以字符16位为单位读写专门用于处理文本文件会自动处理字符集编码。输入流Reader输出流Writer注意字符流本质上还是基于字节流实现的只是加了一层编码/解码的包装。三、字节流InputStream / OutputStream1. InputStream字节输入流InputStream是字节输入流的抽象类最常用的子类是FileInputStream。方法说明int read()读取一个字节返回 -1 表示读取完毕int read(byte[] b)最多读取b.length个字节返回实际读取数量-1 表示读完void close()关闭流推荐方式使用缓冲区读取try(InputStreamisnewFileInputStream(hello.txt)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){// buf 的 [0, len) 是本次读取到的数据System.out.write(buf,0,len);}}2. OutputStream字节输出流OutputStream是字节输出流的抽象类最常用的子类是FileOutputStream。方法说明void write(int b)写入一个字节void write(byte[] b)写入整个字节数组void write(byte[] b, int off, int len)写入字节数组的指定范围void flush()刷新缓冲区强制将数据写入目标void close()关闭流写入示例try(OutputStreamosnewFileOutputStream(output.txt)){Strings你好中国;byte[]bs.getBytes(UTF-8);os.write(b);os.flush();// 不要忘记 flush}四、字符流Reader / Writer重点补充字符流专门用于处理文本数据它能自动处理字符集编码避免字节流读取中文时的乱码问题。1. Reader字符输入流Reader是字符输入流的抽象类常用子类有FileReader、BufferedReader。方法说明int read()读取一个字符返回 -1 表示读完int read(char[] cbuf)最多读取cbuf.length个字符返回实际读取数void close()关闭流基础用法FileReadertry(ReaderreadernewFileReader(hello.txt)){intch;while((chreader.read())!-1){System.out.print((char)ch);}}高效用法BufferedReader支持按行读取BufferedReader提供了readLine()方法可以一次读取一行文本非常适合处理文本文件。try(BufferedReaderreadernewBufferedReader(newFileReader(hello.txt))){Stringline;while((linereader.readLine())!null){System.out.println(line);}}注意FileReader使用系统默认字符集如果文件编码与系统默认不一致可能会出现乱码。此时应使用InputStreamReader手动指定编码。2. Writer字符输出流Writer是字符输出流的抽象类常用子类有FileWriter、BufferedWriter。方法说明void write(int c)写入一个字符void write(char[] cbuf)写入字符数组void write(String str)写入字符串void flush()刷新缓冲区void close()关闭流基础用法FileWritertry(WriterwriternewFileWriter(output.txt)){writer.write(你好世界\n);writer.write(Hello, World\n);writer.flush();}高效用法BufferedWriter支持换行try(BufferedWriterwriternewBufferedWriter(newFileWriter(output.txt))){writer.write(我是第一行);writer.newLine();// 换行writer.write(我是第二行);writer.flush();}3. 转换流InputStreamReader / OutputStreamWriter转换流是字节流和字符流之间的桥梁可以指定字符集编码解决乱码问题。读取时指定编码try(BufferedReaderreadernewBufferedReader(newInputStreamReader(newFileInputStream(hello.txt),UTF-8))){Stringline;while((linereader.readLine())!null){System.out.println(line);}}写入时指定编码try(BufferedWriterwriternewBufferedWriter(newOutputStreamWriter(newFileOutputStream(output.txt),UTF-8))){writer.write(你好世界);writer.flush();}五、字节流 vs 字符流如何选择维度字节流字符流处理单位字节8位字符16位适用场景图片、音频、视频、压缩包等二进制文件文本文件txt、java、html 等编码处理需要手动处理编码自动处理编码或通过转换流指定核心抽象类InputStream/OutputStreamReader/Writer常见子类FileInputStream/FileOutputStreamFileReader/FileWriter、BufferedReader/BufferedWriter性能优化使用byte[]缓冲区使用char[]缓冲区或BufferedReader选择原则如果是二进制文件图片、音视频等必须使用字节流。如果是文本文件优先使用字符流尤其是BufferedReader/BufferedWriter避免乱码并提高效率。如果文本文件编码特殊如 UTF-8 而系统默认 GBK必须使用转换流指定编码。六、资源管理try-with-resourcesIO 资源非常宝贵使用完毕后必须关闭。Java 7 提供了try-with-resources语法只要资源实现了AutoCloseable接口就能自动关闭。标准写法try(InputStreamisnewFileInputStream(source.txt);OutputStreamosnewFileOutputStream(dest.txt)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){os.write(buf,0,len);}os.flush();}catch(IOExceptione){e.printStackTrace();}七、综合示例文件复制字节流 vs 字符流1. 使用字节流复制任意文件推荐publicclassFileCopyDemo{publicstaticvoidmain(String[]args){FilesourcenewFile(source.jpg);FiledestnewFile(dest.jpg);try(InputStreamisnewFileInputStream(source);OutputStreamosnewFileOutputStream(dest)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){os.write(buf,0,len);}os.flush();System.out.println(复制完成);}catch(IOExceptione){e.printStackTrace();}}}2. 使用字符流复制文本文件publicclassTextCopyDemo{publicstaticvoidmain(String[]args){try(BufferedReaderreadernewBufferedReader(newInputStreamReader(newFileInputStream(source.txt),UTF-8));BufferedWriterwriternewBufferedWriter(newOutputStreamWriter(newFileOutputStream(dest.txt),UTF-8))){Stringline;while((linereader.readLine())!null){writer.write(line);writer.newLine();}writer.flush();System.out.println(文本复制完成);}catch(IOExceptione){e.printStackTrace();}}}八、总结类别核心类用途关键点文件抽象File描述文件或目录元信息对象存在不代表文件真实存在字节输入InputStream读取字节数据read()返回 -1 表示读完字节输出OutputStream写入字节数据write()写入flush()刷新字符输入Reader读取字符数据BufferedReader.readLine()按行读取字符输出Writer写入字符数据BufferedWriter.newLine()换行转换流InputStreamReader/OutputStreamWriter字节流转字符流可指定字符集解决乱码资源管理try-with-resources自动关闭流避免资源泄漏掌握File、字节流、字符流的基本用法是 Java 文件编程的基础。实际开发中操作文件元信息使用File读写二进制文件使用InputStream/OutputStream读写文本文件使用Reader/Writer优先选择BufferedReader/BufferedWriter编码不一致时使用转换流指定字符集始终使用try-with-resources管理资源不要忘记flush()和close()。
返回列表