java I/O流详解
概况
I/O流主要分为二大类别:字符流和字节流。
字节流(基本流)
1、字节输入流 类名:FileInputStream 特点:读(对文件进行读取操作) 父类:InputStream
2、字节输出流 类名:FileOutputStream 特点:写 (对文件进行写入操作) 父类:OutputStream
字符流(基本流)
1、字符输入流 类名:FileReader 特点:读(对文件进行读取操作) 父类:InputStreamReader
2、字符输出流 类名:FileWriter 特点:写 (对文件进行写入操作) 父类:OutputStreamWriter
缓冲流
字节缓冲流
1、缓冲字节输入流 类名:BufferedInputStream 特点:读(对文件进行读取操作) 父类:FilterInputStream
2、缓冲字节输出流 类名:BufferedOutputStream 特点:写 (对文件进行写入操作) 父类:FilterOutputStream
字符缓冲流
1、缓冲字符输入流 类名:BufferedReader 特点:读(对文件进行读取操作) 父类:Reader (基本输入流多了readLine()一次读取一行方法)
2、缓冲字符输出流 类名:BufferedWriter 特点:写 (对文件进行写入操作) 父类:Writer (比基本输出流多了newLine() 换行方法)
转换流
1、InputStreamReader 特点:读 (对文件进行读取操作) 输入流 父类:Reader
2、OutputStreamWriter 特点:写 (对文件进行写入操作) 输出流 父类:Writer
打印流
1、PrintStream 特点:写 (对文件进行写入操作) 底层:基本字节流
2、PrintWriter 特点:写 (对文件进行写入操作) 底层:基本字符流
基本字节流和基本字符流的区别:
1、字节流可以读写任何文件 字符流只能读取普通文件
2、读写文本文件尽量使用字符流 这要比字节流效率高
3、读写媒体文件用字节流
4、基本字节流没有缓冲区
5、基本字符流有缓冲区 默认大小为8k (不能指定缓冲区大小)
6、字节流是一个一个字节读 效率比较低 虽然可以读取各种各样的文件但是 最适用于读取媒体文件
7、字符流是一个一个字符读 效率比较高
缓冲流和基本流的区别:
1、缓冲流效率要高于基本流
2、缓冲字符流弥补了基本字符流不能设置缓冲区大小的缺口
3、缓冲字节流和基本字节流相比 建议使用基本字节流
4、缓冲字符流和基本字符流相比 建议使用缓冲字符流
转换流的作用
转换流的作用主要是解决在进行读写操作时出现的中文乱码 (java默认处理文件时是gbk 当将文本文件保存为utf-8的时候 进行读写操作就会出现中文乱码)
// 用转换流读写
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"), "utf-8");
osw.write("中国");
osw.close(); InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"utf-8"); char[] cc = new char[10];
isr.read(cc);
String ss = new String(cc);
System.out.println(ss);
isr.close();
API图

用法总结:
1、多媒体类 用字节流
读:基本字节输入流
写:基本字节输出流
2、文件文件 用字符流
读:建议用字符缓冲输入流
写:建议用字符缓冲输出流 如果写的数据多种多样的建议用打印流(PrintStream、PrintWriter)
3、比较明显意图的数据流
读写对象只能用对象流(ObjectInputStream、ObjectOutputStream)
如果在读写文件的过程中遇到中文乱码只能用转换流(InputStreamReader、OutputStreamWriter)
简单实例:
复制较小文件代码:
// 复制较小文件
// 先读后写 读的时候文件必须存在 不会自动创建 写的时候文件可以不存在会自动创建
File f = new File("D:\\practice\\backend\\a.txt");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int)f.length()];
fis.read(b);
fis.close(); // 写
FileOutputStream fos = new FileOutputStream("D:\\practice\\backend\\b.txt");//不存在会自动创建
fos.write(b);
fos.close();
复制较大文件代码:
// 读取复制大文件
// 一边读一边写
FileInputStream fis = new FileInputStream("D:\\practice\\backend\\hello.mp4");//不存在不会自动创建
FileOutputStream fos = new FileOutputStream("D:\\practice\\backend\\h.mp4");//不存在会自动创建
byte[] b = new byte[1024*1024];//每次读取1M
while(true){
int len = fis.read(b);
System.out.println(len);
if(len == -1){
break;//当返回值是-1 证明文件已经读取完 终止循环
}
fos.write(b, 0, len);
}
fis.close();
fos.close();
利用递归查找某个目录下的视频文件
public class Demo7 {
public static void findAvi(String pathName){
File ff = new File(pathName);
File[] fss = ff.listFiles();
for (File fa : fss) {
if(fa.isFile()){//判断是否是文件
if(fa.getName().endsWith(".mp4")){//判断是否是视频文件
System.out.println(fa);
}
}else{
findAvi(fa.getPath());
}
}
}
public static void main(String[] args) {
// 递归查找某个目录下的视频文件
// E:\迅雷下载
String ss = "E:\\迅雷下载";
findAvi(ss);//静态方法只能访问静态方法
}
}
java I/O流详解的更多相关文章
- Java之IO流详解
IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中 ←→ 把数据写入硬盘(磁带) 内存中的数据不可持久保存的 输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...
- JAVA中IO流详解
IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...
- java之IO流详解(二)
好了,昨天讲了字节流,现在我们就来讲字符流吧... 字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操 ...
- java之IO流详解(一)
IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 InputStream 字节输出流 OutputStream 字符流 字符输入流 Reader 字 ...
- Java I/O流详解与应用
注:学习之前,需要自己思考,不要盲目的去看!!!!!不然没有任何意义 I/O流(一) 1.定义:实现设备之间的传输 2.作用:实现数据的读入和写出 3.分类:根据操作分为:输入流和输出流 根据类型分为 ...
- Java I/O流详解与应用(二)
I/O流(二) 一.缓冲流(缓冲区): 特点:本身没有读写的能力,需要借助普通的读写流进行读写,但可以加快读写的效率 分类:字符缓冲流:BufferedReader(读),BufferedWriter ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- Java输出流FileOutputStream使用详解
Java输出流FileOutputStream使用详解 http://baijiahao.baidu.com/s?id=1600984799323133994&wfr=spider&f ...
- java网络编程(TCP详解)
网络编程详解-TCP 一,TCP协议的特点 面向连接的协议(有发送端就一定要有接收端) 通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...
随机推荐
- iOS APP设计规范大全
目前最为齐全的iOS APP设计规范大全,Mark一个- 欢迎参考本文,未经许可,严禁转载!
- Linux0.11启动过程
从开机加电,到执行main函数之前的过程 好吧,这里应该是有执行3个汇编的文件,但是我不太了解.囧 从main函数,到启动OK(即可以响应用户操作了) 这个步骤做了3件事情: 创建进程0,使之具备在主 ...
- Rust语言之HelloWorld
Rust语言之HelloWorld 参考文档: http://doc.crates.io/guide.html 1 什么是Cargo 相当于maven/ant之于java, automake之于c, ...
- 关于iOS中几种第三方对XML/JSON数据解析的使用
Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...
- 基于Reactjs实现webapp(加精)
git原文链接:https://github.com/my-fe/wiki/issues/1 由于最近的reactjs实在太火,而且距离第一版已经快2年的时间了,已经相对稳定和成熟了,基于这两个前提下 ...
- CentOS 7 运行级别的切换
CentOS 7 运行级别的切换 由命令行级别切换到窗口级别的命令未变:init 5或startx 由窗口级别切换到命令行级别的命令未变:init 3 新版本的运行级别都定义在 /lib/system ...
- Volley网络框架完全解析(缓存篇)
在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...
- 和菜鸟一起学linux总线驱动之i2c死锁问题
不知不觉中已经有好几个月没有写点东西了,懒了就是懒了,说是忙着想把产品做得更好,都是借口,每天花一点时间来写点东西确实很不错,自己也坚持了很久很久,只不过今年以来,发现提高不是很大,能写的东西好少好少 ...
- MySQL数据库存储过程动态表建立(PREPARE)
PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] / ...
- Sencha touch API
Sencha touch API http://docs.sencha.com/touch/2.3.1/#!/guide/getting_started