当前位置: 首页 > news >正文

码海拾遗 · Java I/O 学习笔记

一、标准输入输出(控制台)

1. 标准输出System.out

  • System.out.print()/println()/printf()

  • 最常用的控制台输出。

java

System.out.println("普通输出"); System.out.printf("格式化输出:%d + %d = %d%n", 3, 5, 3 + 5);

2. 标准输入System.in

  • System.in是字节流(InputStream),通常用ScannerBufferedReader包装。

方式一:Scanner(最常用)

java

import java.util.Scanner; Scanner sc = new Scanner(System.in); System.out.print("请输入姓名:"); String name = sc.nextLine(); System.out.print("请输入年龄:"); int age = sc.nextInt(); System.out.println(name + " 今年 " + age + " 岁"); sc.close();
方式二:BufferedReader(效率高,需处理异常)

java

import java.io.BufferedReader; import java.io.InputStreamReader; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入内容:"); String line = br.readLine(); System.out.println("你输入了:" + line); br.close();

二、文件 I/O 基础

Java I/O 分为字节流字符流,顶层抽象类:

  • 字节流:InputStream/OutputStream

  • 字符流:Reader/Writer

1. 字节流读写文件(适合图片、视频等二进制文件)

文件输入流(FileInputStream)

java

import java.io.FileInputStream; import java.io.IOException; try (FileInputStream fis = new FileInputStream("test.txt")) { int b; while ((b = fis.read()) != -1) { System.out.print((char) b); } } catch (IOException e) { e.printStackTrace(); }
文件输出流(FileOutputStream)

java

import java.io.FileOutputStream; import java.io.IOException; try (FileOutputStream fos = new FileOutputStream("output.txt")) { String data = "Hello, Java I/O!"; fos.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); }
拷贝文件(字节流一次读取一个字节数组)

java

try (FileInputStream fis = new FileInputStream("src.jpg"); FileOutputStream fos = new FileOutputStream("dst.jpg")) { byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); }

2. 字符流读写文件(适合文本文件)

FileReader / FileWriter

java

import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; // 写文本文件 try (FileWriter fw = new FileWriter("note.txt")) { fw.write("第一行内容\n"); fw.write("第二行内容"); } catch (IOException e) { e.printStackTrace(); } // 读文本文件 try (FileReader fr = new FileReader("note.txt")) { int ch; while ((ch = fr.read()) != -1) { System.out.print((char) ch); } } catch (IOException e) { e.printStackTrace(); }

3. 缓冲流(提高性能)

  • BufferedInputStream/BufferedOutputStream(字节缓冲)

  • BufferedReader/BufferedWriter(字符缓冲,支持按行读写)

使用 BufferedReader 按行读取

java

import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
使用 BufferedWriter 按行写入

java

import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; try (BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) { bw.write("第一行"); bw.newLine(); bw.write("第二行"); } catch (IOException e) { e.printStackTrace(); }

三、转换流(字节 ↔ 字符)

  • InputStreamReader:字节→字符

  • OutputStreamWriter:字符→字节
    通常用于指定编码(如 UTF-8, GBK)。

java

import java.io.*; // 以 UTF-8 编码读取文件 try (BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream("utf8.txt"), "UTF-8"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } // 以 GBK 编码写入文件 try (BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("gbk.txt"), "GBK"))) { bw.write("中文内容"); } catch (IOException e) { e.printStackTrace(); }

四、NIO(New I/O,Java 1.4+)

NIO 提供更高效的非阻塞 I/O,核心:Channel+Buffer+Selector

简单示例:使用 FileChannel 拷贝文件

java

import java.io.*; import java.nio.channels.FileChannel; try (FileChannel src = new FileInputStream("src.txt").getChannel(); FileChannel dest = new FileOutputStream("dest.txt").getChannel()) { dest.transferFrom(src, 0, src.size()); } catch (IOException e) { e.printStackTrace(); }

使用 Files 工具类(Java 7+,最简洁)

java

import java.nio.file.*; // 一次性读取所有行 List<String> lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8); lines.forEach(System.out::println); // 一次性写入 List<String> content = Arrays.asList("行1", "行2", "行3"); Files.write(Paths.get("out.txt"), content, StandardCharsets.UTF_8); // 复制文件 Files.copy(Paths.get("a.txt"), Paths.get("b.txt"), StandardCopyOption.REPLACE_EXISTING);

五、常见问题与最佳实践

问题建议
中文乱码使用InputStreamReader/OutputStreamWriter指定编码,如UTF-8
忘记关闭流使用try-with-resources(Java 7+)自动关闭
效率低使用缓冲流(BufferedReader/BufferedWriter
大文件读取使用BufferedReader按行读,或 NIO 的Files.lines()
需要随机访问使用RandomAccessFile或 NIO 的FileChannel

六、完整综合示例(含异常处理)

java

import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.*; public class IODemo { public static void main(String[] args) { // 写入 try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("demo.txt"), StandardCharsets.UTF_8)) { bw.write("Hello, 你好"); bw.newLine(); bw.write("第二行"); } catch (IOException e) { e.printStackTrace(); } // 读取 try (BufferedReader br = Files.newBufferedReader(Paths.get("demo.txt"), StandardCharsets.UTF_8)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
http://www.jsqmd.com/news/1381793/

相关文章:

  • 2026年杭州音域艺考机构优选指南_杭州音域艺术培训有限公司(杭州运营中心) - 热点品牌推荐
  • 2026年8月评价好的佛山不锈钢打磨机厂如何选测评,多型号厂分析 - 海棠依旧大
  • 江苏HDPE缠绕B型管源头厂家怎么选?认准临沂安鑫管业有限公司(江苏销售部) - 热点品牌推荐
  • 微信小店店群自动化管理系统:工程级可控的自动化,把封号概率压到极限
  • 深入了解佛山网站建设明细报价逻辑与服务标准
  • #找2026年苏州知名的二硫化钼喷涂厂商看这几点,裕锦欣(苏州)金属制品有限公司(苏州营销部) - 热点品牌推荐
  • 选购戴南优质的304换热器管制造商指南江苏巨登不锈钢管业有限公司(戴南联络处) - 热点品牌推荐
  • 2026年8月13日南京市江宁区联通宽带小白办理避坑指南 - 领卡园地
  • 2026 年现阶段,银川比较好的MMA彩色防滑供应商哪家强,雨天车间踩滑差点出事?这玩意儿竟让地面防滑性能翻了数倍还好看-光大生态工程技术 - 企业信息推荐-2
  • Topit终极指南:3步掌握Mac窗口置顶,多任务效率翻倍!
  • 高通跃龙IQ-9100工业平台的开发经验分享(2): 7B模型推理乱码的根因追踪
  • 微信小店店群自动化管理系统:每个店铺独立宇宙,200+店铺互不感知
  • 美酒河镇榻榻米定制品牌厂商哪家强?秋楼板材(美酒河镇营销部)实测解读 - 热点品牌推荐
  • 消息队列选型终极对决:Kafka / RabbitMQ / Pulsar 的场景边界
  • 大同电商快递袋打包机厂家/全自动快递打包机公司电话-银铃智能科技 - 行业推荐官-2
  • 2026年全国靠谱地上通风笼厂家推荐 河南粮安智能设备 - 起跑123
  • 2026年浙江选热流道系统,认准专业生产厂家康非热流道 - 起跑123
  • Bash 脚本进阶:declare 命令完整详解(变量属性、数组、只读实战)
  • 工厂搬家公司收费标准详解,合理定价更透明!上海大众搬家有限公司 - 热点品牌推荐
  • 2026 年现阶段大理正规的中边支柱加工厂怎么联系,别再看错了!支撑跨境贸易半边天的,原来不是你以为的那些,而是这根被忽略的中边支柱。-升瑞矿山机械 - 行业严选官
  • 微信小店改价系统:C++级指纹伪装深度,连系统调用层都查不出
  • 高通跃龙IQ-9100工业平台的开发经验分享(3): weights-packing-CLI与PythonAPI对比
  • 一天一道算法题(8):原地哈希的思路与实现解析
  • 2026 年现阶段,沙坡头到聊城二手车物流公司哪家强,花几千块运二手车上牌,竟有人因此亏了半辆新车钱? - 实业推荐官
  • 龙岗网站建设怎么做好公司推广?资深运营揭秘本地企业数字化转型的真实套路
  • 如何让网站建设更高效?深度解析站内搜索在品牌官网中的核心价值与落地指南
  • 网站建设挣钱么:揭秘个人与工作室如何在红海中杀出一条血路并实现月入过万的真实路径
  • 2026年全国地上通风笼选购 靠谱厂家推荐指南 - 起跑123
  • 如何用Winhance中文版免费优化Windows系统:从卡顿到流畅的完整指南
  • 高通跃龙IQ-9100工业平台的开发经验分享(4): llm-重复输出与prompt工程解决方案