IO流
IO流的种类
架构图
- 字节流结构图
- 字符流结构图
按处理数据单位分为:字节流和字符流;
字节流:按照字节读取数据(InputStream、OutputStream);
字符流:按照字符读取数据(Reader、Writer);
按流向分类:**输入流**和输出流;
输入流:从数据源到程序(InputStream、Reader读进来)
输出流:从程序到目的地(OutputStream、Writer写进去)
按功能分类:节点流和**处理流**;
节点流:直接向一个特定的I/O设备(磁盘、网络等)读取数据的流称为节点流;
处理流:程序通过一个间接流去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流;
字节读取的应用实例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class FileCharSum {
public static void main(String[] args) throws Exception {
File file=new File("E:/FileTest/a.txt");
InputStream is=new FileInputStream(file);
BufferedInputStream bis=new BufferedInputStream(is);
int len;
Map<Character,Integer> map=new HashMap<>();
//定义一个字节数组,用于接收读取到的字节,一般大小设置为1024
byte[] bytes=new byte[1024];
String str = null; //提升作用域
//bis.read(bytes)表示实际读取到字节的长度
while((len=bis.read(bytes))!=-1){
//将字节进行拼接成字符串
String str2=new String(bytes,0,len);
str=str2;
System.out.println(len);
System.out.println(str);
}
//将字符串转为char字符数组
char[] chars=str.toCharArray();
for (char c:chars){ //增强for循环遍历char数组
//调用map集合中的containKey方法,判断字符串是否存在map的键中
if (map.containsKey(c)){
//向map集合中添加数据
map.put(c,map.get(c)+1);
}else {
map.put(c,1);
}
}
Set<Character> set = map.keySet();
for (Character c:set){
//增强for遍历输出
System.out.println(c+"----------"+map.get(c));
}
}
}
字符读取的应用实例:
package com.ysh.demo.review04;
import java.io.*;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class FileCharSum02 {
public static void main(String[] args) throws Exception {
File file=new File("E:/FileTest/a.txt");
Reader is=new FileReader(file);
BufferedReader br=new BufferedReader(is);
Map<Character,Integer> map=new HashMap<>();
String str = null;
String msg=null;
//br.readLine()每次读取一行
while((msg=br.readLine())!=null){
str=msg;
System.out.println(str);
}
char[] chars=str.toCharArray();
for (char c:chars){
if (map.containsKey(c)){
map.put(c,map.get(c)+1);
}else {
map.put(c,1);
}
}
Set<Character> set = map.keySet();
for (Character c:set){
System.out.println(c+"----------"+map.get(c));
}
}
}
例题:copy一个文件
import java.io.*;
/**
* 需求:copy一个文件
*/
public class FileCharSum03 {
public static void main(String[] args) throws Exception {
File src=new File("E:/FileTest/a.txt");
Reader rd=new FileReader(src);
BufferedReader brd=new BufferedReader(rd);
File dest=new File("E:/FileTest/e.txt");
//将文件放到流中
Writer w=new FileWriter(dest);
//将流放入到缓冲池中
BufferedWriter bw=new BufferedWriter(w);
String msg;
while ((msg=brd.readLine())!=null){
bw.write(msg);
}
bw.flush();
bw.close();
w.close();
brd.close();
rd.close();
}
}