584 字
2 分钟
Java IO操作详解
Java的IO体系刚接触的时候觉得好庞大,各种InputStream、Reader傻傻分不清。后来搞懂了装饰器模式再看这些类的继承关系,一下子就豁然开朗了。这篇文章就从实用的角度出发,把常用的IO操作讲清楚。
Java IO操作详解
IO操作
IO(Input/Output)就是程序与外部设备之间的数据传输。刚开始学的时候觉得InputStream和Reader的继承关系太复杂了,后来发现记住一个原则就行:处理文本用字符流,处理二进制用字节流。
IO流的分类
- 按流向:输入流(读)、输出流(写)
- 按类型:字节流(处理所有数据)、字符流(处理文本)
- 按功能:节点流(直接连数据源)、处理流(包装节点流,提供额外功能)
字节流
核心类
- 输入:
InputStream→FileInputStream、BufferedInputStream - 输出:
OutputStream→FileOutputStream、BufferedOutputStream
文件读写示例
// 读文件try (FileInputStream fis = new FileInputStream("file.txt")) { int data; while ((data = fis.read()) != -1) { System.out.print((char) data); }}
// 写文件try (FileOutputStream fos = new FileOutputStream("output.txt")) { String content = "Hello, Java IO!"; fos.write(content.getBytes());}缓冲流
带缓冲区的流,效率更高。建议总是用缓冲流包装节点流:
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"))) { // 读取效率更高}字符流
核心类
- 输入:
Reader→FileReader、BufferedReader - 输出:
Writer→FileWriter、BufferedWriter
BufferedReader 按行读取
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); }}这是最常用的读取文本文件的方式。
转换流
InputStreamReader和OutputStreamWriter是字节流和字符流之间的桥梁。处理文本时一定要指定编码,否则会出现乱码。
// 指定UTF-8编码读取try (InputStreamReader isr = new InputStreamReader( new FileInputStream("file.txt"), "UTF-8")) { // 读取}数据流
DataInputStream/DataOutputStream可以读写基本数据类型:
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) { dos.writeInt(100); dos.writeDouble(3.14); dos.writeUTF("Hello");}标准输入输出
// 从控制台读取try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { String name = br.readLine(); System.out.println("你好," + name);}File类
用于操作文件或目录的路径,不是文件内容:
File file = new File("file.txt");file.exists(); // 是否存在file.isFile(); // 是否是文件file.isDirectory(); // 是否是目录file.getName(); // 文件名file.length(); // 文件大小file.createNewFile(); // 创建文件file.delete(); // 删除file.mkdirs(); // 创建多级目录最佳实践
- 用try-with-resources——自动关闭资源,不用写finally
- 选对流——文本用字符流,二进制用字节流
- 指定编码——跨平台时一定要指定,否则Windows和Linux编码不同会乱码。这个坑我踩过,在Windows上开发好好的,部署到Linux上全是乱码
- 用缓冲流——提高效率
- 简单的文件操作用NIO.2的Files类——
Files.readAllBytes()、Files.write()一行搞定
💡 实战贴士: 如果只是简单的读写文件,用
java.nio.file.Files类最省事。Files.readString(Path.of("file.txt"))一行就能读完整个文件(Java 11+)。不需要自己折腾InputStream和BufferedReader。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
Java NIO详解
Java NIO的Selector模型让我第一次感受到了单线程处理万级连接的魅力。相比传统IO的阻塞读写,Channel加Buffer的组合简直是为高性能网络编程量身定做。
2
Java注解详解
Java 刚学Java时觉得注解不就是几个@符号嘛,后来用Spring Boot才发现注解能玩出这么多花样——从编译检查到运行时注入,注解远不止看起来那么简单。
3
Java异常处理详解
Java try-catch是Java最基础的异常处理手段,但什么时候该用受检异常、什么时候该抛RuntimeException,这中间有不少门道值得琢磨。
4
Java Stream API详解
Java Stream API让Java从命令式编程迈向了函数式编程的大门。从filter/map/reduce开始,你会爱上这种链式处理集合数据的写法。
5
Java集合框架详解
Java Java集合框架的源码翻来覆去看了好几遍,每次看都有新收获。从ArrayList到ConcurrentHashMap,每个集合背后都有精妙的设计思想。






