java中io流案例_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多写几个类
org.projectlombok
lombok
1.18.12
ch.qos.logback
logback-classic
1.2.3
junit
junit
4.13
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流的简单使用 通俗易懂 超详细 【内含案例】相关推荐
- Java中的File类和IO流
Java中的File类和IO流 File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. File的分隔符 import java.io.Fi ...
- java中的i/o体系结构及流分类
Java中IO流的体系结构如图: 在整个Java.io包中最重要的就是5个类和一个接口.5个类指的是File.OutputStream.InputStream.Writer.Reader:一个接口指的 ...
- 【java】java中内存映射文件和IO
转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...
- keil5中找不到或没有对应的芯片怎么办?超详细!!
keil5中找不到或没有对应的芯片怎么办?超详细!! 安装完Keil5之后,有的小伙伴们是不是会发现,为什么新建工程的时候找不到自己想要的CUP型号,如下图: 这里就假设要找的CUP型号是三星的S3C ...
- java io流大全_Java IO流系统整理
Java IO流的分类 Java中的流,可以从不同的角度进行分类. 按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 按数据传输单位分类: 字节流:以字节(8位 ...
- java 流 中文_Java IO流之中文乱码
相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去. 今天主要就讲讲一些常用的可以设置编码的 ...
- java io框架图_Java IO流体系继承结构图解析
Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是 ...
- java中什么是字节流和字符流_java中字节流与字符流的区别是什么
字节(Byte)是进行io操作的基本数据单位,在程序进行字节数据输出时可以使用OutputStream类完成 此类定义如下: public abstract class OutputStream ex ...
- java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...
JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...
最新文章
- Reddit引入Envoy支持架构改造,性能显著提升
- 只缺一个程序员 如何让产品实现
- linux中rm删除的文件是否可以恢复,Linux下用rm删除的文件的恢复方法
- STP文件服务器,综合监控stp服务器
- 如何评价一个推荐系统的好坏?
- 字符串分割--java中String.split()用法
- c语言long说明符,C语言-类型说明符 long,short,unsigned,signed
- arcmap中使用python_ArcMap - 使用python更新列中的值
- webplayer 设置加载图标和屏蔽右键
- 吴恩达神经网络和深度学习-学习笔记-27-多任务学习
- vue3 three ts 全景图
- 【操作系统】王道考研 p22-26 生产者消费者问题、多生产者多消费者问题、吸烟者问题、读者写者问题、哲学家进餐问题
- 寒山是一位高僧,拾得是一位和尚。
- 初学python:输入某年某月某日,判断这一天是这一年的第几天
- java线程中的tid_jstack中的tid到底是什么意思呢
- 掌握el-table的formatter方法,提升数据展示效果
- 计算机网卡更改mac地址,Mac电脑网卡MAC地址修改的具体步骤
- MFC win32 API串口同步模式代码示范
- svn查看ip linux,查看svn服务器的ip地址
- 模拟抽奖过程的C语言程序设计,C++抽奖程序实现方法
热门文章
- java web接收POST数据
- 数据挖掘之3种数据归一化方法及代码实现
- Flask实战2问答平台-完成登录注册功能
- oracle 怎么判断是不是第一条记录_怎么判断自己是不是阳痿呢?防治阳痿的5个方法值得一试...
- LibSVM学习(二)——第一次体验libSvm
- [uEnv.txt]在uEnv.txt文件中使用if语句实现Image/dtb文件切换
- ubuntu9.10升级成功
- DevExpress v17.2新版亮点——CodeRush篇(二)
- 循环获取枚举值和名称
- iOS提交应用至App Store流程及真机调试 一,证书、配置文件