1.流的概念(基础)
流:内存与存储设备之间传输数据的通道。
流的作用就是提供通道。从而使用通道把源中的字节送到目的地。
2.流的分类:
(1)按照方向:
输入流:将<存储设备>中的内容读入到<内存>中。
输出流:将<内存>中的内容***写***入到<存储设备>中。
(2)按单位:
字节流:以字节为单位,可以读写所有数据
字符流:以字符为单位,只能读写文本数据
(3)按功能:
节点流:具有实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能。
3字节流
(1)字节流的父类(抽象类)
InputStream类和OutputStream类均是抽象类,分别是所有字节输入流或所有字节输出流的父类。
(2)字节节点流:
FileOutputStream:
public void Write(byte[] b)//一次写多个字节将b数组中所有字节,写入输出流。
FileInputStream:
public int read(byte [] b)//从流中读取多个字节,将读到内容存入数组b,返回实际读到的字节数;如果达到文件的尾部,则返回-1.
代码示例FileOutputStream:
package com.lz.t0;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestOutPutStream {
public static void main(String[] args) throws IOException {//将异常抛出,也可以使用try-catch语句
//1.输出字节流OutputStream
//2.输出字节节点流 具有实际传输的功能(文件路径,Boolean append) true代表追加,不覆盖
//路径正确,但是文件不存在,则会创建一个文件
//绝对路径"D:\\java\\a.txt"必须存在
//相对路径Files\\a.txt与上一种形式等价,相对于当前项目带的路径下,寻找该路径和文件
FileOutputStream fos =new FileOutputStream("Files\\a.txt");
//传输单个文字
String s="你好";
byte[] bs =s.getBytes();
fos.write(bs);
// fos.write(65);//输出单个字节
// fos.write(66);
// fos.write(67);
//
// fos.write('D');//输出字符
// byte[] bytes=new byte[] {65,66,67,68,69,70,'G'};//创建一个数组,并将数据存储在数组中
// fos.write(bytes);//一次输出一组字节
//字节数组 开始下标 长度
// fos.write(bytes, 1, 3);//输出数组中下标1-3的数组元素
}
}
代码示例FileOutputStream+FileInputStream:
package com.lz.t0;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileInputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos =new FileOutputStream("Files\\b.txt");//创建文件b.txt
//传输多个字符
String s="ABCD";
byte[] bs =s.getBytes();
fos.write(bs);
FileInputStream fis =new FileInputStream("Files\\b.txt");
//读到-1就不读了
// while(true) {
// int n=fis.read();//一次读一个字节
// if(n==-1) {
// break;
// }
// System.out.println((char)n);//读字符强转为char
// }
byte[] bytes =new byte[4];
while(true) {
int count= fis.read(bytes);//每次读取到的有效字节个数
if(count==-1) {
break;
}
//读多少,打印多少
for(int i=0;i<count;i++) {
System.out.println((char)bytes[i]);
}
System.out.println();
}
}
}
示例3:利用io输入输出复制一张图片
package com.lz.t0;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileIO {
public static void main(String[] args) throws IOException {
//将指定的图片,上传一份到项目里来
//文件是存储设备中-》读到程序中来-》写入到存储设备中
FileInputStream fis =new FileInputStream("E:\\360MoveData\\Users\\lenovo\\Desktop\\QQ截图20190307080440.png");
//输出流
FileOutputStream fos =new FileOutputStream("Files\\美女.jpg");
// byte[] cache =new byte[1024*1024];//复制的图片的大小为1m,原图片560k左右,不符合,浪费资源
int cache=0;//代表每次读到的字节
while((cache=fis.read())!=-1) {//原来图片有多大,复制多大
fos.write(cache);//读多少写多少
}
//释放资源
fis.close();
fos.close();
}
}
(3)字节过滤流:
缓冲流:
BufferedOutputStream/BUfferedOutputStream
作用:提高IO效率,减少访问磁盘的次数。提高数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close。
示例:
package com.lz.t1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestBufferOutputStream {
public static void main(String[] args) throws IOException {
//有参构造需要一个字节输出节点流
//先创键字节输出结点流
FileOutputStream fos =new FileOutputStream("Files\\buff.txt");
//增强节点流
BufferedOutputStream bos =new BufferedOutputStream(fos);
//过滤流的Write方法,是先写入到缓冲区数组里
bos.write('A');
bos.write('B');
bos.write('C');
bos.write('D');
bos.flush();//刷新缓冲区(将缓冲区的数据,一次性写入到文件中,并清空当前缓冲区)
bos.write('E');
bos.write('F');
bos.flush();
bos.close();//关闭输出流,并将缓冲区的数据一次性写入文件中。
//-----------------------------
FileInputStream fis =new FileInputStream("Files\\buff.txt");//读入文件中的内容
BufferedInputStream bis =new BufferedInputStream(fis);
byte[] bytes =new byte[4];//
while(true) {
int len=bis.read(bytes);
if(len==-1) {break;}
for(int i=0;i<len;i++) {
System.out.println((char)bytes[i]+"\t");
}
System.out.println();
}
}
}