InputStream、OutputStream、Reader、Writer的基本概念和使用方法

简介: InputStream、OutputStream、Reader、Writer的基本概念和使用方法

输入输出流最容易忽略的细节就是使用完要记得用close()方法关闭!!!

InputStream 字节输入流

inputStream核心方法read(),通过while循环读取文件到创建好的buf数组里面。当读到文件末尾的时候最后一个数值会是-1,因此这就是终止条件。而直接输入的字节可能会中文乱码,所以需要手动转GBK或者UTF-8。available() 方法可以返回文件长度。

//FileInputStream里面输入要读取的文件路径
FileInputStream in = new FileInputStream("D:\\test.txt");
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
    String s = new String(buf, 0,len,"UTF-8");
    System.out.println(s);
}
in.close();

OutputStream字节输出流的使用

核心方法write(),作用是将数据流写出到文件里。首先要将数据流读取到一个数组里然后再写出到另一个文件。

FileInputStream in = new FileInputStream("D:\\test.txt");
FileOutputStream out = new FileOutputStream("D:\\test1.txt");
byte[] buf = new byte[1024];
int len;
//循环写入buf中
while ((len = in.read(buf)) != -1) {
    out.write(buf,0,len);
}
in.close();
out.close();

Reader字符输入流的使用

提供了自动转码的功能解决中文字符乱码,但本质用的还是inputStream

FileReader fileReader = new FileReader("D:\\test.txt");
int len;
char[] buf = new char[1024];
while ((len = fileReader.read(buf)) != -1) {
    String s = new String(buf, 0,len);
    System.out.println(s);
}
fileReader.close();

Writer字符输出流的使用

结束的时候需要调用flush()方法,当然close()也包含了

FileReader fileReader = new FileReader("D:\\test.txt");
FileWriter out = new FileWriter("D:\\test1.txt");
int len;
char[] buf = new char[1024];
while ((len = fileReader.read(buf)) != -1) {
    out.write(buf,0,len);
}
//close 包含了out.flush()
out.close();
fileReader.close(); 

BufferedReader和BufferedWriter的使用

之前都需要手动去创建一个buf数组作为暂存缓存然后再进行输出而BufferedReader和BufferedWriter就解决了这个临时数据存储的问题,同时提供了readLien()方法一行一行去读取数据。而创建好的BufferedReader或者BufferedWriter里面都需要先实现先在方法里创建一个Reader或者Writer

BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\test.txt"));
String str = null;
while ((str = bufferedReader.readLine()) != null){
    System.out.println(str);
}
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\test.txt"));
Stream<String> lines = bufferedReader.lines();
lines.forEach(System.out::println);
BufferedReader in = new BufferedReader(new FileReader("D:\\test.txt"));
BufferedWriter out = new BufferedWriter(new FileWriter("D:\\test.txt"));
int len ;
char [] buf = new char[1024];
while ((len = in.read(buf)) != -1){
    out.write(buf,0,len);
}
in.close();
out.close();
相关文章
|
7月前
|
人工智能 监控 安全
管理和调度Dify工作流
Dify是一款开源的大模型应用开发平台,支持通过可视化界面快速构建AI Agent和工作流。然而,Dify本身缺乏定时调度与监控报警功能,且执行记录过多可能影响性能。为解决这些问题,可采用Dify Schedule或XXL-JOB集成Dify工作流。Dify Schedule基于GitHub Actions实现定时调度,但仅支持公网部署、调度延时较大且配置复杂。相比之下,XXL-JOB提供秒级调度、内网安全防护、限流控制及企业级报警等优势,更适合大规模、高精度的调度需求。两者对比显示,XXL-JOB在功能性和易用性上更具竞争力。
2392 63
管理和调度Dify工作流
|
缓存 安全 Java
JAVA实现用户登录错误N次后,账户暂时锁定
JAVA实现用户登录错误N次后,账户暂时锁定
1180 0
JAVA实现用户登录错误N次后,账户暂时锁定
|
人工智能 自然语言处理 IDE
通义灵码 AI IDE使用体验(1)项目初创
通义灵码 AI IDE上线,作为AI IDE的重度使用者怎能错过?本文详细体验了从安装到项目开发的全过程,界面友好,操作简便,支持智能问答、文件编辑、智能体三种模式。通过智能体方式快速开发项目,自动规划功能、管理环境,虽在复杂项目中仍有提升空间,但整体体验流畅,适合开发者尝试。
885 0
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
320 3
|
弹性计算 JavaScript Java
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
668 3
|
10月前
|
数据采集 缓存 NoSQL
布隆过滤器原理和使用场景
布隆过滤器(Bloom Filter)是一种高效的空间节省型数据结构,用于判断元素是否存在于集合中。它通过多个哈希函数将元素映射到位数组,查询时检查对应位是否全为1。优点是空间效率高,缺点是有一定误判率。典型应用场景包括缓存穿透防护、垃圾邮件过滤、黑名单管理及去重等。Java实现中使用BitSet和自定义哈希函数,而Guava和Redis也提供了布隆过滤器的实现。
445 0
Stream之判断(anyMatch allMatch noneMatch)
Stream之判断(anyMatch allMatch noneMatch)
248 0
|
Java Maven Spring
【异常解决】java: 无法访问org.springframework.boot.SpringApplication的解决方案
【异常解决】java: 无法访问org.springframework.boot.SpringApplication的解决方案
4568 0
|
存储 Java
使用OutputStreamWriter写入数据
使用OutputStreamWriter写入数据