黑马程序员——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培训、期待与您交流! ----------------------