【javaIO】IO流——字节流详解

字节流

一、IO流的操作步骤

操作大致流程

  • 1、使用File类打开一个文件
    • 2、通过字节流或者是字符流的子类,指定输出的位置
    • 3、进行读写操作
    • 4、关闭输入/输出流

注意:io操作属于自愿操作,一定要关闭

二、字节输出流:OutputStream

OutputStream的io包中字节输出流的最大父类
自定如下:
public abstract class OutputStream implements Closeable, Flushable
此类是一个抽象类,想要使用此类,则必须通过子例实例化对象,来操作此类操作本地文件

OutputStream方法的使用
&通过子类指定输出位置
&进行写操作有三种构造方式
&注意写入和追加的区别
&注意文件过大时写入的方法

 public static void outputStreamDemo(String path){
        File file =new File(path );//使用File类打开一个文件
        try {
            //通过字节流或者是字符流的子类,指定输出的位置
             FileOutputStream fileOutputStream = new FileOutputStream(file,true );


             //进行写操作

            /**
             * void write(int b)
             * 将制定的字节写入输入流
             * 参数int b,只使用了b的低八位,b的高24位被忽略
             * 可能抛出IOIOException异常
             *
             */
            fileOutputStream .write(97);
            fileOutputStream .write('c');
            /**
             * void write(byte b[])
             * 将b.length个字节从制定byte数组写入到输入流
             * 读取中文
             */
            byte  [] bytes= {'d','f','g'};
            fileOutputStream .write(bytes );

            /**
             * void write(byte b[],int off,int len);
             * 将指定byte数组中从偏移量off 开始的len个字节写入此输出流
             * 参数:
             * b-数据
             * off-数据中的初始偏移量
             * len-数据的个数
             * 如果b为null,则抛出NullPointerException
             * 如果off为负,或len为负,或者off+len大于数组b的长度,则抛出Index越界异常
             */
            fileOutputStream.write(bytes ,2,1);



            /**
             * void flush()
             * 刷新此输出流并强制写出所有缓冲的输出字节
             * OutputStream 的 flush方法不执行任何操作
             * 用户空间——内核Buffer——磁盘(从内核空间实时刷新到磁盘中)
             */
             fileOutputStream .flush() ;
            /**
             * 一个流实例反复的进行写操作,数据会追加在目标文件内容的后面
             * 如果对一个存在内容的文件写操作,会将原内容进行覆盖
             * 要实现内容的追加,通过构造函数FileOutputStream(File file,boolean append)
             * append为true表示数据是追加的
             */
            //关闭资源
             fileOutputStream .close() ;

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

三、字节输入流(InputStream)

进行读文件
如果读取的是中文,只能用和数组有关的构造方法,因为一个汉字是两个字节

&通过子类指定输出位置
&进行写操作有三种构造方式
&注意文件过大时读取的方法

   public static void inputStreamDemo(String path)
    {
       // File file =new File(path );
        //创建FileInputStream实例
        try {
            FileInputStream fileInputStream = new FileInputStream(path );

            //进行读操作
            /**
             * int read()
             * 从输入流中读取一个字节
             * 返回的是一个数据字节,如果读取到结尾处,返回-1
             * 可能抛出IOException
             */
            int read=fileInputStream .read() ;
            System.out.println(read);
            /**
             * int read(byte b[])
             * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
             * 参数:b - 存储读入数据的缓冲区
             * 返回:读入缓冲区的总字节数;如果到达流末尾,则返回-1
             * 抛出:IOException - 如果流位于文件末尾而无法读前面的字节;如果流已关闭,
             * NullPointerException   如果b为null
             * duquzhognwen
             */
            byte []bytes =new byte[100];
            //int read1=fileInputStream .read(bytes );
            //System.out.println(new String(bytes ,0,read1 ));
            /**
             * int read(byte b[] ,int off,int len)
             * 将输入流的数据写到数组b中,off指定写入b的起始位置,len表示可写入的长度
             * 返回值,表示时间读取数据的长,读取结束返回-1
             */
            int read1 = fileInputStream.read(bytes, 1, 23);
            System.out.println(new String(bytes ,0 ,read1 ) );
            /**
             * 大文件读取
             * 循环读取数据
             */
            int num=0;
            while ((num =fileInputStream .read(bytes ))!=-1 ){
                System.out.println(new String(bytes ,0,num));//防止后面的数据存在问题

            }
//                         * 默认不支持
//            /**
 //            * long skip(long n)
 //            * 跳过和丢弃此输入流中数据的n个字节
 //            */
//            fileInputStream .skip(5);
//            /**
//             * 读取实际的文件内容的长度
//             */
//            fileInputStream .available() ;
//            /**
//             * 判断是否支持mark和support方法
//            
//             * mark操作,输入流中标记当前位置
//             */
//            fileInputStream .markSupported() ;
//            fileInputStream .mark(2) ;
//            fileInputStream .reset() ;

            //关闭资源

            fileInputStream .close() ;
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e){
                e.printStackTrace() ;
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值