黑马程序员_java-IO流<八>

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


1IO流:  java中对数据的操作都是通过流的方式,用来处理设备(硬盘,控制台,内存)间的数据。

2IO流常用子类:

    字节流

        OutputStream:字节写入流抽象类

                |--->FileOutputStream 字节写入流

                |--->BufferedOutputStream:字节写入流缓冲区

                |--->PrintStream:打印流

        InputStream:字节读取流抽象类

                |--->FileInputStream 字节读取流

                |--->BufferedInputStream:字节读取流缓冲区

    字符流  

        Writer:字符写入流的抽象

                |--->FileWriter:字符写入流

                |--->BufferedWriter:字符写入流缓冲区

                |--->OutputStreamWriter:字符通向字节的转换流(涉及键盘录入时用)

                |--->OutputStreamWriter  打印流,可处理各种类型的数据

        Reader: 字符读取流的抽象类

                |--->FileReader 字符读取流

                    |--->LineNumberReader 跟踪行号的缓冲字符读取流

                |--->BufferedReader:字符读取流缓冲区

                |--->InputStreamReader:字节通向字符的转换流(涉及键盘录入时用)

    在硬盘上创建一个文件并写入信息

        用字符写入流:FileWriter

        FileWriter  fw = new FileWriter("d:\\filewriter.txt");

        fw.write("输入信息");

        fw.write("也可以写入字符数组".toCharArray());

        fw.flush();

        fw.close();

    在原有文件上续写数据

        FileWriter  fw = new FileWriter("d:\\filewriter.txt",true);

        fw.write("还可以续写信息");

        fw.write("也可以写入字符数组".toCharArray());

        fw.flush();

        fw.close();

    读取硬盘上的文本文件,并将数据打印在控制台

        FileReader  fr = new FileReader("d:\\filewriter.txt");

       一个一个字节的读

        int ch =0;

        ch =fr.read();

        sop((char)ch);

        fr.close();

        利用数组来提高效率

        char[] buf= new char[1024];

        int len =0;

        while((len= fr.read(buf))!=-1)  {

            sop(new  String(buf,0,len));

        fr.close();

    拷贝文本文件

        利用缓冲区提高数据读写效率

        (无缓冲区就相当于一滴一滴的喝水,有缓冲区就相当于一杯一杯的喝水)

        BufferedReader  bufr = new BufferedReader(new FileReader("d:\\filewriter.txt"));

        BufferedWriter  bufw = new BufferedWriter(new FileWriter("d:\\copyfilewriter.txt"));

        Stringline = null;

        while((line= bufr.readLine())!=null)  {

            burw.write(line);

            bufw.newLine();

            bufw.flush();

        }

        bufr.close();

        bufw.close();


字节流:字节流写入时没有刷新

    在硬盘上创建一个文件并写入信息

        FileOutputStream  fos = new FileOutputStream("d:\\filestream.txt");

        fos.write(97);//写入一个字节,int:97代表写入char:a

        fos.write("也可以写入字节数组".getBytes());

        fos.close();

    在硬盘已有文件上续写数据

        FileOutputStream  fos = new FileOutputStream("d:\\filestream.txt",true);

              fos.write("  ".getBytes());

         fos.close();   

    读取硬盘上的文件

        FileInputStream  fis = new FileInputStream("d:\\filestream.txt");

        一个字节一个字节的读

        int ch =0;

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

            sop((char)ch);

        }

        利用字节数组读(提高效率)

        byte[] buf = new byte[1024];

        int len =0;

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

            sop(newString(buf,0,len));

        }

    拷贝字节文件,如图片或者MP3或者电影

       不带缓冲区

        FileInputStream  fis = new FileInputStream("d:\\1.mp3");

        FileOutputStream  fos = new FileOutputStream("d:\\copy1.mp3");

        byte[] buf = new byte[1024];

        int len =0;

        while((len = fis.read(buf))!=-1) {

            fos.(buf,0,len);//字节流写入不需刷新

        }

        fis.close();

        fos.close();

       带缓冲区,高效

        BufferedInputStream  bufi = new BufferedInputStream(new FileInputStream("d:\\1.mp3"));

        BufferedOutputStream  bufo = new BufferedOutputStream(new  FileOutputStream("d:\\copy1.mp3"));

        int ch =0;

        while((ch= bufi.read())!=-1) {

            bufo.write(ch);

        }

        bufi.close();

        bufo.close();

流操作的规律:

    流操作的难点:流对象很多,不知道具体用哪个

    第一步:先明确源和目的

        源:

           文本:用Reader

           字节:用InputStream

        目的:

           文本:用Writer

           字节:用OutputStream

    第二步:明确是不是纯文本

        是:用字符流;

        不是:用字节流

    第三步:明确流体系后,通过设备来明确具体使用哪个流对象

        源设备:

           键盘:System.in

           硬盘:文件流File

           内存:数组流ArrayStream

        目的设备:

           键盘:System.out

           硬盘:文件流File

           内存:数组流ArrayStream


IO中的其他流:

    打印流:

        PrintWriter:字符打印流

           构造方法:

            PrintWriter(String fileName),创建具有指定文件名称且不带自动刷新的新 PrintWriter

            PrintWriter(File file),使用指定文件创建不具有自动行刷新的新 PrintWriter

            PrintWriter(Writer out),创建不带自动刷新的新 PrintWriter

            PrintWriter(Writer out, boolean autoFlush),自动刷新

            PrintWriter(OutputStream out),根据现有的OutputStream创建不带自动刷新的新 PrintWriter

            PrintWriter(OutputStream out, boolean autoFlush),自动刷新

           方法:

            PrintWriter append(char c),将指定字符添加到此 writer

            void close() ,关闭该流并释放与之关联的所有系统资源。

            void flush(),刷新该流的缓冲。

            void print(Object obj),打印对象。

            void print(String s), 打印字符串。

            void println(),通过写入行分隔符字符串终止当前行。

        PrintStream:字节打印流

           构造方法:

            PrintStream(String fileName),创建具有指定文件名称且不带自动刷新。

            PrintStream(File file), 创建具有指定文件且不带自动刷新。

            PrintStream(OutputStream out),创建新的打印流。

            PrintStream(OutputStream out, boolean autoFlush), 创建新的打印流。

           方法:

            PrintWriter append(char c),将指定字符添加到此 writer

            void close(), 关闭该流并释放与之关联的所有系统资源。

            void flush(),刷新该流的缓冲。

            void print(Object obj),打印对象。

    void print(String s), 打印字符串。

            void println(), 通过写入行分隔符字符串终止当前行。


管道流:

        PipedInputStream

        PipedOutputStream


随机访问文件:RandomAccess

        通过skipByte(intx)seek(int x)来达到随机访问文件, 该类不是IO体系子类,而是直接继承Object,但它是IO包中的成员,该类内部封装了数组,而且通过指针对数组的元素进行操作,可以通过getFilePoint获取指针位置,同时可以通过seek改变指针位置,该类内部封装了字节输入输出流,该类只能操作文件;

            "r":只读

            "rw":读写

       构造方法:

        RandomAccessFile(File file, String mode),创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File参数指定。

        RandomAccessFile(String name, String mode),创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。

       方法:

        void write(byte[] b),b.length个字节从指定 byte数组写入到此文件,并从当前文件指针开始。

        void write(byte[] b, int off, int len), len个字节从指定 byte数组写入到此文件,并从偏移量 off处开始。

        void write(int b) ,向此文件写入指定的字节。

        int read(),从此文件中读取一个数据字节。

        int read(byte[] b) ,将最多b.length个数据字节从此文件读入 byte数组。

        int read(byte[] b, int off, int len) ,将最多len个数据字节从此文件读入 byte数组。

        String readLine(),从此文件读取文本的下一行。

        long getFilePointer() ,返回此文件中的当前偏移量。

        long length(),返回此文件的长度。

        void seek(long pos) ,设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。

操作基本数据类型的流对象:DateStream

    操作字节数组流:

        ByteArrayInputStream

        ByteArrayOutputStream

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank"> http://edu.csdn.net </a>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值