初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是
java中的IO流可以分为两种:字符流和字节流 字符流,顾名思义,就是对字符进行操作,只能操作文本文件 字节流,就是对字节进行操作,然而所有文件都是由字节组成的,可以字节流可以操作一切文件 字符流中的两个大类:Reader和Writer 详情可见 https://cloud.tencent.com/developer/article/1036410 简单的Writer和Reader 字节流中也同样有两个大类:InputStream和OutputStream 又“读进来,写出去”,所以InputStream对应着Reader,OutputStream对应着Writer 字节流和字符流有很多相像的地方,区别就是字节流操作字节,字符流操作字符
OutputStream
OutputStream的主要方法
构造方法
以FileOutputStream为例 FileOutputStream(String file) FileOutputStream(File file) FileOutputStream(String file,boolean append) FileOutputStream(File file,boolean appeand) 后面两种方法用于判断是否需要续写,前面两个方法是直接覆盖文件
写
write(int charnum) write(byte[] array) write(byet[] array,int off,int len)写出array中角标从off开始的len个元素
刷新
flush() close()
InputStream
构造方法
照惯例,以FileInputStream为例 FileInputStream(String filename) FileInputStream(File filename) 如果filename.exists==false||filename.isFile()==false的话,那么会抛出FileNotFoundException
读
read():int read(byte[] array):int 与Reader类一样,如果到了文件末尾,返回-1 这里有个特别好用的方法,可以用来知道文件的大小 available():int; 返回文件的字节数 这时就可以用这个方法来定义array的大小,那么就可以一次性读完了
关流
flush()
缓冲技术
缓冲技术就是把信息分批处理,再一起丢出去,这样处理速度会快很多!! 下面实现一下缓冲技术
实现BufferedInputStream
package mypackage;
import java.util.*;
import java.io.*;
public class MyBufferedInputStream {
private InputStream input;
private int index=0;
private byte[] array;
private int len=0;
//默认分配一个100b的缓冲空间
public MyBufferedInputStream(FileInputStream input){this(input,1024*100);}
public MyBufferedInputStream(FileInputStream input,int size){
this.input=input;
array=new byte[size];
}
public int read()throws IOException{
if(len==0){
index=0;
if((len=input.read(array))==-1){return -1;}
}
len--;
return (array[index++]&255);//防止出现读到11111111此时错误的返回了-1
}
//重载read
public int read(byte[] bytes)throws IOException{
int i;
int index=0;
while((i=read())!=-1){
bytes[index]=(byte)i;
}
return index+1;
}
public void close()throws IOException{input.close();}
}
实现BufferedOutputStream
package mypackage;
import java.util.*;
import java.io.*;
public class MyBufferedOutputStream{
private OutputStream output;
//默认分配一个100b的缓冲空间
public MyBufferedOutputStream(FileOutputStream output)throws IOException{this(output,1024*100);}
public MyBufferedOutputStream(FileOutputStream output,int size)throws IOException{
this.output=output;
buf=new byte[size];
}
//建一个输入,让写进来的数据先存在里面,最后再一起放出去
protected byte[] buf;
private int index=0;
public void write(byte[] bytes)throws IOException{
for(int i=0;i<bytes.length;){
buf[index++]=bytes[i++];
if(index==buf.length){
index=0;
output.write(buf);
this.flush();
buf=new byte[buf.length];
}
}
}
//重载write
public void write(int bytes)throws IOException{
if(index<buf.length){buf[index++]=(byte)bytes;}
else{
output.write(buf);
output.flush();
buf=new byte[buf.length];
index=0;
buf[index++]=(byte)bytes;
}
}
public void close()throws IOException{output.flush();output.close();}
public void flush()throws IOException{output.flush();}
}
下面复制一个11.1M的MP3格式测试一下效果
import java.io.*;
import mypackage.*;
class Test{
public static void main(String[] agrs)throws IOException{
long begin=System.currentTimeMillis();
FileInputStream fi=new FileInputStream("D:\CloudMusic\薛之谦 - 一半.mp3");
FileOutputStream fo=new FileOutputStream("D:\CloudMusic\一半1.mp3");
MyBufferedInputStream bi=new MyBufferedInputStream(fi);
MyBufferedOutputStream bo=new MyBufferedOutputStream(fo);
int bytes;
byte[] array=new byte[1024*100];
while((bytes=fi.read(array))!=-1){
bo.write(array);
}
bo.close();
bi.close();
long end=System.currentTimeMillis();
System.out.println("复制所用时间:"+(end-begin)+"毫秒");
}
}
下面是结果
C:Users钟绍威Desktop>java Test
复制所用时间:183毫秒
用Java自带的BufferedInputStream和BufferedOutputStream试试
import java.io.*;
class Demo{
public static void main(String[] args)throws IOException{
long begin=System.currentTimeMillis();
FileInputStream fi=new FileInputStream("D:\CloudMusic\薛之谦 - 一半.mp3");
FileOutputStream fo=new FileOutputStream("D:\CloudMusic\一半1.mp3");
BufferedInputStream bi=new BufferedInputStream(fi);
BufferedOutputStream bo=new BufferedOutputStream(fo);
byte[] a=new byte[1024*8];
for(int i;(i=bi.read(a))!=-1;){
bo.write(a);
}
bo.close();
bi.close();
long end=System.currentTimeMillis();
System.out.println("复制所用时间:"+(end-begin)+"毫秒");
}
}
下面是结果
C:Users钟绍威Desktop>java Demo
复制所用时间:117毫秒
Tips:用write(byte[])会比write(int)快得多多 输入的缓冲就是先把数据存在数组中,从数组中一个个读到控制台 输出的缓冲就是把数据存到数组中,再一起写到OutputStream中的缓冲区,最后在刷新
刚刚用这个复制一个11.1M的MP3花了0.6秒,和系统的时间差不多↖(^ω^)↗!!
错误的返回了-1
如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行
为什么read()返回的是Int型而不是byte型呢??
1int=4byte 那么11111111转为Int就是11111111 11111111 11111111 11111111 还是等于-1 所以为了防止出现这个情况,就只保留后面八位,前面用0去补 于是乎11111111&255
- HDUOJ-----2399GPA
- HDUOJ----旋转的二进制
- HDUOJ---3743Frosh Week(BIT+离散化)
- Node.js新手必须知道的4个JavaScript概念
- HUDOJ-----1394Minimum Inversion Number
- 提升 Node.js 应用性能的 5 个技巧
- HDUOJ-----1166敌兵布阵
- HDUOJ------2492Ping pong
- HDUOJ----2489 Minimal Ratio Tree
- HDUOJ----2487Ugly Windows
- HDUOJ--------1003 Max Sum
- HDUOJ -----1864 最大报销额(动态规划)
- 行受影响 是什么意思
- c++课程设计(日历)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解linux 驱动编写(sd卡驱动)
- Centos 6.9环境下创建用户及删除用户的方法
- 详解linux驱动编写(入门)
- Ubuntu使用国内源出现Hash Sum mismatch错误的解决
- CentOS基于nginx反向代理实现负载均衡的方法
- CentOS7服务器环境下vsftpd安装及配置方法
- Linux date 时间设置同步命令分享
- Gerrit设置开机启动方法
- Ubuntu服务器下搭建php运行环境的方法
- 详解ubuntu14.04搭建(迁移)hustoj记录
- linux 触摸屏驱动编写
- centos yum更新及删除多余启动项
- React进阶(1)-理解Redux
- MySQL死锁系列-线上死锁问题排查思路
- # 3分钟短文:Laravel路由注册,你必须掌握的“动词”!