java IO复习笔记

1. IO是什么?

    Input Output 

    Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

2. 为什么使用Java IO?

    

3. JAVA IO与JAVA NIO有什么不同?

    详见:

4. 骨架

    

    File 类 :File对象可用来获取或处理与磁盘文件相关的信息,如:权限,时间,日期和目录路径

5. JAVA IO 怎么用?

    1. 读数据的逻辑为:

        open a stream

        while more information

        read information

        close the stream

    2. 写数据的逻辑为:

        open a stream

        while more information

        write information

        close the stream

    File :

    1). File类的构造方法:

          File(String directoryPath)

          File(String directoryPath, String filename)

          File(File dirObj, String filename)

    2). 目录操作常用方法:

          public boolean mkdir() 根据抽象路径名创建目录 。

          public boolean mkdirs() 根据抽象路径名创建多层目录 。

          public String[] list() 返回抽象路径名表示路径中的文件名和目录名 。

          public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

          boolean exists()   

          boolean isFile()

          boolean isDirectory()

6. 使用注意事项

    1). IO流类的构造方法决定是输入流还是输出流。输入流连接一个文件,它会将文件中的内容读到流里面,read方法是将流里面的内容往外读。输出流连接一个文件,它的write方法,是将内存中的内容,写入到输出流中,

          然后再写到文件中。

    2). 输出不一定非要输出到文件中,也可以输出到内存中,如:ByteArrayOutputStream。输入流的read方法是从流里面读出来数据,输出流的write方法时将内存中的数据写入到流中,方便输出出去。

    3). 输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个"输出数据流"(数据从程序流出)。若程序是数据

         流的终点,这个数据流对程序而言就是一个“输入数据流” ( 数据从程序外流向程序)

    4). Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。

    5). 当你对文件的操作结束后,需要调用close( )来关闭文件 

    6). FileOutputStream的创建不依赖于文件是否存在。在创建对象时FileOutputStream在打开输出文件之前创建它。这种情况下你试图打开一个只读文件,会引发一个IOException异常 

    7). 如果read()方法返回-1,意味着程序已经读到了流的末尾,此时流内已经没有多余的数据可供读取了。-1是一个int类型,不是byte或者char类型,这是不一样的。当达到流末尾时,你就可以关闭流了。

    8). ByteArrayInputStream和ByteArrayOutputStream:

          a. writeTo(OutputStream out) :将此字节数组输出流的全部内容写入到指定的输出流参数中

              reset():将此字节数组输出流的count字段重置为零,从而丢弃输出流中目前已累积的所有输出。通过重新使用已分配的缓冲区空间,可以再次使用该输出流

          b. toByteArray():

              toString() : 将流中的内容转换为字符串

     9). 字节流的编码规范与具体的平台有关,可以在构造流对象时指定规范,也可以使用当前平台的缺省规范

     10). InputStreamReader和OutputStreamWriter是java.io包中用于处理字符流的基本类,用来在字节流和字符流之间搭一座“桥”。

             public InputSteamReader(InputSteam in,String enc)

             public OutputStreamWriter(OutputStream out,String enc)

     11). FileReader和FileWriter:FileWriter类的创建不依赖于文件存在与否。在创建文件之前,FileWriter将在创建对象时打开它来作为输出。如果你试图打开一个只读文件,将引发一个IOException异常

     12). ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象。所有这些方法在出错情况下引发IOException 异常

     13). Reader的read()方法返回一个字符,意味着这个返回值的范围在0到65535之间(当达到流末尾时,同样返回-1)。这并不意味着Reade只会从数据源中一次读取2个字节,Reader会根据文本的编码,

            一次读取一个或者多个字节。

     14). try(FileInputStream input = new FileInputStream("file.txt")) {} 防止异常未正常关闭

     15). RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");

     16). 当你创建了一个指向已存在文件的FileOutputStream,你可以选择覆盖整个文件,或者在文件末尾追加内容。通过使用不同的构造函数可以实现不同的目的。

     17). 如果你希望类能够序列化和反序列化,必须实现Serializable接口。

7. 优化

    1). void flush() :刷新输出流,强制缓冲区中的输出字节被写出。

    2). 若处理的数据量较多,为避免每个字节的读写都对流进行,可以使用过滤流类的子类缓冲流。缓冲流建立一个内部缓冲区,输入输出数据先读写到缓冲区中进行操作,这样可以提高文件流的操作效率 

    3). BufferedInputStream(InputStream inputStream, int bufSize)

    4). 一次性读取一个字节数组的方式,比一次性读取一个字节的方式快的多,所以,尽可能使用这两个方法代替read()方法。

8. 监控

 

 

为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?

因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现,所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。

 

posted @ 2016-02-17 14:08  Jtianlin  阅读(443)  评论(0编辑  收藏  举报