字节流

IO流概述和分类


读得懂的是字符流,读不懂就是字节流

字节流写数据

在java.io包下,要导包
InputStream示意所有输出字节流的超类,OutputStream示意所有输出字节流的超类,子类名称都是以其父类名作为子类名的后缀

//FileOutputStream(String name),创立文件输入流以指定的名称写入文件//创立字节输入流对象FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter抛出异样 FileNotFoundException/*创立字节输入流对象做了三件事件    调用零碎性能创立了文件     创立了字节输入流对象    让字节输入流对象指向创立好的文件*///write (int b)将指定的字节写入此文件输入流fos.write(b:97);//抛出异样IOException 下面那个异样是这个的子类//下面输入的是字符 也就是ASCII码值为97的字符,即afos.write(b:57);//输入字符9fos.write(b:55);//输入字符7//void close();敞开此文件输入流闭关开释与此流相关联的任何系统资源fos.close();

所有和IO操作的最初都要开释资源

字节流写数据3种形式

//创立文件输入流以指定的名称写入文件FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter抛出异样 FileNotFoundException//下面就是将输出的那个字符串门路封装成了一个新的File对象///File file 创立文件输入流以写入由指定的File对象示意的文件File file = new File(pathname:"myByteStream\\fos.txt");FileOutputStream fos2 = new FileOutputStream(file);//也就是FileOutputStream fos3 = new FileOutputStream(new File(pathname:"myByteStream\\fos.txt"));//写数据形式//int b  上面输入abcdefos.write(b:97);fos.write(b:98);fos.write(b:99);fos.write(b:100);//byte[] b 将字节从指定的字节数组写入此文件输入流//先定义一个字节数组byte[] bys = {97,98,99,100,101};//ASCII码值 还是转化成对应的字符 输入abcdefos.write(bys);//也能够通过String类的一个办法取得字节数组 getBytes();返回字符串对应的字节数组byte[] bys = "abcde".getBytes();//通过字符串失去一个字节数组fos.write(bys);//输入一样///byte[] b,int off,int len 从指定的字节数组开始,从偏移量off开始写入此文件输入流fos.write(bys,off:0,bys.length);//输入一样fos.write(bys,off:1,len:3);//从索引1地位开始写三个 也就是写入bcd//开释资源fos.close();

字节流写数据的两个小问题

换行
//创立文件输入流以指定的名称写入文件FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter抛出异样 FileNotFoundException//写数据for(int i = 0;i<10;i++){    fos.write("Hello".getBytes());    fos.write("\r\n".getBytes());//windows零碎\r\n时换行 用记事本关上能力换行 linux \n换行 mac \r换行}//开释资源fos.close();

追加写入
//追加写入FileOutputStream(String name,Boolean append);//如果第二个参数append为true,则字节将写入文件的开端而不是结尾 true就是追加写入//创立文件输入流以指定的名称写入文件FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt",append:true);//alt enter抛出异样 FileNotFoundException//写数据for(int i = 0;i<10;i++){    fos.write("Hello".getBytes());    fos.write("\r\n".getBytes());//windows零碎\r\n时换行 用记事本关上能力换行 linux \n换行 mac \r换行}//开释资源fos.close();

字节流写数据加异样解决


//退出finally来实现开释资源//创立文件输入流以指定的名称写入文件FileOutputStream fos = null;try{    fos = new FileOutputStream(name:"myByteStream\\fos.txt");    fos.write("Hello".getBytes());}catch(IOException e){    e.printStackTrace();}finally{    if(fos != null){//不判断的花如果门路不存在执行finally那就会产生一个空指针        try{            fos.close();        }catch(IOException e){            e.printStackTrace();        }    } }

字节流读数据(一次读一个字节数据)

把文件fos.txt中的内容读取进去在控制台输入

//创立文件输入流以指定的名称写入文件FileInputStream fis = new FileInputStream(name:"myByteStream\\fis.txt");//alt enter抛出异样IOException //调用字节输出流对象的读数据办法//int read(); 从该输出流读取一个字节的数据//读取数据 如果文件达到开端,那么返回值是-1//换行能够本人读取进去//读取数据int by = fis.read();while(by != -1){    System.out.print(by);    System.out.print((char)by);//将ASCii码值强制转化为字符串    by = fis.read();//输入后面那个而后读取下一个 再进行判断}//优化下面的循环//fis.read()读数据//by = fis.read() 把读取到的数据赋值给by//by != -1 判断读取到的数据是否是-1int by;while((by = fis.read()) != -1){    System.out.print(by);    System.out.print((char)by);//将ASCii码值强制转化为字符串}//开释资源fis.close();

案例 复制文本文件

把"E:\itcast\窗里窗外.txt"复制到模块目录下的"窗里窗外.txt"

//依据数据源创立字节流输出对象FileInputStream fis = new FileInputStream(name:"E:\\itcast\\窗里窗外.txt");//alt enter抛出异样IOException //依据目的地创立字节输入流对象FileOutputStream fos = new FileOutputStream(name:"myByteStream\\窗里窗外.txt");//alt enter抛出异样IOException //读写数据 复制文本文件 一次读取一个 一次写入一个int by;while((by = fis.read()) != -1){    fos.write(by);}//开释资源fis.close();fos.close();

字节流读数据(一次读一个字节数组数据)

把文件fos.txt中的内容读取进去在控制台输入

//创立字节输出流对象FileInputStream fis = new FileInputStream(name:"myByteStream\\fis.txt");//alt enter抛出异样IOException //调用字节输出流对象的读数据办法 一次读一个字节数组//int read(byte[] b); 从该输出流读取最多b.length个字节的数据到一个字节数组byte[] bys = new byte[5];//创立一个字节数组容器//理论读取长度是-1,阐明曾经到了开端//第一次读取数据int len = fis.read(bys);sout(len);//输入5//String(byte[] bytes)sout(new String(bys));//输入Hello//第一次读取数据int len = fis.read(bys);sout(len);//输入5sout(new String(bys));//输入wor/*Hello\r\nworld\r\n输入 第一次Hello     第二次\r\nwor 在控制台输入\r\n就变成了换行空格     第三次ld\r\nr 因为最初只剩下四个 所以只有后面四个地位的内容换了,第五个没换还保留原来第五个的内容也就是r 输入变成ld 换行 r*///开释资源fis.close();


所以说len返回的不是字节数组的长度,而是理论咱们读取的数据的个数

sout(new String(bys,offset:0,len));//读了几个数据就转换几个数据

优化用循环改良

byte[] bys = new byte[1024];//个别是1024及其整数倍int len;while((len = fis.read(bys))!= -1){    sout(new String(bys,offset:0,len));//读了几个数据就转换几个数据}//开释资源fis.close();

案例 复制图片

把"E:\itcast\mn.jpg"复制到模块目录下的"mn.jpg"

//依据数据源创立字节流输出对象FileInputStream fis = new FileInputStream(name:"E:\\itcast\\mn.jpg");//alt enter抛出异样IOException //依据目的地创立字节输入流对象FileOutputStream fos = new FileOutputStream(name:"myByteStream\\mn.jpg");//alt enter抛出异样IOException //读写数据 复制图片 一次读取一个字节数组 一次写入一个字节数组byte[] bys = new byte[1024];int len;while((len = fis.read(bys))!= -1){    fos.write(bys,offset:0,len);}//开释资源fis.close();fos.close();