2026/2/1 17:46:16
网站建设
项目流程
wordpress全站加速,wordpress菜单标题属性,吉林省建设厅,58同城 网站建设Java IO 实战学习指南#xff1a;从基础到进阶#xff08;附代码实操#xff09;
Java IO#xff08;输入/输出#xff09;是Java开发的核心基础#xff0c;负责程序与外部设备#xff08;文件、网络、键盘等#xff09;的数据交互。很多初学者觉得IO类繁多、流概念抽象…Java IO 实战学习指南从基础到进阶附代码实操Java IO输入/输出是Java开发的核心基础负责程序与外部设备文件、网络、键盘等的数据交互。很多初学者觉得IO类繁多、流概念抽象其实掌握“先理解模型再分场景实操”的思路就能快速上手。本文从核心概念到实战案例带你一步步学会Java IO编程。一、先搞懂3个核心前提避免踩坑在写代码前必须明确IO的核心逻辑否则容易陷入“流用错、资源漏”的坑IO的核心是“流”数据像水流一样从源头输入流流向目的地输出流不可回退除非用缓冲流按数据类型分2大类字节流InputStream/OutputStream处理所有数据图片、视频、文本等最小单位是字节1byte8bit字符流Reader/Writer仅处理文本数据.txt、.java等最小单位是字符依赖编码如UTF-8中1个中文3字节资源必须关闭IO流是“稀缺资源”不用时必须关闭否则会导致文件占用、内存泄露推荐用Java 7的try-with-resources自动关闭。二、入门实操从最常用的“文件IO”开始文件操作是IO最基础的场景先掌握字节流和字符流的文件读写再扩展到其他场景。场景1字节流读写文件万能场景推荐优先掌握适合读写任意文件文本、图片、视频等核心类FileInputStream读、FileOutputStream写。案例1读取文件内容字节流需求读取本地test.txt文件的内容打印到控制台。importjava.io.FileInputStream;importjava.io.IOException;publicclassFileByteReadDemo{publicstaticvoidmain(String[]args){// 关键用try-with-resources声明流自动关闭无需手动close()try(FileInputStreamfisnewFileInputStream(test.txt)){byte[]buffernewbyte[1024];// 缓冲区一次读1024字节提升效率intlen;// 记录每次实际读取的字节数// 循环读取read()返回-1表示读取完毕while((lenfis.read(buffer))!-1){// 字节数组转字符串注意编码一致避免乱码StringcontentnewString(buffer,0,len,UTF-8);System.out.print(content);}}catch(IOExceptione){// 捕获IO异常文件不存在、权限不足等e.printStackTrace();}}}代码说明byte[] buffer new byte[1024]缓冲区是IO高效读写的关键避免每次只读1字节频繁IO操作耗时new String(buffer, 0, len, UTF-8)必须指定编码否则默认使用系统编码Windows是GBKLinux是UTF-8容易乱码try-with-resources流对象在try括号内声明代码执行完自动关闭无需手动写fis.close()。案例2写入文件内容字节流需求将字符串“Java IO 实战”写入output.txt若文件不存在则创建存在则覆盖。importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileByteWriteDemo{publicstaticvoidmain(String[]args){StringcontentJava IO 实战;// 追加内容在构造方法加true默认false覆盖try(FileOutputStreamfosnewFileOutputStream(output.txt,true)){// 字符串转字节数组指定UTF-8编码byte[]datacontent.getBytes(UTF-8);fos.write(data);// 写入字节数组fos.flush();// 强制刷新缓冲区确保数据立即写入文件System.out.println(写入成功);}catch(IOExceptione){e.printStackTrace();}}}代码说明FileOutputStream(output.txt, true)第二个参数true表示“追加模式”不会覆盖原有内容fos.flush()字节流缓冲区满了才会自动写入flush()强制清空缓冲区避免数据残留字符流同理。场景2字符流读写文本文件专门处理文本避免乱码字符流是字节流的“包装”自动处理编码转换适合读写文本文件.txt、.md等核心类FileReader读、FileWriter写。案例3字符流读取文本文件需求读取test.txtUTF-8编码的文本内容按行打印。importjava.io.FileReader;importjava.io.BufferedReader;importjava.io.IOException;publicclassFileCharReadDemo{publicstaticvoidmain(String[]args){// 包装流BufferedReader缓冲字符流支持按行读取try(BufferedReaderbrnewBufferedReader(newFileReader(test.txt))){Stringline;// 记录每行内容// readLine()读取一行文本返回null表示结束while((linebr.readLine())!null){System.out.println(行内容line);}}catch(IOExceptione){e.printStackTrace();}}}代码说明BufferedReader是“缓冲包装流”基于FileReader增强提供readLine()按行读取效率比直接用FileReader高FileReader默认使用系统编码若文件是UTF-8编码且系统编码不是UTF-8如Windows会乱码解决方案用InputStreamReader指定编码// 解决乱码FileInputStream InputStreamReader手动指定编码BufferedReaderbrnewBufferedReader(newInputStreamReader(newFileInputStream(test.txt),UTF-8));案例4字符流写入文本文件需求将多行文本写入note.txt按行分隔。importjava.io.FileWriter;importjava.io.BufferedWriter;importjava.io.IOException;publicclassFileCharWriteDemo{publicstaticvoidmain(String[]args){// BufferedWriter缓冲字符流支持newLine()换行try(BufferedWriterbwnewBufferedWriter(newFileWriter(note.txt))){bw.write(第一行Java IO 字符流);bw.newLine();// 跨平台换行Windows是\r\nLinux是\n自动适配bw.write(第二行BufferedWriter 实战);bw.flush();// 刷新缓冲区System.out.println(写入完成);}catch(IOExceptione){e.printStackTrace();}}}代码说明bw.newLine()比手动写\n更通用自动适配操作系统的换行符若需指定编码用OutputStreamWriter包装FileOutputStreamBufferedWriterbwnewBufferedWriter(newOutputStreamWriter(newFileOutputStream(note.txt),UTF-8));三、进阶实操IO流的“包装思想”核心技巧Java IO的设计核心是“装饰器模式”——通过“基础流包装流”的组合实现功能增强。比如基础流FileInputStream读文件字节、FileOutputStream写文件字节包装流缓冲流BufferedInputStream/BufferedOutputStream提升读写效率转换流InputStreamReader/OutputStreamWriter字节流转字符流指定编码数据流DataInputStream/DataOutputStream读写基本数据类型如int、double。场景3用数据流读写基本数据类型需求将int、double类型的数据写入文件再读取出来适合存储配置、数值数据。importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;publicclassDataStreamDemo{publicstaticvoidmain(String[]args){// 写入基本数据类型try(DataOutputStreamdosnewDataOutputStream(newFileOutputStream(data.dat))){dos.writeInt(100);// 写int类型dos.writeDouble(3.14159);// 写double类型dos.writeUTF(Java IO 数据流);// 写UTF-8字符串System.out.println(数据写入成功);}catch(IOExceptione){e.printStackTrace();}// 读取基本数据类型注意读取顺序必须和写入顺序一致try(DataInputStreamdisnewDataInputStream(newFileInputStream(data.dat))){intnumdis.readInt();doublepidis.readDouble();Stringstrdis.readUTF();System.out.println(读取结果numnum, pipi, strstr);}catch(IOExceptione){e.printStackTrace();}}}代码说明数据流的核心优势能直接读写int、double等基本类型无需手动转换关键注意读取顺序必须和写入顺序完全一致如先写int再写double读取时也必须先读int再读double否则会报EOFException或数据错乱。场景4文件复制IO流综合实战需求复制一张图片或视频、文档从source.jpg到target.jpg字节流万能复制适合任意文件。importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileCopyDemo{publicstaticvoidmain(String[]args){// 源文件路径和目标文件路径StringsourcePathsource.jpg;StringtargetPathtarget.jpg;longstartTimeSystem.currentTimeMillis();// 记录开始时间// 用缓冲流包装基础流提升复制效率try(BufferedInputStreambisnewBufferedInputStream(newFileInputStream(sourcePath));BufferedOutputStreambosnewBufferedOutputStream(newFileOutputStream(targetPath))){byte[]buffernewbyte[4096];// 4KB缓冲区常用最优大小intlen;while((lenbis.read(buffer))!-1){bos.write(buffer,0,len);// 写入实际读取的字节数}bos.flush();// 确保最后一批数据写入longendTimeSystem.currentTimeMillis();System.out.println(复制完成耗时(endTime-startTime)ms);}catch(IOExceptione){e.printStackTrace();}}}代码说明复制文件必须用字节流字符流会损坏非文本文件如图片、视频byte[] buffer new byte[4096]缓冲区大小建议设为2^n如1024、4096、8192平衡内存占用和效率缓冲流BufferedInputStream/BufferedOutputStream能减少磁盘IO次数比直接用基础流快10倍以上。四、Java 8 新特性NIO.2Files工具类简化IO操作Java 7引入的NIO.2java.nio.file包提供了更简洁的IO APIFiles工具类封装了常用操作读文件、写文件、复制、删除等无需手动处理流代码更简洁。场景5用Files工具类快速读写文本文件importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.List;importjava.io.IOException;publicclassFilesDemo{publicstaticvoidmain(String[]args){StringfilePathtest.txt;try{// 1. 读取所有行自动按行分割返回ListStringListStringlinesFiles.readAllLines(Paths.get(filePath),java.nio.charset.StandardCharsets.UTF_8);System.out.println(文件内容);for(Stringline:lines){System.out.println(line);}// 2. 写入文件覆盖原有内容StringcontentFiles工具类实战简化IO操作;Files.write(Paths.get(newFile.txt),content.getBytes(StandardCharsets.UTF_8));// 3. 复制文件一行代码搞定Files.copy(Paths.get(source.jpg),Paths.get(target_nio.jpg));System.out.println(操作完成);}catch(IOExceptione){e.printStackTrace();}}}代码说明Files.readAllLines()一次性读取所有行适合小文件大文件不推荐会占用大量内存Files.write()自动创建文件父目录不存在会抛异常支持字节数组、集合等参数优势代码简洁无需手动管理流自动处理资源关闭是Java 8推荐的简洁IO方式。五、常见错误与避坑指南新手必看乱码问题原因字节流读文本时编码不匹配或字符流未指定编码解决方案始终用InputStreamReader/OutputStreamWriter指定UTF-8编码或用Files工具类显式指定编码。资源泄露原因忘记关闭流导致文件被占用、内存泄露解决方案强制使用try-with-resources声明流自动关闭避免手动close()容易遗漏。文件路径错误原因相对路径写错如test.txt实际在src/main/resources下而非项目根目录解决方案用绝对路径测试如C:/test.txt或通过ClassLoader获取资源路径// 获取resources目录下的文件StringpathFileCopyDemo.class.getClassLoader().getResource(test.txt).getPath();缓冲区未刷新原因写入流后未调用flush()缓冲区数据未写入文件解决方案写入完成后调用flush()或依赖try-with-resources自动刷新。六、学习路线建议从易到难第一步掌握字节流基础FileInputStream/FileOutputStream实现文件读写、复制第二步学习字符流FileReader/FileWriter 缓冲流BufferedReader/BufferedWriter处理文本文件第三步理解包装思想学习转换流、数据流掌握“基础流包装流”的组合用法第四步学习NIO.2Files工具类简化日常IO操作第五步进阶学习NIO通道、缓冲区应对高并发IO场景如网络编程。总结Java IO学习的核心是“先理解流的模型再分场景实操”。新手建议从文件读写、复制等简单场景入手先能用起来再深入理解“装饰器模式”“缓冲区原理”等底层逻辑。记住IO编程的关键是“选对流、关对资源、避乱码”多动手写案例如复制文件、读写配置很快就能熟练掌握。