I/O流:主要操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...
处理流:
处理流就相当于外衣,每件衣服的作用不同,每个处理流的作用也不同,处理流可以实现多嵌套,即可以有多个处理流,每个处理流的功能不同!
前面已经学习过了
节点流(FileInputStream/FileOutputStream/FileReader/FileWriter),我们下面将要学习的处理流中的两个流:缓冲流和转换流,就是在某个流的基础上再添加不同的功能以实现对文件更为灵活的操作;
其实对于处理流更为通俗的理解就是类似天冷添衣的操作,什么情景需要什么操作,就在某个基础流的基础上添加所需的处理流。
缓冲流:
较节点流,会更大的提高了文件读取和写出的速度;
节点流我们读取文件的时候是采用字节数组/字符数组的形式实现一次读取多个内容;缓冲流则是将文件内容缓存在一个默认长度为8192的缓冲区中,有较大的弹性,可以自定义缓冲区的的大小,针对大文件的读取和写出效果较为明显。
对字节流进行处理的缓冲流:
BufferedInputStream:读取文件;
BufferedOutputStream:写出文件。
I/O流中所有流的操作都是类似的步骤 //1.创建对应的流对象(字节缓冲流/字符缓冲流) //2.书写对应流的曹操作(读取/写出) //3.关闭流
构造器:
//两个构造器,方法相同,只是传入的参数不同,这里以BufferedInputStream为例BufferedInputStream(InputStreamin) //创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。BufferedInputStream(InputStreamin, intsize) //其实缓冲流底层设置过了缓冲区的大小,所以可以不定义//创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。 //BufferedInputStream方法底层 DEFAULT_BUFFER_SIZE = 8192;publicclassBufferedInputStreamextendsFilterInputStream { privatestaticintDEFAULT_BUFFER_SIZE=8192; }
方法说明:
flush():把写出的内容从缓冲区中刷新出去... BufferedOutputStream底层会在缓冲区满以后自动调用flush()方法的,可以不声明;但是在后面所学的数据流/对象流建议写出一条数据调用一下flush().
用BufferedInputStream以及BufferedOutputStream复制文件:
/**以下使用try...catch...finally为标准的异常处理* 使用字节缓冲流复制图片。*/publicstaticvoidbufCopyPhoto(Stringpath,StringdestPath){ longstart=System.currentTimeMillis(); BufferedInputStreambis=null; BufferedOutputStreambos=null; try { //1.创建缓冲流对象bis=newBufferedInputStream(newFileInputStream(path)); bos=newBufferedOutputStream(newFileOutputStream(destPath)); //2.文件的处理操作bytebuffer[] =newbyte[10]; intlen ; while ((len=bis.read(buffer)) !=-1){ bos.write(buffer,0,len); //bos.flush(); } } catch (IOExceptione) { e.printStackTrace(); } finally { //3.关闭流if (bos!=null) { try { bos.close(); } catch (IOExceptione) { e.printStackTrace(); } } if (bis!=null) { try { bis.close(); } catch (IOExceptione) { e.printStackTrace(); } } } longend=System.currentTimeMillis(); System.out.println(end-start);//57//相同的方法只是用节点流(FileInpusStream/FileOutputStream)复制文件是496 }
字符缓冲流:
BufferedReader:读取字符内容;
BufferedWriter:写出字符内容。
字符缓冲流和字节缓冲流的构造器以及方法都类似,只是字符缓冲流中有两个不同的方法:
BufferedReaderreadLine():可以读取一行内容,注意它不会识别\n\t等特殊格式//在后面学习输入输出流的时候,可以结合该方法实现Scanner中的相关方法BufferedWriternewLine():如果源文件有换行的内容,可以在写出文件的时候调用该方法publicstaticvoidreadLineFile(Stringpath){ BufferedReaderbr=null; try { br=newBufferedReader(newFileReader(path)); Stringlen; //读取一行内容,当文件内容读完会返回nullwhile ((len=br.readLine()) !=null){ System.out.print(len); } } catch (IOExceptione) { e.printStackTrace(); } finally { if (br!=null) { try { br.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
转换流:更为灵活的设置文件的字符集编码;
解码(InputStreamReader):字节 -> 字符(电脑能识别 -> 人能看懂)
编码(OutputStreamWriter):字符 -> 字节(人能看懂 -> 电脑能识别)
转换流的具体过程:
个人认为转换流就是能实现文本文件在转换的过程中,实现字符编码的改变,如果你的读取的文件和设置文件的字符编码集不同,则会出现中文乱码。
字符集编码:
不同的字符集,底层定义的一个字符对应的字节数是不同的,常见的utf-8它是可变的字符序列,底层能存储1-4个字节对应的字符长度...