美文网首页
#1# IO流 ~ 1

#1# IO流 ~ 1

作者: SnailWalker | 来源:发表于2019-12-18 09:54 被阅读0次

    1.IO流的基础 File

         implements Serializable,Comparable

        1.基本定义 :

                   IO包中唯一代表磁盘文件本身的对象

        2.基本操作 【这里用文件来做例子,而不是文件夹】

                  step 1 : 定义一个File : File file = new File("temp.txt"); 

                        注意这里只是定义了一个File的对象,文件还并没有创建

                step 2 :创建File :

              if(!file.exists()){       //判断文件是否存在

                    file.createNewFile() ; //这里会抛出一个异常,Try_Catch住

              }

                step 3 : 其它操作

    #获取相对路劲:file.getPath() =>temp.txt  

    #获取绝对路径 :  file.getAbsolutePath() => C:/demo/temp.txt

    注意 :

        如果File file = new File("C:/demo/temp.txt"),那么通过以上两个方法获取的路径就是一样的

    #文件的大小 : file.length();

    #文件是否存在 : file.exists();

    #删除文件 : file.delete();

            注意,如果file是一个文件夹,那么删除是返回false 失败的

    #路径分割符  File.separator

            根据不同的操作系统取不同操作系统下的分隔符 在window是 “\”

            File.pathSeparator,在window下是“;”(分号),这个得注意

    2.字节流 : InputStream / OutputStream

        1.字节输入流 : InputStream implements Closeable

    #  读取数据方法

    read() : 如果下一个字节可读取,返回一个整形,遇到文件末尾,返回-1

    read(byte[]) 

    read(byte[] byte,int offset,int len) 

    这三个read方法,在输入数据可用,检测到流末尾或者异常前,此方法都将一直阻塞

    # 获取可读取的文字数 : InputStream # int available() 

        2.字节输出流 : OutputStream implements Closeable, Flushable

    #构造方法

    FileoutputStream(String) ->FileOutputStream(String path,boolean append);

    如果传入FileoutputStream中的File的文件不存在,那么会在new FileoutputStream(String path)的时候自动创建一个path对应的File

    #.写入调用的API 流程 :

    write(byte[]) ->write(byte[] byte,int offset,int byteLength)->write(int)

    3.字符流 :Reader / Writer

    #.tips : 获取JDK环境变量的方法 :

        System.getProperties().list(System.out);

       查看 file.encoding = Xxx 属性

    #.字符编码

     //使用GBK编码的字节数组 ,写入和读取的时候,尽量保持一致

        byte[] demo = "Java基础".getBytes("GBK"); 

        1.字符输入流 : Reader implements Readable, Closeable       

        2.字符输出流 : Writer implements Appendable, Closeable, Flushable 

    4.增加 Buff : BufferedXxx 

            为了达到最高的效率,避免频繁地进行字符与字节之间的相互转换,最好不要直接使用FileReader和FileWriter这两个类进行读写,而使用BufferedWriter包装OutputStreamWriter,使用BufferedReader包装InputStreamReader。

    注意 : 

        1、利用BufferedWriter进行写操作,写入的内容会放在缓冲区内,直到遇到close()、flush()的时候才会将内容一次性写入文件。另外注意close()的顺序,一定要先关闭BufferedWriter,再关闭Writer,不可以倒过来,因为BufferedWriter的写操作是通过Writer的write方法写的,如果先关闭Writer的话,就无法将缓冲区内的数据写入文件了,会抛出异常

    2、利用BufferedReader进行读操作,不可以用父类Reader指向它,因为readLine()这个方法是BufferedReader独有的,readLine()的作用是逐行读取文件中的内容

    5.总结

    1.字节流和字符流的区别:

            API : 字节流中write ()是byte[] 或者int , 字符流中确实 char[]

            本质: 字节流直接操作文件,针对的是单个字节的操作,而字符是通过StreamDecoder把InputStream读取数据到内存中字节进行解码成字符,然后再刷入到指定文件的,所以字符流针对的是字符(2* byte)    

    2.字符流和添加了BufferedXxx的对应字符流,都是用到内存缓存,这两者的区别?

        首先,添加BufferedReader之类的作用为了避免FileReader频繁的字节转字符的操作

        其次,同样具有内存缓存,区别就在于,FileWriter之类的是每次或取数据都是字节先转字符后到内存,而BufferedWriter确实直接先读到内存,满了之后或者调用Flush,再调用FileWriter把缓存中的数据写入

    3.字节流转字符流

        new BufferedReader(new InputSteamReader(new FileInputStream(new File("temp.txt")));

        此外,outputStreamWriter 和 InputStreamReader 的都有主动设置Charset的构造方法

    6.一些其它的流 : Other流

    对象流 : ObjectOutputStream / ObjectInputStream

    DataInputStream / DataOutputStream

    RandomAccessFile

    *感谢*

    五月仓颉 : https://www.cnblogs.com/xrq730/p/4886636.html

    相关文章

      网友评论

          本文标题:#1# IO流 ~ 1

          本文链接:https://www.haomeiwen.com/subject/khxluctx.html