Java IO流的简单使用 通俗易懂 超详细 【内含案例】
IO流简单使用
输入和输出是相对于程序来说的,读取到程序中叫做输入,写到文件中叫输出.
InputStream 字节输入流
InputStream 字节输入流基类,是字节输入流所有类的超类
// 从输入流中读取数据中下一个字节
abstract int read();
// 读取一定数量的字节,并将其缓冲到 b 数组中
int read(byte[] b);
// 读取最多 len 个字节,并并将其缓冲到 b 数组中
int read(byte[] b, int off, int len);
// 跳过或丢弃数据中 n 个字节
long skip(lone n);
// 关闭流并释放流关系中所有资源
void close();
OutputStream 字节输出流
OutputStream 字节输出流基类,是字节输出流所有类的超类
// 讲指定的字节写入输出流
abstract void write(int b);
// 将 b.length 个字节从 b 中写入输出流中
void write(byte[] b);
// 将 b 数组下标 off(b[off]) 后 len 个字节写入输出流
void write(byte[] b, int off, int len)
// 刷新输出流并写出所有缓冲的输出字节数据
void flush();
// 关闭输出流,并释放输出流相关的资源
// 关闭之前,使用flush()写出缓冲的字节
void close();
Reader 字符输入流
Reader 字符输入流,是读取字符流的抽象类
// 读取单个字符
int read();
// 将字符读入数组
int read(char[] cbuf);
// 将 len 个字符读到char数组下标 off 后面
abstract int read(char[] cbuf, int off, int len);
// 跳过n个字符
long skip(long n);
// 关闭字符流,并释放相关的资源
abstract void close();
Writer 字符输出流
Writer 字符输出流,是写入字符流的抽象类
// 将 char 数组写入字符流
void write(char[] cbuf);
// 将 char 数组下标 off 后 len 个字符写入字符流
abstract void read(char[] cbuf, int off, int len);
// 写入单个字符
void write(int c);
// 写入字符串
void write(Stirng str);
// 写入字符串的某一部分
// 也是将 string 转成 char 然后执行 read(char[] cbuf, int off, int len);
void write(String str, int off, int len);
// 将指定的字符序列附加到此 Wirter
Writer append(CharSequence csq);
// 将指定字符序列的子序列追加到此 Writer
Writer append(CharSequence csq, int start, int end)
// 将指定字符追加到此 Writer
Writer append(char c);
// 刷新流的缓冲
abstract void flush();
// 关闭流,但是要刷新该流,否则关闭时会报错 IOException
abstract void close();
实例
- 实例不全,需自己动手探讨其中的奥秘
- 实例中使用了junit等注解,我在这里贴一。也可以不用,就是吧log换成println多写几个类
<dependencies>
<!--lombok 注解集合 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- logback 记录日志框架-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--Junit 单元测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
/**
* @author http://cnblogs.com/beixuan
*/
@Slf4j
public class StreamTest {
private static String fileName = "D:/Stream.txt";
private static String fileName1 = "D:/Reader.txt";
private static String fileName2 = "D:/红色高跟鞋.mp3";
@Before
public void getFile(){
File file = new File(fileName);
if (!file.exists()){
try {
//创建文件
file.createNewFile();
log.debug("创建文件成功:{}", fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
File file1 = new File(fileName1);
if (!file1.exists()){
try {
//创建文件
file1.createNewFile();
log.debug("创建文件成功:{}", fileName1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 字节输出流
*/
@Test
public void testOutputStream(){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
fos.write("Hello world".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
//刷新缓冲区
if (fos != null) {
try {
fos.flush();
log.debug("写入数据成功");
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 字节输入流
*/
@Test
public void testInputStream(){
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
int i = 0;
StringBuffer sb = new StringBuffer();
while ((i = fis.read()) != -1){
// i是字符对应的ASCII码
sb.append((char) i);
}
log.debug("{}:\n{}", fileName, sb.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 字符输出流
*/
@Test
public void testWriter(){
OutputStreamWriter osw = null;
try {
osw = new OutputStreamWriter(new FileOutputStream(fileName1));
osw.write("可以输出中文哦!\n\r\t还又'\\n\\r\\t'");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (osw != null){
try {
osw.flush();
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 字符输入流
*/
@Test
public void testReader(){
// InputStreamReader 转换流
InputStreamReader isr = null;
try {
isr = new InputStreamReader(new FileInputStream(fileName2));
StringBuffer sb = new StringBuffer();
int i;
while ((i = isr.read()) != -1){
sb.append((char)i);
}
log.debug("{}:\n{}", fileName2, sb);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 高效流对比
*/
@Test
public void IoEquals() throws IOException{
//操作的是一个3.19MB的音频文件 它们之间文件越大,效果就越明显
/***********************************************************************/
FileInputStream fis1 = new FileInputStream(fileName2);
FileOutputStream fos1 = new FileOutputStream(fileName);
int i;
long startTime = System.currentTimeMillis();
while ((i = fis1.read()) != -1){
fos1.write(i);
}
long endTime = System.currentTimeMillis();
log.debug("第一种高效流:{}", endTime - startTime);
fos1.close();
fis1.close();
/***********************************************************************/
FileInputStream fis2 = new FileInputStream(fileName2);
FileOutputStream fos2 = new FileOutputStream(fileName);
byte[] bytes = new byte[1024];
startTime = System.currentTimeMillis();
while ((i = fis2.read(bytes)) != -1){
fos2.write(bytes, 0, i);
}
endTime = System.currentTimeMillis();
log.debug("第二种高效流:{}", endTime - startTime);
fos2.close();
fis2.close();
/***********************************************************************/
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName2));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
startTime = System.currentTimeMillis();
while ((i = bis.read(bytes)) != -1){
bos.write(bytes, 0, i);
}
endTime = System.currentTimeMillis();
log.debug("第三种高效流:{}", endTime - startTime);
bos.close();
bis.close();
/**
* 第一种高效流:20186
* 第三种高效流:30
* 第二种高效流:10
* 这么对比下 BufferedInputStream BufferedOutputStream 是最好的配合
*/
}
}
小结
- 字节流常用于图片、音频、视频文件及PPT、Word文件.
- 字符流常用于处理文本类型的文件如txt、ini文件等
- 字节流也可以处理纯文本文件,但字符流不可以处理图片视频等非纯文本类型的文件
Java IO流的简单使用 通俗易懂 超详细 【内含案例】的更多相关文章
- JAVA IO流的简单总结+收集日志异常信息
1.字节流: IuputStream 所有字节输出流的超类 . 抽象类 ---- FileInputStream ---- BufferedInputStream:提供数据的读取效率,拓展方法(内部维 ...
- Java IO流简单使用
Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...
- Java IO流详解(一)——简单介绍
文件在程序中是以流的形式来传输的.所以用Java来传输文件就得使用到Java IO流. 1.流的概念和作用 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象<Thinkin ...
- 【Java基础】Java IO流的总结
Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...
- 【Android】数据存储-java IO流文件存储
1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.Sh ...
- Java基础17:Java IO流总结
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Java IO 流总结篇
1. 写在前面的话 I/O ,I 是 Input (输入)的缩写,O是Output (输出) 的缩写,众所周知,人与人之间想要沟通交流,就需要讲彼此都能听懂的语言,比如大家都统一说英语. 人类如果想和 ...
- java——IO流01
移动文件有一种简单方法,不需要复制文件再删除文件. package com.unir.test01; import java.io.File; import java.io.IOException; ...
- Java IO流学习
Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...
- java IO流 总结
[-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...
随机推荐
- Ajax分析与爬取实战
Ajax 分析与爬取实战 准备工作 安装好 Python3 了解 Python HTTP 请求库 requests 的基本用法 了解 Ajax 基础知识和分析 Ajax 的基本方法 爬取目标 以一个示 ...
- LangChain转换链:让数据处理更精准
上篇文章<5分钟了解LangChain的路由链>里主要介绍了路由链,核心类是LLMRouterChain和MultiPromptChain.本文介绍LangChain里的另外1个重要的链: ...
- apisix~14在自定义插件中调用proxy_rewrite
在 Apache APISIX 中,通过 proxy-rewrite 插件来修改上游配置时,需要确保插件的执行顺序和上下文环境正确.你提到在自己的插件中调用 proxy_rewrite.rewrite ...
- Apache Kylin(一)Kylin介绍
1. 传统大数据分析的问题 在基于Hadoop 生态的传统大数据分析中,主要使用的技术是MPP(Massively Parallel Processing)大规模并行处理和列式存储.MPP使用线性增加 ...
- UG二次开发 PYTHON 环境配置
NX 二次开发 PYTHON VSCODE 环境配置 我电脑上装的是WIN11 NX1988 在电脑的UG的安装文件夹内找到 python 一般在 xx\NXBIN 在所在的文件夹内,运行python ...
- .Net Core 全局捕获异常-中间件
1.代码版本 .Net Core 版本 2.2 2.目录结构 3.定义中间件 新建一个类 CustomerExceptionMiddleware.cs /// <summary> /// ...
- Claude是否超过Chatgpt,成为生成式AI的一哥?
Anthropic 周一推出了 Claude 3 ,据这家初创公司称,该系列中最有能力的 Claude 3 Opus 在各种基准测试中都优于 Openai 的竞争对手 GPT-4 和谷歌的 Gemin ...
- 简单万能队列状态机——WTYKAMC@2023
WTYKAMC@2023框架 [简介] 这是一个基于队列的灵活状态机,可以满足队列元素先进先出,先进后出,后进后出,后进先出,可以清除队列中未执行完的状态,且有一个默认超时执行状态:通过超时时间可以改 ...
- Vue 3 后端错误消息处理范例
1. 错误消息格式 前后端消息传递时,我们可以通过 json 的 errors 字段传递错误信息,一个比较好的格式范例为: { errors: { global: ["网络错误"] ...
- 基于Java+Spring+Vue仓储出入库管理系统设计和实现
\n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 网络的广泛应用给生活带来了十分的便利.所以把仓储出入库管理与现在网络相结合,利 ...