一、IO流简介:
流的定义:流是指一连串流动的字符,是以先进先出方式发送信息的通道。
按流向分:输出流:OutputStream和Writer为基类
输入流:InputStream和Reader为基类
按处理数据单元划分:字节流:字节输入流:InputStream基类
字节输出流:OutputStream基类
字符流:字符输入流:Reader基类
字节输出流:Writer基类
(字节流是 8 位通用字节流,字符流是16位Unicode字符流)
1.1 InputStream
引入相关的类:InputStream ins =null;
构建输入流,例如FileInputStream:
ins =new FileInputStream(new File(path));
操控字节输入流的,所用的方法也是针对字节的。
常用方法:
返回值类型 | 方法名 | 方法简介 |
abstract int | read( ) | 从此输入流中读取下一个字节(此方法是抽象方法,子类必须实现该方法。 |
int | read(byte [ ] b ) | 从输入流中读取一定数量的字节,存储在参数指定的字节数组中。 |
int | read(byte [ ] b ,int off ,int len ) | 读到 len字节从输入流读入字节数组数据。 |
long | skip( long n ) | 跳过并丢弃 n字节从输入流中的数据。 |
int | available( ) | 返回此输入流下一个方法可以读取的字节数。 |
package ChangYL.FileTest.InPutTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InPutTest02 {
public static void main(String[] args) throws Exception {
// 缓冲区
File f1 = new File("d:/d.txt");
InputStream in = new FileInputStream(f1);
// byte[] b=new byte[10];
// //一次最多读取数组长度个字节,读取的内容转换成对应数字存入byte 数组中,
// // 返回的是实际读取的字节数
// int n = in.read(b);
// System. out . println("读取的字节数: "+n);
// String s=new String(b,0,n);
// System. out. println(s);
// byte[] b1=new byte[10];
// //只剩5 个字节,实际读取了5个字节 数组后五个是默认值(无效数据)
// int n1 = in.read(b1);
// System. out . println("读取的字节数: "+n1);
// // 对数组中从0索引开始截取读取到的有效字符数个内容 组成字符串
// String s1=new String(b1,0,n1);
// System. out . println(s1);
// 推荐写法
byte[] b2=new byte[10];
int n;
while ( (n=in.read(b2)) !=-1 ){
String z = new String(b2 ,0,n);
System.out.print(z);
}
}
}
1.2 OutputStream
常用方法:
返回值类型 | 方法名 | 方法简介 |
void | flush( ) | 刷新输出流,是缓存数据被写出来 |
void | write(byte [ ] b) | 写b.length 字节从指定的字节数组的输出流 |
void | write(byte [ ] b, int off, int len) | 写len字节从字节数组数据中到输入流 |
abstract int | write( int b ) | 将指定的字节写入该输出流中 |
1.2.1 FileOutputStream
是OutputSTream的子类,主要功能是从源文件写入资料至指定文件中
构造方法:
1、FileOutputStream( File file )// 创建“File对象”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。若要追加则为(File file, true);
2、FileOutputStream( String path ) // 创建“文件(路径为path)”对应的“文件输入流”; (若没有,自动系统调用方法创建),默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。 若要追加则为(String path, true);
综合案例完成文件的复制
package ChangYL.FileTest.InPutTest;
import java.io.*;
public class CopyFileTest03 {
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));
}
}