io流主要分为 :输入流和输出流,字节流、字符流、缓冲流、转换流、对象流、打印流。
输入和输出:基准是内存
数据进入内存:就叫输入
输出写出内存:就叫输出
IO流分类:
按照“流”的数据流向,可以将其化分为:输入流和输出流。
按照“流”中处理数据的单位,可以将其区分为:字节流和字符流。在java中,字节是占1个Byte,即8位;而字符是占2个Byte,即16位。而且,需要注意的是,java的字节是有符号类型,而字符是无符号类型!
字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,如InputStream的子类FileInputStream,Reader的子类FileReader。
1.字节和字符流
字节输入流(InputStream):
常用方法:
int read();//读取一个字节的数据,如果没有数据则返回-1
int read(byte[] b);//将读入的数据存入byte数组,返回读取的长度,如果没有数据则回-1
void close();//关闭流,释放资源
字节输出流(OutputStream):
常用方法:
void write(int i);//写出一个字节的数据
void write(byte[] b);//把byte数组中的数据写出去
void write(byte[] b,int offset,int len);//把byte数组中从offset位置开始,长度是len数据写出去
void flush();//刷新,清空缓存区
void close();//关闭流,释放资源
字符输入流(Reader):
常用方法:
int read();//读取一个字符的数据,如果没有数据则返回-1
int read(char[] ch);//读取数据存入char数组,返回读取的长度,如果没有数据则返回-1
void close();//关闭流,释放资源
字符输出流(Writer):
常用方法:
void write(int i);//写出一个字符的数据
void write(char[] ch);//写出char数组中的全部数据
void write(char[] ch,int offset,int len);//写出char数组中,从offset开始到len长的数据
void flush();//刷新,清空缓存区
void close();//关闭流,释放资源
InputStream
InputStream字节输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示:
FileInputStream
FileInputStream:文件字节输入流
构造方法摘要
FileInputStream(File file):通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(FileDescriptor fdObj):创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。
FileInputStream(String name):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
综合案例
public class day5 {
public static void main(String[] args) throws IOException {
// 1.定义源文件和目标文件的File对象
File f1 = new File("D:/a.jpg");
File newFile = new File("D:/aa/newFile.jpg");
// 2.定义输入输出流关联文件
InputStream in = new FileInputStream(f1);
OutputStream out = new FileOutputStream(newFile);
// 3.使用输入流读取内容,然后把读取的内容写入目标文件
// // 3.(方法1)逐个进行读写操作
// int n;
// while ( (n = in.read() ) !=-1 ){
// out.write(n);
// }
//
// // 3.(方法2)使用缓冲区读写
// byte[] buffer = new byte[10];
// while ( (n = in.read(buffer)) !=-1 ){
// out.write(buffer,0,n);
// }
// 3.(方法3)
long start = System.currentTimeMillis();
// 推荐写法
byte[] buffer = new byte[1024];
int n ;
while ( (n = in.read(buffer)) !=-1 ){
out.write(buffer,0,n);
}
long stop = System.currentTimeMillis();
System.out.println("耗时:"+(stop-start));
}
}