字符输出流与序列化( 二 )


而我们在日常生活中, 将计算机硬盘中的某一个文件(例如,d://src/test.txt)复制到另一个位置(例如,d://tar/test-副本.txt), 这其实就是文件的读取和写入!
public class CopyFileDemo {public static void main(String[] args) {//1.定义变量, 存储源文件路径String source = "d:/iotest/src/test.txt";//2.定义变量, 存储目标文件路径String target = "d:/iotest/tar/text-副本.txt";try {//3.调用copyTextFile方法复制文本文件copyTextFile( source, target );System.out.println( source+" 文件复制成功!" );} catch (Exception e) {System.out.println( source+" 文件复制失败!" );e.printStackTrace();}}/** 方法作用: 复制指定位置的文本文件到另一位置(只能复制文本文件)* source参数: 源文件路径(即,要复制的文件路径)* target参数: 目标文件路径(即,通过源文件复制的副本文件路径)*/public static void copyTextFile(String source, String target) throws Exception {//1.定义带缓冲区的字符输入流, 读取源文件中的数据BufferedReader in=new BufferedReader(new FileReader(source) );//2.定义带缓冲区的字符输出流, 将源文件中的数据写入到目标文件中BufferedWriter out=new BufferedWriter(new FileWriter(target ) );//3.从源文件中读取(in)数据, 将读取到的数据写入(out)到目标文件中int data;while( (data=http://www.kingceram.com/post/in.read()) != -1 ) {//将读取到的数据写入到目标文件out.write( data );}//4.释放资源(关闭流)in.close();out.close();}}
上面的只能复制文本文件,== 如果复制图片、音频、视频等二进制文件,即使复制成功了,复制后的文件也是无法正常打开的!==这是因为图片、音频、视频等文件中都是二进制(1和0)组成的, 如果按照字符去读取这些二进制, 再按照字符写出到目标文件中, 就会破坏从源文件的中读取到内容, 从而导致这些复制后的目标文件是无法打开的!
下面是支持复制所有文件的方法:(既可以复制文本又可以图片、音频、视频等二进制文件)
public class CopyFileDemo {public static void main(String[] args) {//1.定义变量, 存储源文件路径String source = "d:/iotest/src/meinv.jpg";//2.定义变量, 存储目标文件路径String target = "d:/iotest/tar/meinv-副本.jpg";try {//3.调用copyBinaryFile方法复制任意文件copyBinaryFile( source, target );System.out.println( source+" 文件复制成功!" );} catch (Exception e) {System.out.println( source+" 文件复制失败!" );e.printStackTrace();}}/** 方法作用: 复制指定位置的文本文件到另一位置(可以复制任何文件)* source参数: 源文件路径(即,要复制的文件路径)* target参数: 目标文件路径(即,通过源文件复制的副本文件路径)*/public static void copyBinaryFile(String source, String target) throws Exception {//1.定义带缓冲区的字节输入流, 读取源文件中的数据BufferedInputStream in = new BufferedInputStream( new FileInputStream( source ) );//2.定义带缓冲区的字节输出流, 将源文件中的数据写入到目标文件中BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( target ) );//3.从源文件中读取(in)数据, 将读取到的数据写入(out)到目标文件中int data;while( (data=http://www.kingceram.com/post/in.read()) != -1 ) {//将读取到的数据写入到目标文件out.write( data );}//4.释放资源(关闭流)in.close();out.close();}}
2.3.批量读写
上面的代码中, 在从源文件中读取数据时, 使用了带缓冲区的字节输入流(), 可以保证高效率的读取文件中的数据;在将读取到的数据输出到目标文件中时, 使用了带缓冲区的字节输出流(), 保证了将读到的数据高效率的写出到目标文件中;
但有一个过程中没有使用缓冲区, 就是当把源文件中的数据读取到Java程序中后, 将要通过输出流将数据写出到目标文件中时, 这个过程是一个字节一个字节的去处理的, 没有使用字节数据, 如果此处也加上字节数组, 同样可以提高程序执行的效率!