黑马程序员——JAVA IO输入输出(一)

来源:互联网 发布:c语言重定向是什么意思 编辑:程序博客网 时间:2024/05/22 00:15
------- android培训、java培训、期待与您交流! ----------

System:类中的方法和属性都是静态的。
  out:标准输出,默认是控制台。
   in:标准输入,默认是键盘。

   Properties是Hashtable的子类,也就是Map集合的一个子类对象。那么可以通过map的方法取出该集合中的元素。该集合中存储都是字符串。没有泛型定义


描述系统一些信息
获取系统属性信息:Properties getProperties();

如何在系统中自定义一些特有信息呢——System.setProperty("mykey","myvalue");

获取指定属性信息——String value = System.getProperty("os.name");System.out.println("value="+value);
在jvm启动时,动态加载一些属性信息——String v = System.getProperty("haha");System.out.println("v="+v);


字符流和字节流:

1、字节流两个基类:InputStream   OutputStream
2、字符流两个基类:Reader Writer

字符流的IO流是用于操作数据的,那么数据的最常见体现形式是:文件。

      当创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。其实该步就是在明确数据要存放的目的地。代码例如:FileWriter fw = new FileWriter("demo.txt");


       write方法,会将字符串写入到流中,例如fw.write("abcde")。flush(),会刷新流对象中的缓冲中的数据,将数据刷到目的地中。close方法,会关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。将数据刷到目的地中。和flush区别是flush刷新后,流可以继续使用,close刷新后,会将流关闭。


       当创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException


       调用读取流对象的read方法。read()会一次读一个字符。而且会自动往下读。给FileWrite传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。例如:FileWriter fw = new FileWriter("demo.txt",true)。


       Math.ceil返回大于指定数据的最小整数。Math.floor返回小于指定数据的最大整数。 Math.round则是四舍五入


Runtime对象
    该类并没有提供构造函数。说明不可以new对象。那么该类中的方法都是静态的。但是该类中还有非静态方法,说明该类肯定提供了方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。由这个特点可以看出该类使用了单例设计模式完成。

缓冲区

    缓冲区的出现是为了提高流的操作效率而出现的,该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。当返回null时,表示读到文件末尾。

    注意:在创建缓冲区之前,必须要先有流对象。同时该缓冲区中提供了一个跨平台的换行符。newLine();。readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。例如BufferedWriter bufw = new BufferedWriter(fw);。还有记得只要用到缓冲区,就要记得刷新。bufw.flush();其实关闭缓冲区,就是在关闭缓冲区中的流对象,bufw.close();。


字节流的读一个字节的read方法为什么返回值类型不是byte,而是int?

     因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。所以,为了避免这种情况将读到的字节进行int类型的提升。并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。而在写入数据时,只写该int类型数据的最低8位。


     读取键盘录入。System.out:对应的是标准输出设备,控制台。System.in:对应的标准输入设备:键盘。

     键盘录入一行数据并打印,其实就是读一行数据的原理。也就是readLine方法。那么能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
      readLine方法是字符流BufferedReader类中的方法。而键盘录入的read方法是字节流InputStream的方法。那么能不能将字节流转成字符流在使用字符流缓冲去的readLine方法呢?

代码如下:

import java.io.*;
class  TransStreamDemo
{
       public static void main(String[] args) throws IOException
       {
               BufferedReader bufr = 
                            new BufferedReader(new InputStreamReader(System.in));
               String line = null;
               while((line=bufr.readLine())!=null)
               {
                      if("over".equals(line))
                               break;
                      bufw.write(line.toUpperCase());
                      bufw.newLine();
                      bufw.flush();
                }
                bufr.close();
         }
}


       获取键盘录入对象。InputStream in = System.in;将字节流对象转成字符流对象,使用转换流。InputStreamReader或InputStreamReader isr = new InputStreamReader(in);为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader bufr = new BufferedReader(isr);   

     键盘的最常见写法。BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));


流操作的基本规律:最痛苦的就是流对象有很多,不知道该用哪一个。
     通过三个明确来完成:
1,明确源和目的。源:输入流。InputStream  Reader。目的:输出流。OutputStream  Writer。
2,操作的数据是否是纯文本。是:字符流。不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。通过设备来进行区分:源设备:内存,硬盘,键盘。目的设备:内存,硬盘,控制台。


  例如:1,将一个文本文件中数据存储到另一个文件中。复制文件。
源:因为是源,所以使用读取流。InputStream Reader 是不是操作文本文件。是!这时就可以选择Reader这样体系就明确了。接下来明确要使用该体系中的哪个对象。明确设备:硬盘,上一个文件。Reader体系中可以操作文件的对象是 FileReader。是否需要提高效率:是!。加入Reader体系中缓冲区 BufferedReader.
              FileReader fr = new FileReader("a.txt");
              BufferedReader bufr = new BufferedReader(fr);
              2、目的:OutputStream Writer。是否是纯文本。是!Writer。设备:硬盘,一个文件。Writer体系中可以操作文件的对象FileWriter。是否需要提高效率:是!。加入Writer体系中缓冲区 BufferedWriter
              FileWriter fw = new FileWriter("b.txt");
              BufferedWriter bufw = new BufferedWriter(fw)

              3、将键盘录入的数据保存到一个文件中。这个需求中有源和目的都存在。那么分别分析

源:InputStream Reader。是不是纯文本?是!Reader。设备:键盘。对应的对象是System.in.不是选择Reader吗?System.in对应的不是字节流吗?为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。所以既然明确了Reader,那么就将System.in转换成Reader。用了Reader体系中转换流,InputStreamReader
              InputStreamReader isr = new InputStreamReader(System.in);
              需要提高效率吗?需要!选用BufferedReader
              BufferedReader bufr = new BufferedReader(isr);
              4、目的:OutputStream  Writer是否是存文本?是!Writer。设备:硬盘。一个文件。使用 FileWriter。
              FileWriter fw = new FileWriter("c.txt");需要提高效率吗?需要。
              BufferedWriter bufw = new BufferedWriter(fw);

装饰设计模式:
    当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

      以前是通过继承将每一个子类都具备缓冲功能。那么继承体系会复杂,并不利于扩展。现在优化思想。单独描述一下缓冲内容。将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。这样继承体系就变得很简单。优化了体系结构。装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。




0 0