• 十九、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("关闭写入流失败");

                        }

                         }

                    }

            }

        }

  • 相关阅读:
    [HAOI2015][bzoj 4033]树上染色(树dp+复杂度分析)
    20190716NOIP模拟赛T1 礼物(概率dp+状压)
    20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
    延迟载入Dll(动态载入Dll)
    Dll重定向(尚存否?)
    delete和delete[] 区别
    06 序列号保护 学习分析(字符串)
    05 初识加壳脱壳
    04 复制删除行为IDA反汇编
    03 复制行为动态分析
  • 原文地址:https://www.cnblogs.com/yueyazhishang/p/4049244.html
Copyright © 2020-2023  润新知