一、IO流简述------用于操作数据的

  IO流用来处理设备之间的数据传输;

  Java对数据的操作是通过流的方式;

  Java用于操作流的对象都是在IO包中;

  流按操作数据分为: 字节流(通用)和字符流;  按流向分为: 输入流和输出流.

字节流的抽象基类:

   InputStream , OutputStream

字符流的抽象基类:

   Reader, Writer

  注: 由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

    如: InputStream的子类FileInputStream ;Reader的子类FileReaderStream。

二、

  字节流的两个基类:

    InputStream , OutputStream

  字符流的两个基类:(专门处理文本和数据)

    Reader, Writer

--------->>>字符流

   先以操作文件为主来演示

  要求: 在硬盘上,创建一个文件并写入一些文字数据

    找到一个专门用于操作文件的Writer子类对象.FileWriter。 后缀名是父类名。 前缀是该流对象的功能。

  

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

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

  其实该步就是在明确数据要存放的目的地 :

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

  调用write方法,将字符串写入到流中:

              fw.writer("abcdef");

  刷新流对象中的缓冲中数据 ,将数据刷到目的地中:

              fw.flush();

  关闭流资源,但是关闭之前会刷新一次内部的缓冲区的数据; 将数据刷新到目的地中。

  和flush区别: flush刷新后,流可以继续使用,close刷新后,会将流关闭:

              fw.close();

IO异常的处理方式:

 请看代码:

import java.io.*;

calss FileWriterDemo {
public static void main(String[] args) {
    FileWriter fw = null;
    try {
      fw = new FileWriter("demo.txt");
fw.write("safdasf");
    }catch(IOException) {
      System.out.println("catch:"+e.toString());
    }
    finally {
      try {
        if(fw!=null)
          fw.close();
      }catch(IOException) {
          System.out.println("catch:"+e.toString());
      }
    }
  }
}

  

  文件的续写:

  传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写:

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

  文本文件的读取:

   方式一:

      创建一个文件读取流对象,和指定名称的文件相关联;

      要保证该文件是已经存在的,如果不存在,会发生异常 FileNotFoundException 。

        FileReader fw = new FileReader("Demo.txt");

      调用读取流对象的read方法:

        read(): 一次读一个字符,而且会自动往下读。

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

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

      }

   方式二:

      FileReader fw = new FileReader("Demo.txt");

      /* 定义一个字符数组,用于存储读到字符;

      该read(char[]) 返回的是读到字符个数 */:

         char[] buf = new char[1024];

         int num  = 0;

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

          System.out.println(new String(buf, 0, num));

         }

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

 拷贝文本文件:

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

      复制的原理——>其实就是将C盘下的文件数据存储到D盘的一个文件中

    步骤:

      1、在D盘创建一个文件,用于存储C盘文件中的数据。

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

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

      4、关闭资源

   一个实现了复制功能的Copy类:

 public static void Copy() {
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("Demo_copy.txt");
fr = new FileReader("Demo.java");
char [] buf = new char[1024];
int len = 0;
while((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch(IOException e) {
throw new RuntimeException("读写失败");
}
finally {
if(fr != null)
try {
fr.close();
}catch(IOException e) { }
if(fw != null)
try {
fw.close();
}catch(IOException e) { }
}
}

    

  字符流的缓冲区:

简述:

    缓冲区的出现提高了对数据的读写效率。

  对应类:

    |--BufferedWriter   //将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效率写入

    |--BufferedReader  //从字符输入流中读取文本、缓冲各个字符,从而实现字符、数组和行的高校读取。

  缓冲区要结合流才可以使用;  在流的基础上对流的功能进行了增强。

——>>BufferedWriter

   缓冲区的出现是为了提高流的操作效率而出现的;

   所以在创建缓冲区之前,必须要先有流对象;

   该缓冲区中提供了一个跨平台的换行符:   newLine() 

 创建一个字符写入流对象:

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

 为了提高字符写入流效率,加入了缓冲技术 

 只要将需要提高的效率的流对象作为参数传递给缓冲区的构造函数即可:

    BufferedWriter bufw = new BufferedWriter(fw);

  写入:

    for(int x=1; x<5; x++) {

      bufw.writer("dfsfa"+x); bufw.newLine(); bufw.flush();

    }  //记住,只要用到缓冲区,就要记得刷新:  bufw.flush();

  其实关闭缓冲区就是在关闭缓冲区中的流对象:

                 bufw.close();

——>>BufferedReader

   字符读取缓冲区:

    该缓冲区提供了一个一次读取一行的方法 readLine();  包含该行内容字符串,不包含任何行终止符,当返回null时 表示读到文件末尾。

    无论是读一行,获取读取多个字符。其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。

  创建一个读取流对象和文件相关联:

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

  为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲区对象的构造函数。

     BufferedReader bufr = new BufferedReader(fr);

    String line = null;

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

      System.out.println(line);

    }

    bufr.close();

  附加小练习: 自定义一个类中包含一个功能和readLine一致的方法,来模拟BufferedReader

 装饰设计模式:

    当想要对已有的对象进行功能增强时;

    可以定义类,将已有对象传入,基于已有的功能,并提供加强功能;

    那么自定义的该类称为装饰类。

  装饰类通常都会通过构造方法接受被装饰的对象;  并基于被装饰的对象的功能,提供更强的功能。

  例子:

 class Person {
public void eat() {
System.out.println("吃饭");
}
} //装饰类
class SuperPerson {
private Person p;
SuperPerson(Person p) {
this.p = p;
}
public void superEat() {
System.out.println("一杯香槟");
Person.eat();
System.out.println("来点甜点");
}
}

  装饰和继承的区别:

    装饰模式比继承要灵活,避免了继承体系的臃肿; 而且还降低了类与类之间的关系。

    装饰类因为增强了已有对象,具备的功能和已有的是相同的,只不过是提供了更强的功能,所以装饰类和被装饰类通常是属于一个体系中的。

  LIneNumberReade:

    ----带行号的装饰类

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

    LineNumberReader lnr = new LineNumberReader(fr);

    String line = null;

    lnr.setLineNumber(100):

    while() {

      System.out.println(lnr.getLIneNumber()+": "+line);

    }

    lnr.close();

IO(Input Output)流__字符流的更多相关文章

  1. IO(Input&Output)流の介绍

    1.导读 对于设备之间的流动(即写入数据或读出数据),Java专门用Java.io包进行操作.这些数据的流动便是我们所说的数据的输入输出流(IO流). 2.数据流的处理:字节流和字符流 数据的基本单位 ...

  2. Java之IO初识(字节流和字符流)

    IO概述 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了.当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里.那么数据都是在哪些设备上的呢 ...

  3. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  4. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  5. Java IO(十二) 字符流 Writer 和 Reader

    Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...

  6. JAVA之IO流(字符流)

    字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...

  7. (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter

    字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...

  8. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  9. java的IO操作:字节流与字符流操作

    流的概念 程序中的输入输出都是以流形式,流中保存的实际上都是字节文件. 字节流与字符流 字节流的操作: 1)输入:inputStream, 2)输出:outPutStream; 字符流的操作: 1)输 ...

随机推荐

  1. php学习,一个简单的Calendar(2) 一个简单的活动页面

    有了前面的基础,后面就是将页面展示出来. 预览图如下:1号和31号分别有活动,会一并显示出来   这里需要搞定几个问题,一个就是数据库的连接,我们用\sys\class\class.db_connec ...

  2. NS实现采用的技术大多是PHP,如果采用java、 .net是否同样适用?

    SNS采用的技术可不都是PHP (不局限于国内),特别是国外的新兴公司,基本上没有再用PHP的了,国内到还是蛮常用的.简单说说我知道的几个案例:Facebook (PHP):Facebook采用PHP ...

  3. 开发C# .net时使用的数据库操作类SqlHelp.cs

    练习开发WPF程序的时候,是这样写的,虽然很简单,相必很多新手会用到,所以拿来共享一下, using System; using System.Collections.Generic; using S ...

  4. 文件操作 - NSFileManager

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  5. statusBar显示白色字体

    设置状态栏显示颜色为白色. a. 在info.plist中,添加一项,选择View controller-based status bar appearance(箭头下拉中最后一项),设置为no; b ...

  6. C与OC、C++的区别

    C语言的特点:1)C语言是结构化语言,层次清晰,调试和维护比较容易2)表现能力和处理能力比较强,可直接访问内存的物理地址3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发, ...

  7. ThinkPHP学习手记——环境搭建

    怀着激动的心情打开了thinkPHP的文档,开启了第一次php框架学习. 下载 ThinkPHP最新版本可以在官方网站(http://thinkphp.cn/down/framework.html) ...

  8. BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整

    Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了 ...

  9. 检查并创建目录mkdir

    os.listdir() os.path.isdir() os.path.join() os.mkdir() # -*- coding:utf-8 -*- import os,sys def mkdi ...

  10. Learing WCF Chapter1 WCF Services

    WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...