一、IO流(上)
1、IO:Input(输入:读)和Output(输出:写)
"输入"是从外界到程序中的方向,是我们程序用于获取外界信息的过程,是"读"的过程
"输出"是从程序到外界的方法,是我们程序向外界发送信息的过程,是"写"的过程
注:硬盘只存二进制
2、输入输出流
//java.io.InputStream与OutputStream
* 输入流与输出流
* 这里的流相当于是程序与外界相连的一根管道,用于传输数据.而数据就是字节(2进制)
//InputStream和OutputStream是两个超类,抽象类.
java中实际用于读写数据的流都继承自他们.
3、文件流
//java.io.FileInputStream和FileOutputStream//覆盖模式
* 这两个流就继承自InputStream和OutputStream
* 这两个流是用于连接我们程序和文件之间的管道,读写文件数据(读写硬盘)
1248码
4、OutputStream()----write()和close()
//OutputStream上定义的方法:void write(int d)
通过当前输出流向目标位置写出1个字节,写出给定int值对应2进制的"低八位"
①write()---向文件中写入一个字节
②close()---流使用完毕要关闭
FileOutputStream fas=new FileOutputStream("fas.txt");
for(int i=0;i<26;i++){
fas.write(97+i);
}
System.out.println("输出完毕");
fas.close();//流使用完毕后要关闭
文件输出流可以创建一个文件
5、InputStream()----read()、write()和currentTimeMillis()
①read()读取文件字节
②write()
③System.currentTimeMillis()--获取当前系统时间的毫秒数
System.currentTimeMillis():返回当前系统时间,时间是一个long值,表示当前系统的UTC时间
//UTC:世界协调时间
//计算标准:自1970-01-01 00:00:00到表达的时间所经过的毫秒,常用于计算时间间隔或者用于生成唯一的时间戳。
FileInputStream fis=new FileInputStream("./image.png");
FileOutputStream fos=new FileOutputStream("./image_cp.png");
int d;
/*while (true){
d= fis.read();
if(d==-1){
break;
}
fos.write(d);
}*/
long start=System.currentTimeMillis();
while ((d=fis.read())!=-1){
fos.write(d);
}
long end=System.currentTimeMillis();
System.out.println("复制完毕"+(end-start)+"ms");
fis.close();
fos.close();
6、块读写操作、复制
//一组一组字节的读写称为:块读写
提高每次读写的数据量,减少实际读写的次数可以提高读写效率
int read(byte[] data)//InputStream定义了块读方法
//一次性读取给定字节数组data总长度的字节量并存入到该数组中。
返回值表达实际读取到了多少字节。如果返回值为-1表达流读取到末尾了
void write(byte[] data,int offset,int len)
//一次性将给定字节数组data从下标offset处开始的连续len个字节写出
若data总长度连续读取3个字节,读取到倒数第二次只剩一个字节时
data:{11101100,11001111,00110011}
本次读取 |--上次的旧数据---|
最后一次读取没有数据返回-1,结束//len会根据读取的字节个数进行改变
//复制文件会比源文件大的原因:最后一次读取时含上一次的旧数据全部输出
①int read(byte[] data)
②void write()
void write(byte[] data)
//一次性将给定字节数组data中的所有字节写出
void write(byte[] data,int offset,int len)
//一次性将给定字节数组data从下标offset处开始的连续len个字节写出
FileInputStream fis=new FileInputStream("./image.png");
FileOutputStream fos=new FileOutputStream("./image_cp2.png");
byte[] data=new byte[1024*10];
int len=0;
long start=System.currentTimeMillis();
while ((len=fis.read(data))!=-1){
//fos.write(data);//复制文件会比源文件大
fos.write(data,0,len);//解决方法
}
long end=System.currentTimeMillis();
System.out.println("复制完毕!耗时:"+(end-start)+"ms");
fis.close();
fos.close();
7、向文件中写入文本数据
getBytes(StandardCharsets.UTF_8)