zoukankan      html  css  js  c++  java
  • 黑马程序员——IO流总结

    ---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

    字节流抽象基类:

    InputStream、OutputStream

    字符流抽象基类:

    Reader、Writer

    -------------------------------------------------------------------------------------------

    字符流:

    类FileWriter:

    //创建一个FileWriter对象,该对象一初始化就必须要明确操作文件

    //而且该文件会被创建到指定目录下,如果已有文件,将被覆盖

    FileWriter fw = new FileWiter("demo.txt");

    fw.writer("abcde");  //调用Writer方法,将字符串写入到流中

    fw.flush();  //刷新流对象缓冲中的数据将数据刷到目的地,

    fw.close();  //关闭流资源,关闭前会刷新一次

    ----------------------------------

    //对已有的文件续写

    FileWriter fw = new FileWriter("demo.txt",true);

    //写入转意字符换行

    fw.writer(" ");

    -------------------------------------------------------------------------------------------

    类FileReader:

    //创建一个文件读取流对象,和指定名称的文件相关联,要保证文件存在不然发生FileNotFoundException异常

    FileReader fr = new FileReader("demo.txt")

    //调用读取流对象的方法read(),read()一次读取一个字符,并且再次调用read()将自动往下读取

    int ch = fr.read();

    sop("ch = "+(char)ch);

    //使用reader()方法当读取到字符末尾时返回-1

    while(true){

      int ch = fr.read()

      if(ch == -1)

        break;

      System.out.println("ch = "+(char)ch);

    }

    上面代码进行优化后如下:

    int ch = 0;

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

      System.out.println((char)ch);

    }

    //通过字符数组读取,先定义一个字符数组用于存贮读到的字符,当数组装满或者读取完毕再将数组中的字符一次取出

    char[] buf = new char[1024];

    int num = fr.read(buf);  //read读取返回读取到字符的个数

    fr.close() ;

    //循环读取

    int num = 0;

    while((num = fr.read()) != -1){

      sop(new Sting(buf, 0, num));

    }

    -------------------------------------------------------------------------------------------------

    //练习:读取一个.java文件并打印在控制台上

    import java.io.*;

    class FileReader{

      public static void main(String args[]) throws IOException {

        FileReader fr = new FileReader("Demo.java");

        char[] buf = new char[1024];

        int num = 0;

        while((num = fr.reade(buf)) != -1){

          System.out.print(new String(buf, 0, num));  //使用print,不然读到1024*n处将会自动换行

        }

        fr.close();

      }

    }

    -------------------------------------------------------------------------------------------------

    练习:将C盘一个文件复制到D盘

    原理:将C盘下的一个文件数据存储到D盘的一个文件中

    步骤:1、在D盘创建一个文件,用于存储c盘文件中的数据

    2、定义读取流和C盘文件相关联

    3、通过不断的读写完成数据的存储

    4、关闭资源

    import java.io.*;

    class FileReaderDemo{

      public static void main(String args[]) throws IOException {

        FileWriter fw = new FileWriter("D:\demo_copy.txt");

        FileReader fr = new FileReader("C:\demo.txt");

        char[] buf = new char[1024];

        int num = 0;

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

          fw.write(buf, 0 num);

        }

        fr.close();

        fw.close();

      }

    }

    -----------------------------------------------------------------------------*-*

    缓冲区:

      提高了对数据的读写效率,在创建缓冲区前必须有流,

    BufferedWriter类

    FileWriter fw = new FileWriter("demo.txt");

    //为了提高效率,将要提高效率的流对象作为参数传递给缓冲区构造函数,加入缓冲

    BufferedWriter bufw = new BufferedWriter(fw);

    bufw.writer("abcde");

    bufw.newLine();  //缓冲区中提高跨平台换行符

    bufw.flush();  //只要用到缓冲区就要进行刷新

    bufw.close();  //关闭缓冲区就是关闭缓冲区的流

    --------------------------------------------------*-*

    BufferedReader类

    FileReader fr = new FileReader("demo.txt");

    BufferedReader bufr = new BufferedReader(fr);

    //缓冲技术中整行读取

    String s = bufr.readLine();

    String s = null;

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

      sop(s);

    }

    bufr.close();

    readLine()方法原理:

      无论读一行还是多个字符,其实底层行数在硬盘上面都是使用read()一个一个的读取

    --------------------------------------------------------*-*

    根据缓冲区原理创建自己的缓冲类——装饰设计模式

    class MyBufferReader{

      private FileReader r;

      MyBufferedReader(FileReader r){

        this.r = r;

      }

      //缓冲区一次读一行的方法

      public String myReadLine() throws IOException {

        StringBuilder sb = new StringBuilder();

        int ch = 0;

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

          if((ch = r.read()) == ' ')

            continue;

          if((ch = r.read()) == ' ')

            return sb.toString();

          sb.append((char)ch);

        }

        if(sb.length() != 0)

          return sb.toString() ;  //加入,否则当最后一行无换行则失去最后一行

      }

      public void myColse(){

        r.close();

      }

    }

    ---------------------------------------*-*

    装饰设计模式:

      当要对已有对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能 ,那么自定义的类就称为装饰类,

    装饰类通常通过构造方法接受需要增强的对象。

    实例演示:基于人吃饭的增强功能

    class Person {

      public void eat(){

        System.out.println("吃饭");

      }

    }

    class SuperPerson{

      SuperPerson(Person p){

        this.p = p;

      }

      public void superEat(){

        p.eat();

        System.out.println("喝汤"):

      }

    }

    -------------------------------*-*

    装饰类LineNumberReader

    FileReader fr = new FileReader("demo.txt");

    LineNumberReader lnr = new LineNumberReader(fr);

    String line = null;

    //设置从100开始计数

    lnr.setLinNumber(100);

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

      System.out.print(lnr.getLineNumber()+"--"+line);

    }

    lnr.close();

    -------------------------------------------------------------------------------------------------------*-*

    字节流:

    基类:

    InputStream、OutputStream

    //创建写入流对象

    FileOutputStream fos = new FileOutputStream("demofos.txt");

    fos.write("abcde".getByte());

    //无需刷新但同样需要关闭

    fos.close();

    //创建写入流对象

    FileInputStream fis = new FileInputStream("demo.txt");

    //读取一个字节

    int ch = fis.read();

    sop((char)ch);

    //读取一个字节数组

    Byte[] buf = new Byte{1024];

    int len = 0;

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

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

    }

    //FileInputStream 中提供文件大小获取方法,借此也可以定义一个刚刚好的缓冲区,但是一般不常用

    byte[] buf = new byte[fis.available()];

    fis.read(buf);  //当读取内容过多时会导致内存溢出

    System.out.println(new String(buf));

    fis.close();

    -------------------------------------------------------------------------------------*-*

    读取键盘录入:

    System.out;  对应标准输出设备  控制台

    System.in;  对应标准输入设备  键盘

    需求:通过键盘录入数据,当录入一行数据后,就将该行数据打印,如果录入数据是 over ,就停止录入

    InputStream in = System.in;

    StringBuilder sb = new StringBuilder();

    while(true){

      int ch = in.read();

      if(ch == ' ')

        continue;

      if(ch == ' '){

        String s = sb.toString();

        if("over".equals(s))

          break;

        System.out.println(s.toString());

        sb.delete(0, sb.length());

      }else{

        sb.append((char)ch);

      }

    }

    --------------------------------------------------------------------------------------------------------------------------------------------------*-*

    转换流:

    使用转换流将字节流转换为字符流:

    inputStream in = System.in;

    //将字节流转换位字符流,使用InputStreamReader

    InputStreamReader isr = new InputStreamReader(in);

    //为提高读写效率,将字符串加入缓冲技术

    BufferedReader bufr = new BufferedReader(isr);

    键盘录入的最常见写法:

    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

    流操作的基本规律:

    1、明确源和目的    

    2、操作的数据是不是纯文本的  

    3、当体系明确后,再明确要使用哪个具体对象

      通过设备进行区分

        源:内存、硬盘、键盘  InputStream、Reader(源)

        目的:内存、硬盘、控制台  OutputStream、Writer(目的)

    -----------------------------------------------

    编码:

    把录入的数据按照指定的编码表将数据存到文件中,默认:utf-8

    OutputStreamWriter osw = new OutputStreamWriter(new FileInputStream("demo.txt","UTF-8"));

    修改标准输入、输出:

    System.setIn(new FileInoutStream("1.txt"));

    System.setOut(new printStream("2.txt"));

    将异常信息存入指定文件,IO的应用

    import java.io.*;

    class ExceptionInfo{

      public static void main(String args[]){

        try{

          int[] arr = new int[2];

          System.out.println(arr[3]);

        }catch(Exception e){     

          try{

            System.setOut(new print("exception.log"));

          }catch(IOException ex){

            throw new RuntimeException("日志文件创建失败");

          }

        e.printStackTrace(System.out);

        }

      }

    }

    ---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

    用心-细心-专心-决心 学习就像爬大山,一步一步向前走 -态度决定高度-
  • 相关阅读:
    Matlab学习-(1)
    数据库事务是什么?
    Python解释器有哪些类型,有什么特点?
    Ajax向后台发送简单或复杂数据,后端获取数据的方法
    模态对话框被灰色阴影遮罩挡住的问题
    闭包
    Django——form表单
    Django中常用的正则表达式
    Django中装饰器的使用方法
    Django中自定义过滤器步骤
  • 原文地址:https://www.cnblogs.com/xianyou-liang/p/8503371.html
Copyright © 2011-2022 走看看