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流传输数据 传输数据大小 ...
随机推荐
- Cocos2D绘制纹理的一般方法
如果你想在通常情况下绘制纹理,最简单的方法是在CCSprite的子类中实现.否则你将不得不自己创建一个CCRenderState对象传递给blend模式,着色器以及(可选的)纹理给CCRenderer ...
- apache 负载测试工具 ab
1.ab工具是apache自带的工具,可以测试服务器的负载能力 2.ab工具的参数 -v:版本 -c:并发数 -n:请求数 -t: 测试所进行的最大秒数 3.例子:ab -c 100 -n 100 - ...
- Xcode出现may cause a leak非忽略的解决方法
前面提到可以把may cause a leak当成安静的美代码忽略掉,但其实还是有另一种方法滴. 你可以用如下代码替换以消除該警告: [xxx performSelector:_cmd withObj ...
- LeetCode之“动态规划”:Word Break && Word Break II
1. Word Break 题目链接 题目要求: Given a string s and a dictionary of words dict, determine if s can be seg ...
- github搭建个人网站
1. 注册账号: 地址: https://github.com/ 输入账号.邮箱.密码,然后点击注册按钮. 2. 初始设置 注册完成后,选择Free免费账号完成设置. 2.1 验证邮箱 请打开你的 ...
- 面试之路(8)-BAT面试题之数组和链表的区别
两种数据结构都是线性表,在排序和查找等算法中都有广泛的应用 各自的特点: 数组: 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个 ...
- LeetCode之旅(13)-Valid Anagram
题目介绍: Given two strings s and t, write a function to determine if t is an anagram of s. For example, ...
- 关于electron的sqlite3报错,需重新编译的问题
你需要安装sqlite3的所有依赖项,例如vs.python等.或者简单的npm安装命令,它会安装windows下的所有依赖. npm install -g windows-build-tools 然 ...
- 讲解Oracle面试过程中常见的二十个问题
1.冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备 ...
- 什么是shell? bash和shell有什么关系?
什么是shell? bash和shell有什么关系? 博客分类: Linux 什么是Shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序 ...