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 非流式 ...
随机推荐
- Nuxt3页面开发实战探索
title: Nuxt3页面开发实战探索 date: 2024/6/19 updated: 2024/6/19 author: cmdragon excerpt: 摘要:这篇文章是关于Nuxt3页面开 ...
- injectionIII iOS代码注入工具(上)
injectionIII iOS代码注入工具(上) 前言 如果之前用过injection的朋友一定会对其热重载的特性印象深刻,如今injection经过多次更新,现在以injectionIII之名上架 ...
- gcc系列工具 介绍
编译器相关知识学习 GNU GCC简介 GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言.多种优化选项并且能够支持分步编译.支持多种反汇编方式.支持多种调试信息格式,目前支持X86. ...
- LAMP-CentOS7搭建Web服务器
搭建LAMP Web服务器 在家中翻到了以前用的老电脑,在思索一番后,决定把这台电脑改造成一台Web服务器,作为我自己搭建博客的测试机器. 一.Linux服务器 LAMP中的L指的是Linux服务器, ...
- 【VMware vSAN】vSAN Data Protection Part 2:配置管理。
上篇文章"vSAN Data Protection Part 1:安装部署."介绍了如何安装及部署 VMware Snapshot Service Appliance 设备,并在 ...
- UF_MB_ask_button_id 测试
# tesy UF_MB_ask_button_id import NXOpen import NXOpen_UF as nuf def main(): ses = NXOpen.Session.Ge ...
- mac电脑好用的工具总结
制作gif:https://gfycat.com/gifbrewery 制作gif(超级好用,制作速度快,压缩图片小):https://www.cockos.com/licecap/ 解压工具:htt ...
- Mybatis下划线自动映射驼峰字段
mybatis-config.xml <!--下划线自动映射驼峰字段--> <settings> <setting name="mapUnderscoreToC ...
- 启动数据分析软件SPSS17遭遇的两弹窗解决方案
问题描述 朋友请我帮她安装 SPSS17 这款软件,我寻思这是啥软件,谷歌一下,发现是一个数据分析工具. 在一系列的下一步.确定后,打开时,第 1 个惊喜弹窗来了: [弹窗内容]应用程序无法启动,因为 ...
- WebGL压缩纹理实践
0x01 本文将讲述压缩纹理在实际项目中的使用的案例.最近的一个项目是这样的:项目由于涉及到的建筑物特别多,大概有近40栋的建筑,而每一栋建筑物,又有10层楼,每层楼里面又有很多的设备.这就导致我们需 ...