十九、Java基础--------IO流之字节流

        在上一篇文章中介绍了IO体系以及一些基本概念和字符流的相关应用,本文着重介绍字节流的相关操作。

字节流

        它的操作与字符流类似,可以参与字符流的定义、读取、写入、处理异常的格式,只不过是处理的数据不同,因为对于非字符的数据,比如图片、视频、音频文件(例如mp3)等,这些文件只能用字节流对之进行操作。

                字节流的抽象基类:

               |--InputStream:字节输入流

                |--OutputStream:字节输出流

        FileInputStream

                FileInputStream是InputStream的一个子类,用于读取诸如图像数据之类的原始字节流

        构造方法:

                |--FileInputStream(File file)

                通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。

                |--FileInputStream(FileDescriptor fdObj)

                通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。

                |--FileInputStream(String name)

                通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

        常用方法:

                |--int available()返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。

                |--void close()关闭此文件输入流并释放与此流有关的所有系统资源。

                |--int read()从此输入流中读取一个数据字节。

                |--int read(byte[] b)从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

                |--int read(byte[] b, int off, int len)从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

    应用示范

                import java.io.FileInputStream;

        import java.io.IOException;

        public class Demo2 {

    public static void main(String[] args) {

        read1();

    }

    // 第一种读取方式:按字节来读取

    public static void read1() {

        FileInputStream fis = null;

        try {

            fis = new FileInputStream("E:/aa.java");// 新建字节读取的对象,明确源文件

            int x = 0;

            while ((x = fis.read()) != -1) {

                System.out.print((char) x);

            }

        } catch (IOException e) {

            e.printStackTrace();

        } finally {// 执行关闭资源的操作

            if (fis != null) {

                try {

                    fis.close();

                } catch (IOException e2) {

                    e2.printStackTrace();

                }

            }

        }

    }

 

    // 第二种读取方式:按字节数组读取

    public static void read2() {

        FileInputStream fis = null;

        try {

            fis = new FileInputStream("E:/aa.java");// 新建字节读取的对象,明确源文件

            int len = 0;

            byte[] buff = new byte[1024];// 定义一个字节数组,用于存储字节

            while ((len = fis.read(buff)) != -1) { // 每次将读取到的字节存储进buff数组

                System.out.println(new String(buff, 0, len));// 将字节数组转换成字符串输出

            }

        } catch (IOException e) {

            e.printStackTrace();

        } finally { // 执行关闭资源的操作

            if (fis != null) {

                try {

                    fis.close();

                } catch (IOException e2) {

                    e2.printStackTrace();

                }

            }

        }

    }

}

FileOutputStream

                FileOutputStream是OutputStream的一个子类,用于写入诸如图像数据之类的原始字节的流。

        构造方法:

                |--FileOutputStream(File file)

                创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

                |--FileOutputStream(File file,boolean append)

                创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

                |--FileOutputStream(FileDescriptor desc)

                创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。

                |--FileOutputStream(String name)

                创建一个向具有指定名称的文件中写入数据的输出文件流。

                |--FileOutputStream(String name, boolean append)

                创建一个向具有指定 name 的文件中写入数据的输出文件流。

        常用方法:

                |--close():关闭此文件输出流并释放与此流有关的所有系统资源。

                |--write(byte[] b):将 b.length 个字节从指定byte数组写入此文件输出流中。

                |--write(byte[] b, int off, int len):将指定byte数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

                |--write(int b):将指定字节写入此文件输出流。

应用示范

        import java.io.FileOutputStream;

            import java.io.IOException;

            public class Demo2 {

     public static void main(String[] args){

        FileOutputStream fos = null;

        try{

             fos = new FileOutputStream("E:/aa.txt");

             //定义一个字符串,因为字节流只能以字节或字节数组的形式读取

             String str = "天津这个鬼地方又出现了严重的雾霾";

             byte [] by =str.getBytes();//转成字节数组形式

            fos.write(by);//不用刷新

             }

        catch (Exception e) {

             e.printStackTrace();

             }

       finally{

             if(fos!=null){

                 try{

                     fos.close();

                     }

                 catch (IOException e) {

                     e.printStackTrace();

                     }

             }

          }

     }

  }

字节流缓冲区

        字节流缓冲区同样是提高了字节流的读写效率。

        对应类:

        BufferedOutputStream (? extends OutputStream)

        BufferedInputStream (? extends InputStream)

   应用示范

        import java.io.BufferedInputStream;

            import java.io.BufferedOutputStream;

            import java.io.FileInputStream;

            import java.io.FileOutputStream;

            import java.io.IOException;

            public class Demo2 {

     public static void main(String[] args){

             BufferedInputStream buis=null;

             BufferedOutputStream buos=null;

             try{

                 //复制视频文件到指定目录

            buis=new BufferedInputStream(new FileInputStream("E:\\分手大师.avi")); //使用匿名对象的方式建立字节流缓冲区对象

             buos=new BufferedOutputStream(new FileOutputStream("F:\\copy_分手大师.avi"));

             byte[] buff = new byte[1024*1024]; //定义一个1M的字节数组

             int len = 0;

             while((len=buis.read(buff))!=-1){

             buos.write(buff,0,len);

              }

             } //关闭流资源

             catch(IOException e) {

                    throw new RuntimeException("复制失败");

             }

            finally{

                    if(buis!=null){

                     try {

                             buis.close();

                     }catch (Exception e2) {

                     throw new RuntimeException("关闭读取流失败");

                    }

                     }

                    if(buos!=null){

                     try {

                            buos.close();

                    } catch (Exception e2) {

                    throw new RuntimeException("关闭写入流失败");

                    }

                     }

                }

        }

    }

posted @ 2014-10-24 21:05  月芽之上  阅读(163)  评论(0编辑  收藏  举报