A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z920813 初级黑马   /  2018-12-19 12:39  /  737 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

路径分隔符:pathSeparator
        win:是一个;
        lin:是一个:

名称分隔符:separator
        win:\
        lin:/
        "C"+File.separator+"develop"...

转义符:\

绝对路径:
        盘符开始的路径C:\\users\\a.txt


相对路径:
        相对根目录简化a.txt

注意:路径不区分大小写

父路径和子路径创建file:
        灵活,可更改
        父路径是File,好处是 可调用File方法进行一些操作

File类获取功能方法:

File类判断功能方法:

File类创建删除功能的方法:
        创建文件时,如果路径不存在,抛出IO异常

遍历目录的方法:
---------------------------------
递归:
        要有限定条件,否则会有栈内存溢出
        构造方法禁止递归

-----------------------------------
过滤器: listFiles方法的重载--listFiles(FileFilter)
实现过滤接口FileFilter,重写accept方法(或者直接匿名内部类的方式实现)
过滤规则:例如,accept中判断File对象是否是以.java结尾

        过滤器中的accept方法是谁调用的?
                listFiles方法一共做了3件事:
                        1.对构造方法传递的目录进行遍历,获取目录中每一个文件/文件夹,转为File对象
                        2.调用参数传递的过滤器中的方法accept
                        3.把得到的每一个File对象,传递给accept的参数pathname

                accept方法返回布尔值,true:把传递过去的File对象保存到File数组中;false不会
        accept方法的参数pathname是什么?



IO:
        流:数据(字符,字节)1字符=2字节 1字节=8位

        以内存作为第一人称
        输入:硬盘->内存 读取
        输出:内存-硬盘  写入
-----------------------
字节流:
        字节输出流:
                父类:OutputStream 抽象类
                        共性方法
                子类↓

                文件字节输出流:FileOutputStream类 把内存数据写入到硬盘文件
                        构造:
                        1.创建对象
                        2.如果没这个文件,会创建该文件。如果有,会清空文件数据
                        3.把对象指向创建好的文件
                                FileOutputStream(File file)
                                FileOutputStream(String name)
                写入数据原理:java程序-jvm-os-os调用写数据方法-数据写入文件
                                        写数据时会转成二进制,记事本或其他编辑器打开文件时会查询编码表,
                                        0-127查询ascII,其他查询默认码表,中文查询gbk

                使用步骤:
                        1.创建对象(构造传染写入地址)
                        2.调用write
                        3.释放资源close(流使用会占用一定内存)

                方法:
                        write() 写入单个字节
                        write(byte[] b) 字节数组
                        write(byte[] b, int off, int len) 写字节数组一部分
                        byte[] String.getBytes 字符串转为字节数组
                        如果写入第一个字节为负数,那第1、2个字节会组成一个中文显示
                       

                数据追加续写:
                        FileOutputStream(File file, boolean append)
                        FileOutputStream(String name, boolean append)
                        append:true追加数据不会覆盖, false清空原有数据,不写默认false
                        换行:
                                windows \r\n
                                linux        \n
                                mac                \r
        -----------
        字节输入流:
                InputStream 父类
                共性方法:
                        void close()
                        abstract int read()
                        int read(byte[] b)  返回读取有效个数

                        文件字节输出流:FileInputStream 读取文件数据到内存
                                read()读取一个字节,读取到末尾返回-1,读一次把指针向后移动
                                read(byte[] b) 读取多个字节,数组起缓冲作用,一般长度设置为1024,存储读取到的多个字节,返回读取的有效长度
                                与String(byte[] b),String(byte[] b,int off, int length)配合遍历

                                先关闭写,后关闭读
------------------------------------
字符流:
        注意utf-8 一个中文3个字节 gbk一个中文2字节

        字符输入流:Reader 顶层父类 抽象
                FileReader:文件字符输入流
                                        配合String(char[] b),String(char[] b,int off, int length)
        字符输出流:Writer 顶层父类 抽象
                FileWriter:文件字符输出流
                        write把数据写入到内存缓冲区中(字符转换为字节的过程)--不会直接把数据写入到文件中
                        flush把内存缓冲区中数据刷新到文件中
                        close释放资源也会把内存缓冲区中数据刷新到文件中

                        flush和close区别:
                                flush刷新缓冲区,流对象可以继续使用
                                close先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用
                                void write(int c) 写入单个字符
                                void write(char[] cbuf) 写入字符数组
                                void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数
                                void write(String str) 写入字符串
                                void write(String str, int off, int len) 写入字符串的某一部分
        流的关闭原则:先开后关,后开先关
        文件复制练习:一读一写,二流对接
-------------------------
IO异常处理:
        1.7之前try catch finally       
        jdk7特性:
                //确保了每个资源在语句结束时关闭
                try ( FileWriter fw = new FileWriter("fw.txt"); ) {
            // 写出数据
            fw.write("xxx"); 
        } catch (IOException e) {
            e.printStackTrace();
        }
        jdk9特性:
                A a = new A();
                B b = new B();
                try(a,b){//也可以自动释放
                        //代码
                }catch(IOException e){
                        e.printStackTrace();
                }
---------------------------
属性集:properties 双列集合,每个键和值都是字符串
        store 集合临时数据写入硬盘
        load 从硬盘读取到集合

        Object setProperty(String key, String value) : 保存一对属性
        String getProperty(String key) :使用此属性列表中指定的键搜索属性值
        Set<String> stringPropertyNames() :所有键的名称的集合

        void store(OutputStream out,String comments)
        void store(Writer writer,String comments)
                OutputStream out:字节输出流,不能写中文
                Writer writer:字符输出流,可以写中文
                String comments:注释,解释说明文件是做什么的。,中文会有乱码,一般使用空字符串""

        load同上

        文件中:
                文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔
                #注释,不会被读取
                默认时字符串,不用再加引号

缓冲流(高效流,读写文件效率更高),内部维护了一个数组,解决内存到硬盘的IO次数:
        原理:给传入的基本流增加一个缓冲区(数组,数据先读进去再传递回去),提高基本流的读取效率
        字节缓冲流: BufferedInputStream,BufferedOutputStream
        字符缓冲流: BufferedReader,BufferedWriter

        构造第一个参数传递流对象,第二个参数传入size可以指定缓冲区大小,可不写,此时缓冲区默认大小
        write方法是把数据写入到缓冲区中
        flush刷新到文件

        特有方法:
        BufferedReader: String readLine() : 读一行文字,结束标记是\r \n到达末尾返回null
        BufferedWriter: void newLine() : 写一换行分隔符,由系统属性定义符号
--------------------------
转换流:解决乱码
        字符编码:
        编码:
        解码:
        字符集:

        原理:中文gbk 两个字节,utf-8 3个字节。可以自定义读写的编码。不指定会用默认的

        InputStreamReader
        OutputStreamWriter
-------------------------------
序列化:
        ObjectOutputStream:把对象以流的方式写入到文件中,也叫写对象,对象的序列化
                被序列化的对象必须实现 java.io.Serializable接口,标记接口,给类添加一个标记,序列化是会检测是否有该标记,没有会抛出异常
                transient瞬态关键字修饰的成员变量,不会被序列化
                static修饰的变量也不会被序列化
                UId序列号

                ObjectOutputStream(OutputStream out)
                final void writeObject (Object obj) : 将指定的对象写出

        ObjectInputStream:把文件中保存的对象以流的方式读取出来,也叫读对象,对象的反序列化
                 ObjectInputStream(InputStream in)
                final Object readObject () : 读取一个对象

                1.对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个
                ClassNotFoundException 异常
                2.JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操
                作也会失败,抛出一个 InvalidClassException 异常,因为.class和.txt中的序列号不一致
                        解决:手动给类加一个序列号:final static long serialVersionUID
-------------------------------
打印流:
                PrintStream
                PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流
                特有方法:print print()

                System.setOut(打印流对象) 改变输出语句输出的目的地

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马