Java中io流解析及代码实例
作者:GavinZhou_xd 发布时间:2023-08-22 16:46:48
IO流
Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里面用的就是字节流
下面这张图是Java中IO流的总体框架:
字节流
Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract)
常用的字节流有:
1.FileInputStream/FileOutputStream
2.BufferedInputStream/BufferedOutputStream
3.SequenceInputStream(序列流)
4.ObjectInputStream/ObjectOutputStream(对象的输入输出流)
5.PrintStream(打印流)
字符流
Java中输入字符流是以Reader结尾的,输出字符流是以Writer结尾的,比如我们常见的FileReader和FileWriter就是个字符流,Reader和Witer是输入/输出字符流的超类,也是抽象类
常用的字符流有:
1.FileReader/FileWriter
2.BufferedReader/BufferedWriter
3.InputStremReader/OutputStreamWriter(转换流)
转换流
转换流就是将字节流转换为字符流的类,有两种:
·InputStreamReader
·OutputStreamWriter
InputStreamReader是个字符流(Reader),需要包装一个字节流(InputStream);
OutputStreamWriter是个字符流(Writer),需要包装一个字节流(OutputStream)
包装(decorate)
包装的作用的就是在原始的对象的基础上增加新的功能,比如BufferedReader包装一个Reader,实际就是对Reader功能的增强;原始的Reader只能按照一个字符一个字符的读取,经过包装之后形成的BufferedReader就具有了新的功能:直接读取一行(readLine)的功能,直观上说这就是所谓的Decorate.
在设计模式上这就是典型的装饰模式,其特点是:
1.装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
2.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能
对应到我们上来就是,BufferedReader和Reader都是个Reader,通过包装之后BufferedReader功能增强,但是依然可以当做Reader来用(OO的父类引用可以指向子类)
例子
字节流的例子
将mp3文件切割成多份数,然后重新组合起来
package cn.xdian.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class Demo2 {
public static void main(String[] args) throws IOException {
cutFile();
//切割MP3文件
mergeFlile();
//合并MP3文件
}
//合并MP3
public static void mergeFlile() throws IOException{
File dir = new File("/home/gavinzhou/music_test");
//找到文件夹下所有的MP3文件
Vector<FileInputStream> vector = new Vector<FileInputStream>();
File[] files = dir.listFiles();
for (File file : files){
if(file.getName().endsWith(".mp3")){
vector.add(new FileInputStream(file));
}
}
//通过Vector获取迭代器
Enumeration<FileInputStream> e = vector.elements();
//创建序列流
SequenceInputStream inputStream = new SequenceInputStream(e);
//输出流
FileOutputStream fileOutputStream = new FileOutputStream("/home/gavinzhou/conbine.mp3");
//读取分割的MP3文件
byte[] buf = new byte[1024];
int length = 0 ;
while((length = inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//关闭流
fileOutputStream.close();
inputStream.close();
}
//切割MP3
public static void cutFile() throws IOException{
File file = new File("/home/gavinzhou/test.mp3");
File dir = new File("/home/gavinzhou/music_test");
//输入字节流
FileInputStream fileInputStream = new FileInputStream(file);
//读取文件
byte[] buf = new byte[1024*1024];
int length = 0;
for (int i = 0 ; (length = fileInputStream.read(buf))!=-1 ; i++){
FileOutputStream fileOutputStream = new FileOutputStream(new File(dir,"part"+i+".mp3"));
fileOutputStream.write(buf,0,length);
fileOutputStream.close();
}
//关闭流
fileInputStream.close();
}
}
字符流的例子
拷贝文件A变为文件B
package cn.xidian.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File sourceFile = new File("/home/gavinzhou/a.txt");
File desFile = new File("/home/gavinzhou/b.txt");
//创建输入流
BufferedReader input = new BufferedReader(new FileReader(sourceFile));
//创建输出流
BufferedWriter output = new BufferedWriter(new FileWriter(desFile));
//读取源文件,写入到新的文件
String line = null;
while((line = input.readLine()) != null){
output.write(line);
output.newLine();
}
//关闭输入输出流
input.close();
output.close();
}
}
打印流的例子
package cn.xidian.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
/*
打印流可以打印任意类型的数据,打印数据之前都会先把数据转换成字符串再进行打印
*/
class Animal{
String name;
String color;
public Animal(String name,String color){
this.name = name;
this.color = color;
}
@Override
public String toString() {
return "名字:"+this.name+ " 颜色:"+ this.color;
}
}
public class Demo6 {
public static void main(String[] args) throws IOException {
/*
File file = new File("/home/gavinzhou/a.txt");
//创建打印流
PrintStream printStream = new PrintStream(file);
//打印任何信息到文件中
printStream.println(97);
printStream.println(3.14);
printStream.println('a');
printStream.println(true);
Animal a = new Animal("老鼠", "黑色");
printStream.println(a);
//更改标准的输入输出
System.setOut(printStream); //标准输出是到屏幕上
System.out.println("test.......");
*/
//收集异常的日志信息。
File logFile = new File("/home/gavinzhou/test.log");
PrintStream logPrintStream = new PrintStream( new FileOutputStream(logFile,true) );
try{
int c = 4/0;
//引起异常
System.out.println("c="+c);
int[] arr = null;
System.out.println(arr.length);
}
catch(Exception e){
e.printStackTrace(logPrintStream);
//输出到文件而不是屏幕上
}
}
}
总结
Java探索之Thread+IO文件的加密解密代码实例
Java IO流相关知识代码解析
java的IO流详细解读
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
来源:http://blog.csdn.net/gavin__zhou/article/details/52090071


猜你喜欢
- 前言在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该
- Java微信跳一跳操作指南,指哪挑哪。本文的思路是通过adb来控制手机进行操作,通过java写一个jframe覆盖在手机屏幕上,用鼠标获取跳
- 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
- 本文实例讲述了C#异步调用的方法。分享给大家供大家参考。具体如下:using System;using System.Collections
- 一、JMH vs JMeterJMeter可能是最常用的性能测试工具。它既支持图形界面,也支持命令行,属于黑盒测试的范畴,对非开发人员比较友
- 什么是FTPFTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件.可以
- 前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。在Java Code Geeks上已经有很多介绍
- 本文实例为大家分享了Java实现动态数字时钟的具体代码,供大家参考,具体内容如下构建:Clock继承 JFrame 为运行页面ClockTe
- MyBaties的基本配置标签1-全局配置文件(xxx.properties)引入的两种方式resource:引入类路径下的资源url:引入
- /* * Copyright 2012-2013 The Haohui Network Cor
- 绪论转眼间,2016伴随着互联网寒冬和帝都的雾霾马上就过去了,不知道大家今年一整年过得怎么样?最近票圈被各个城市的雾霾刷屏,内心难免会动荡,
- 第1部分 TreeSet介绍TreeSet简介TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSe
- 前言定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行。但定时器线程池也还是线程池,最底层实现还是ThreadPoolEx
- 目录效果图实现自定义软键盘1、通过xml定义键盘2、将xml文件与keyboardview绑定起来3、处理点击事件onKey附赠一些实用的效
- application.properties有以下这几条数据方法一:@Value注解+@Component建议properties少的时候用
- 在android智能平板设备应用中,一项耗时的操作总要有个提示进度的框来提高用户的操作体验,操作进度提示框就显得很常用了。系统自带的有进度条
- 简介Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型。泛型可以用于类、接口
- 本文实例讲述了C#分布式事务的超时处理的方法。分享给大家供大家参考。具体分析如下:事务是个很精妙的存在,我们在数据层、服务层、业务逻辑层等多
- 前言我在上一篇文章聊了Redisson的分布式锁,这次继续来聊聊Redisson的公平锁。下面是官方原话:它保证了当多个Redisson客户
- 本文实例讲述了Android编程之短信 * 实现方法。分享给大家供大家参考,具体如下:服务器:1、修改frombean:VideoForm中