尚硅谷—初级—IO 流、NIO(581~617)

目录

一.File 类的使用:

二:IO 流的原理 及 流的分类

 三:节点流(文件流)

 四:缓冲流

 五:转换流

 五:对象流

 五:随机存储文件流:(可以存,可以取)

 六:其他流的使用

       标准输入、输出流(了解)
       打印流(了解)
       数据流(了解)
       随机存取文件流(了解)
       NIO.2 中,Path,Paths,Files 类的使用

七:NIO.2 中 Path、Paths、Files 类的使用(了解):


一.File 类的使用




 

二:IO 流的原理 及 流的分类

                 1)java IO 原理
                            d:输入输出:(都是相对于程序而言)(读进来Input,写出去Output)
                 -1.输入(input):读取外部数据到内存中
                 -2.输出(output):内存中数据写到外面

                 2)流的分类:
                            d:按照 操作数据的基本单位 不同:


                            d:按 数据的流向分类
                 -1.输入流:
                 -2.输出流:


                            d:按 流的角色分类
                 -1.节点流:直接作用在文件上。
                 -2.处理流:包在 节点流 外面的流,包了一层。

                            d:IO 流体系图片
                 -1.分清 字节流,字符流(字节流为Stream,字符流为 Reader)
                 -2.分清 输入流,输出流(input 为输入,output 为输出)
                 -3.分清 节点流,处理流(访问文件为节点流,以下其他都为处理流)
                 -4.蓝色的为常用的:







 

 三:节点流(文件流)

                 1)使用io流,读取文件内容
                            d:read():
                 -1.read()的理解:返回读取的一个字符。返回读到的char。如果读到文件末尾,则返回-1
                 -2.read( char[] c ):一下读取一个 char 数组长度,返回读取的长度。

                            b:异常的处理:
                 -1.为了保证流资源一定可以执行关闭操作,需要使用 try-catch-finally 进行异常处理。

                            c:读入的文件一定要存在,否则就会报 FileNotFoundException。

                            d:操作代码:

                FileReader fileReader = null;
                try {
                    //相对于当前module
                    File file = new File("d:" + File.separator + "ddd" + File.separator + "4.txt");
                    /*读取 文件 内容到 控制台 */
                    fileReader = new FileReader(file);
                    int read = 0;
                    while ((read = fileReader.read()) != -1) {
                        System.out.print((char) read);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                     try {
                         //保证流不为空
                         if (fileReader != null) {
                             fileReader.close();
                         }
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                }

                            e:使用 read(char[] aa)

                     char[] chars = new char[3];
                     int read;
                     while ((read = fileReader.read(chars)) != -1) {

                         // 方式 一:
                         for (int i = 0; i < len; i++) {
                             System.out.print(chars[i]);
                         }
                        
                         // 方式 二:
                         String s = new String(chars, 0, len);
                         System.out.print(s);
                     }

                            f:使用io流,往文本里写数据:

    public static void main(String[] args) throws IOException {

        File file = new File("/Users" + File.separator + "zhangsan" + File.separator + "workspace" + File.separator + "renren_vue" + File.separator + "mall-test" + File.separator + "my_test_01" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "application.properties");
        boolean ee = file.exists();
        System.out.println(ee);

        FileWriter fileWriter = new FileWriter(file, true);
        String s = new String("server.port=8080");
        fileWriter.write(s);
        fileWriter.flush();
        fileWriter.close();
    }

                        g:使用io流,实现文本文件的复制:(内存层面不读,使用子节流也行)(使用字符流:.txt;.java )

    public static void main(String[] args) throws IOException {

        File file = new File("/Users" + File.separator + "zhangsan" + File.separator + "workspace" + File.separator + "renren_vue" + File.separator + "mall-test" + File.separator + "my_test_01" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "application.properties");
        File fil2 = new File("/Users" + File.separator + "zhangsan" + File.separator + "workspace" + File.separator + "renren_vue" + File.separator + "mall-test" + File.separator + "my_test_01" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "application2.properties");
        FileReader fileReader = new FileReader(file);
        FileWriter fileWriter = new FileWriter(fil2);

        int len = 0;
        char[] chars = new char[5];
        while ((len = fileReader.read(chars)) != -1) {
            fileWriter.write(new String(chars, 0, len));
        }
        fileReader.close();
        fileWriter.close();
    }

                        h:使用io流,实现图片或者视频的复制:(非文本文件:使用 子节流处理)

    public static void main(String[] args) throws IOException {

        File file = new File("/Users/zhangsan/Pictures/WechatIMG185.png");
        File fil2 = new File("/Users/zhangsan/Pictures/22222.png");
        FileInputStream fileInputStream = new FileInputStream(file);
        FileOutputStream fileOutputStream = new FileOutputStream(fil2);

        int len = 0;
        byte[] bytes = new byte[5];
        while ((len = fileInputStream.read(bytes)) != -1) {
            fileOutputStream.write(bytes, 0, len);
        }
        fileOutputStream.close();
        fileInputStream.close();
    }








 

 四:缓冲流

                 1)缓冲流:
                          a:为处理流的一种,主要作用,就是为了提高文件的读写效率。

                 2)使用方法:
                          a:只是在 FileInputStream 外面的基础上,多套了一层处理流 BufferedInputStream,
                          b:还是使用 byte[] 数组存数据,


                 3)关闭缓冲流:
                          a:先关闭外面流,在关闭里面流。但是关闭外层流的同时,内层流会自动被关闭。

                 4)是清空缓冲区:
                          a:BufferOutputStream 有 flush() 方法,。

                 5)使用缓冲流,复制图片。flush(),
                          a:使用缓冲流,赋值文本。readLine(),newLine()。






 

 五:转换流

                 1)转换流:(属于字符流、处理流)
                          d:提供了在 字节流 和 字符流 之间的转换。
                          b:InputStreamReader:将一个 字节输入流 --> 字符输入流。(InputStream --> Reader)
                          c:OutputStreamWriter:将一个 字符输出流 --> 字节输出流。(Writer --> OutputStream)

                 2)作用:
                          a:可以 用 节流,b读取文本数据,转换成 字符流 在控制台展示,再将 字符流 转换为 字节流,写到文本中。

                          b:也可以进行 ,文本编码集的转换。


                 3)方法:
                          a:read() 方法: 同样是使用,read() 方法读取,创建转换流时候,可以指定编码。

                 4)使用:

        File file1 = new File("");
        FileInputStream fileInputStream1 = new FileInputStream(file1);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream1);
        






 

 五:对象流

                 1)对象流作用:
                          a:用于存储和读取,基本数据类型数据,或者 对象的处理流:
                 -1.他的强大之处,就是可以把,Java中的对象,写入到数据源中,也能把 对象 从数据源中还原回来。

                 2)ObjectInputStream 和 ObjectOutputStream(读对象 和 写出去对象)(子节流)

                 3)使用场景:
                          a:序列化:
                 -1.用 ObjectOutputStream 类 保存基本类型数据 或者 对象 的机制

                          b:反序列化:
                 -1.用 ObjectInputStream 类 读取基本类型数据 或者 对象 的机制

                          c: 注意:  
                 -1.不能序列化 static 和 transient 修饰的成员变量。
                 -2.对象是可序列化的,要实现 Serializable 接口
                 -3.写序列化版本号:public static final long serialVersionUID = 213123123L;
                 -4.除了实现 接口之外,还要保证,类里面属性,都要是可序列化的,
                                                (默认情况下,基本数据类型,都可以序列化)

                 4)代码:

    public static void main(String[] args) throws IOException, ClassNotFoundException {

//     写对象:::
//        AA aa = new AA("张三", 15);
//        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("/Users" + File.separator + "zhangsan" + File.separator + "workspace" + File.separator + "renren_vue" + File.separator + "mall-test" + File.separator + "my_test_01" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "application.dat")));
//        objectOutputStream.writeObject(aa);
//        objectOutputStream.close();


//     读对象:::
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("/Users/zhangsan/workspace/renren_vue/mall-test/my_test_01/src/main/resources/application.dat")));
        AA aa = (AA) objectInputStream.readObject();
        System.out.println(aa);
    }


@Data
class AA implements Serializable {

    private static final long serialVersionUID = 42L;

        private String name;
        private Integer age;
        private String addr;
   }
}

                 5)serialVersionUID:(序列化和反序列化 确保一致性)
                          a:写序列化版本号:public static final long serialVersionUID = 213123123L;






 

六:随机存储文件流:(可以存,可以取)

                 1)RandomAccessFile 类的使用
                          a:RandomAccessFile:直接继承于 java.lang.Object 类,实现了 DataInput 和 DataOutput 接口
                          b:RandomAccessFile:既可以作为一个输入流,又可以作为一个输出流。

                 2)代码:(读写文件,需要两个流)

    public static void main(String[] args) throws Exception {
        File file = new File("");
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
        // 获取指针的位置。
        long filePointer = randomAccessFile.getFilePointer();
        // 移动指针的位置,到指定位置读写:
        randomAccessFile.seek(100L);

        randomAccessFile.write(1234);
        randomAccessFile.close();

    }


                 3)作为输出流时:
                          a:写出到文件,对原有文件内容,进行覆盖,默认从头覆盖,类似于 insert 方式。
                          b:写出到文件,实现插入,可以使用 seek(long l) 方法。先调动插入指针,后插入。

                 -1.如果获取文件内容大小,可以调用 File.length() 方法。




 

七:其他流的使用

                 1)标准的输入输出流:(了解)
                          a:标准的输入流:
                 -1.System.in:默认从键盘输入
                          b:标准的输出流:
                 -1.System.out:默认从控制台输出

                 2)打印流:(了解)

                          a:printStream 和 printWriter:(都是输出流)
                          b:println():点进去,就是打印流中的方法。

                 -1.提供了一系列 重载的 print() 和 println()
 

                 3)数据流:(了解)

                          b:DataInputStream 和 DataOutputStream:(套接再InputStream上)
                          b:作用:
                 -1.用于读取或者写出:基本数据类型的变量 或 者字符串。
                 -2.读取:int ,boolean,等基本类型。
                 -3.需要按照,写入顺序读取。

 


 

八:NIO.2 中 Path、Paths、Files 类的使用(了解):

                 1)传统的IO流:
                          a:传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回。
                          b:调用accept也是一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。
                          c:并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。
                          c:File 访问文件系统,功能有限,性能也不高。而且出错只返回失败,没有异常信息返回。


                 1)NIO分类:
                          a:标准的 输入输出 NIO
                          b:网络编程 NIO



                 1)对于NIO,它是非阻塞式,核心类:
                          a:Buffer为所有的原始类型提供 (Buffer)缓存支持。
                          b:Charset 字符集编码解码解决方案。
                          c:Channel 一个新的原始 I/O抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。
                 2)NIO2 来历:
                          a:因为 传统 IO 的效率低,java推出 NIO,以更加高效的方式,进行对文件的读写操作。
                          b:随着 JDK7 的发布,java 对 NIO 有了极大的扩展,增强对文件处理和文件系统特性的支持,以至于称他们为 NIO2。

                 4)NIO2 中,对于 Path,Paths,Files 类的使用。
                          a:Paths:可以理解为 NIO2 提供的 File 类。  

    public static void main(String[] args) throws Exception {

        File file = new File("");
        //替换为
        Path path = Paths.get("");
    }

                           b:Path 常用方法:

 

                           c:Files



                 5)实际开发中:
                           c:多使用 commons.io 包,第三方的jar包,FileUtils 方法类调用方法,去执行 io 流 操作。都给封装好了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值