IO的学习

来源:互联网 发布:115会员充值 淘宝 编辑:程序博客网 时间:2024/05/17 07:20

  IO流


    IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。
    输入流和输出流相对于内存设备而言。

    将外设中的数据读取到内存中:输入。
    将内存的数写入到外设中:输出。

    流按操作数据分为两种:字节流与字符流。

    字符流的由来:
    其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。再对这个文字进行操作。简单说:字节流+编码表。

   IO流常用基类-字符流

    字节流的抽象基类:InputStream,OutputStream。

    字符流的抽象基类:Reader,Writer。

    P.S.
    由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
    如:InputStream的子类FileInputStream。
    如:Reader的子类FileReader。

    需求:将一些文字存储到硬盘一个文件中。
    记住:如果要操作文字数据,建议优先考虑字符流。
    而且要将数据从内存写到硬盘上,要使用字符流中的输出流:Writer。
    硬盘的数据基本体现是文件,希望找到一个可以操作文件的Writer:FileWriter。

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

    对应类:
   BufferedWriter
   BufferedReader

    P.S.
    缓冲区要结合流才可以使用。

    作用:在流的基础上对流的功能进行了增强。

字符流缓冲区:

    写入换行使用BufferedWriter类中的newLine()方法。
    读取一行数据使用BufferedReader类中的readLine()方法。

    bufr.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
    bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。

    原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。

LineNumberReader
    跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。

 IO流常用基类-字节流


    基本操作与字符流类相同。但它不仅可以操作字符,还可以操作其他媒体文件。

 P.S.
    FileOutputStream、FileInputStream的flush方法内容为空,没有任何实现,调用没有意义。

    字节流的缓冲区:同样是提高了字节流的读写效率。

8.2.4 IO流常用基类-字节流

    读取一个键盘录入的数据,并打印在控制台上。

    键盘本身就是一个标准的输入设备。对于java而言,对于这种输入设备都有对应的对象。

P.S.
    1、获取键盘录入数据,然后将数据流向显示器,那么显示器就是目的地。
    通过System类的setIn,setOut方法可以对默认设备进行改变。
    System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
    System.setOut(new PrintStream(“2.txt”));//将目的改成文件2.txt
    因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。
    BfferedReader bufr =
               new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw =
               new BufferedWriter(new OutputStreamWriter(System.out));
    2、默认的输入和输出系统不需要关,它会随着系统的结束而消失。

  转换流


    转换流的由来:
    字符流与字节流之间的桥梁
    方便了字符流与字节流之间的操作

    转换流的应用:
    字节流中的数据都是字符时,转成字符流操作更高效。

    转换流:
    InputStreamReader:字节到字符的桥梁,解码。
    OutputStreamWriter:字符到字节的桥梁,编码。

    InputStreamReader是字节流通向字符流的桥梁。

 P.S.
    使用字节流读取一个中文字符需要读取两次,因为一个中文字符由两个字节组成,而使用字符流只需读取一次。
    System.out的类型是PrintStream,属于OutputStream类别。

    OutputStreamReader是字符流通向字节流的桥梁。

 流的操作规律

    之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。
    想要知道对象的开发时用到哪些对象,只要通过四个明确即可。

    1、明确源和目的
         源:InputStream Reader
         目的:OutputStream Writer

    2、明确数据是否是纯文本数据
         源:是纯文本:Reader
                否:InputStream
         目的:是纯文本:Writer
                否:OutputStream 
         到这里,就可以明确需求中具体要使用哪个体系。

    3、明确具体的设备
         源设备:
         硬盘:File
         键盘:System.in
         内存:数组
         网络:Socket流
         目的设备:
         硬盘:File
         控制台:System.out
         内存:数组
         网络:Socket流

    4、是否需要其他额外功能
         是否需要高效(缓冲区):
         是,就加上buffer

字符流继承体系简图


字节流继承体系简图


 File类


    File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。
    File对象可以作为参数传递给流的构造函数。

    P.S.
    流只能操作数据,不能操作文件。

File对象的常用方法:

    1、获取
         获取文件名称
         获取文件路径
         获取文件大小
         获取文件修改时间

2、创建和删除

3、判断

4、重命名

5、系统根目录和容量获取

需求:获取目录下的文件以及文件夹的名称。

 8.2.8 递归  

    函数自身直接或者间接的调用到了自身。
    一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用有关。这时可以用递归来解决问题。

    P.S.
    1、递归一定明确条件,否则容易栈溢出。
    2、注意一下递归的次数。

 Properties集合

    Map
          |--Hashtable
               |--Properties

    特点:
    1. 该集合中的键和值都是字符串类型。
    2. 集合中的数据可以保存到流中,或者从流中获取。

    3. 通常该集合用于操作以键值对形式存在的配置文件。

IO包中的其他类

    打印流

    PrintWriter与PrintStream:可以直接操作输入流和文件。

    PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
    与其他输出流不同,PrintStream永远不会抛出IOException。
    PrintStream打印的所有字符都使用平台的默认字符编码转换为字节。
    在需要写入字符而不是写入字节的情况下,应该使用PrintWriter类。

    PrintStream:
    1. 提供了打印方法可以对多种数据类型值进行打印,并保持数据的表示形式
    2. 它不抛IOException

    构造函数,接收三种类型的值:
    1. 字符串路径
    2. File对象
    3. 字节输出流

 PrintWriter:字符打印流

    构造函数参数:
    1. 字符串路径
    2. File对象
    3. 字节输出流
    4. 字符输出流

  编码表


    编码表的由来
    计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。
    就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表。

    常见的编码表
    ASCII:美国标准信息交换码,用一个字节的7位可以表示。
    ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。
    GB2312:中国的中文编码表。
    GBK:中国的中文编码表升级,融合了更多的中文文字符号。
    Unicode:国际标准码,融合了多种文字。
    所有文字都用两个字节来表示,Java语言使用的就是unicode
    UTF-8:最多用三个字节来表示一个字符。




0 0
原创粉丝点击