概念
流是一种抽象概念,工作中经常会操作磁盘上的资源,这个过程就实现了数据的操作,数据的操作有输入流和输出流,磁盘上的文件和内存之间进行交互,交互需要有一个媒介或者管道,就称为IO流 (Input Output Stream),用来进行输入输出操作
io流的种类
1.按照流的流向
输入流:将数据读取到Java程序(内存)中使用的流
输出流:将Java程序(内存)向外传输使用的流
2.按照数据单位
字节流:一次性传输一个字节数据,将数据以字节的形式传输
字符流:一次性传输一个字符数据,将数据以字符的形式传输
字节输入流
InputStream类的常用方法
1.void close()
关闭此输入流并释放与该流关联的所有系统资源。
2.int read()
从输入流中读取数据的下一个字节。
3.int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
4.int read(byte[] b,int off, int len)
将输入流中最多len个数据字节读入 byte 数组
文件输入流FileInputStream
//将文件中的内容读取出来
//读,输入的过程
//字节输入流==》InputStream
//给定一个相对路径,创建文件对象
File f=new File("aaa.txt");
//通过管道建立文件输入流,然后将文件f传入
InputStream is=new FileInputStream(f);
//read()方法 读取一个字节,读不到时返回-1
int a=0;
//每读到一个值,赋给a,只要不是-1就一直读
while((a=is.read())!=-1){
//将读到的结果转为char类型
System.out.print((char)a);
}
//int read(byte[] b) 每次读取b数组长度个字节,读不到返回-1
byte[] bs=new byte[5];
//读取的个数
int read=0;
//返回的是读取的个数,如果读不到返回-1
while((read=is.read(bs))!=-1){
//将数组中从第0位开始,向后截取read个字节转换为字符串
String string = new String(bs, 0,read);
System.out.print(string);
}
//int read(byte[] b,int offset, int length)
//每次读取length个字节,从第offset为开始赋值,读不到返回-1
byte[] bs=new byte[1024];
is.read(bs, 3, 14);
System.out.println(Arrays.asList(bs).toString());
//关闭管道
is.close();
字节输出流
OutputStream类的常用方法
void close()
关闭此输出流并释放与此流有关的所有系统资源
void flush()
刷新此输出流并强制写出所有缓冲的输出字节
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流
void write(byte[] b,int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
void write(int b)
将指定的字节写入此输出流
文件输出流FileOutputStream
//写:这是将java代码中的内容输出到文本中,Output
String a="abcdefg";
File f=new File("aaa.txt");
//FileOutputStream(File file) 在file和java代码创建字节输出流
//FileOutputStream(File file, boolean append) 在file和java代码创建字节输出流,append表示写的时候是跟着往后写还是覆盖写?默认为false(覆盖)
OutputStream os=new FileOutputStream(f);
// void write(int b):一个一个字节的写
byte[] bytes = a.getBytes();
for (int i = 0; i < bytes.length; i++) {
os.write(bytes[i]);
}
// void write(byte[] b):一个字节数组的写
byte[] bytes = a.getBytes();
os.write(bytes);
//void write(byte[] b,int off, int len)
//将b这个数组中,从off开始向后的len个写到目标文件中
byte[] bytes = a.getBytes();
os.write(bytes, 3, 3);
//刷新
os.flush();
//关闭管道
os.close();
字符输入流
Reader类
//File.separator:斜杠\的意思
File file=new File("ref"+File.separator+"aaa.txt");
Reader r=r=new FileReader(file);
//一个字符的读
int a=0;
while((a=r.read())!=-1){
System.out.println((char)a);
}
//一个字符数组的读
char[] cs=new char[3];
while(r.read(cs)!=-1){
for (int i = 0; i < cs.length; i++) {
System.out.println(cs[i]);
}
}
r.close();
字符输出流
Writer类
File file=new File("ref"+File.separator+"aaa.txt");
Writer w=new FileWriter(file);//覆盖原来的写
String a="今天天气不错";
char[] cs=a.toCharArray();
//一个字符的写
for (int i = 0; i < cs.length; i++) {
w.write(cs[i]);
}
//一个数组的写
w.write(cs);
//直接写一个字符串
w.write(a);
w.flush();
w.close();
字符流与字节流的区别
字节流可以处理任意类型的文件,包含字符文件,而字符流只能处理字符文件
字符流默认使用缓冲区,而字节流没有
如果复制的文件是文本文件 ,用字节流和字符流都可以
如果复制的文件是图片、音乐、电影, 使用字节流