Java IO(IO流)-1

IO流 第一部分 (outputStream/InputStream Writer/Redaer)

IO流对象中输入和输出是相辅相成的,输出什么,就可以输入什么.

IO的命名方式为前半部分能干什么,后半部分是父类的名字. (FileOutputStream 文件输出流)

java->JVM->OS

流对象使用的基本步骤

  1. 创建流的子类对象,绑定数据目的地(文件路径)
  2. 使用write方法写或read方法读
  3. close()方法关闭流对象 , 释放资源

输出流的异常处理

  • try catch finally 因为最后要关闭资源,所以要有finally来执行关闭资源的选项
                 FileOutputStream fos = null;
        try {
             fos = new FileOutputStream(file);
        }catch (IOException e) {
        System.out.println(e.toString() + "----");
        } finally {
        //一定要判断fos是否为null,只有不为null时,才可以关闭资源
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                throw new RuntimeException("");
            }
            }
        }

输出流

OutputStream

  • OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。
    • write(int b) 将指定的字节写入输出流,一次写入一个,传递的ASCII码(负数是汉字)
    • write(byte[] b) 将b.length个字节写入输出流
    • write(byte b[],int off,int len) 将b数组中从off开始的len个字节写入输出流
    • close() 关闭流对象,并且释放流对象的资源 , (流对象操作的是操作系统中的资源,释放这里资源)

FileOutputStram

  • 文件输出流,是用于将数据写入 File的输出流。

构造方法

流的构造方法可以创建文件 默认如果存在相同的文件,会覆盖, 可以设置 boolean append来修改位追加内容

  • FileOutputStram(File file) 传递一个File FileOutputStream(File file, boolean append) // 是否追加内容
  • FileOutputStram(String filepath) FileOutputStream(String name, boolean append)

写入文件方式(换行符的方法 /r/n)

                    FileOutputStream fos = new FileOutputStream("c:\\a.txt");
                    //流对象的方法write写数据
                    //写1个字节
                    fos.write(97);
                    //关闭资源
                    fos.close();

                    byte[] bytes = {65,66,67,68};
                    fos.write(bytes);

                    //写字节数组的一部分,开始索引,写几个
                    fos.write(bytes, 1, 2);
                    
                    //写入字节数组的简便方式
                    //写字符串
                    fos.write("hello".getBytes());

                    //关闭资源
                    fos.close();

输入流 (InputStream)

InputStream

所有输入流的超类, 一次读取一个字节

  • int read() // 读一个字节,返回读取到的字节 当读取到文件的结尾的时候,将会返回-1
  • read(byte[] b) // 从输入流中读入一定量的字节,并将其存储到缓存区数组byte[] b 中 , 使用数组来提高读取效率,返回的为读取到的字符数量
  • read(byte[] ,int ) // 将输入流中最多 len 个数据字节读入 byte 数组。

数组读取内容的方式

  1. 从文件中读取一个字符到数组中的初始位置,然后继续读,只到数组长度满了或者到了文件结尾
  2. 当第二次读的时候会将读取到的字符依次放入数组中

FileInputStream

  • FileInputStream(File file)
  • FileInputStream(String filename)

循环的方式来读取文件内容

                    FileInputStream fis = new FileInputStream("c:\\a.txt");
                    //创建字节数组
                    byte[] b = new byte[1024];
                    int len = 0 ;
                    while( (len = fis.read(b)) !=-1){   // 将字符读到了byte数组中,如果到了文件结尾会返回-1
                        System.out.print(new String(b,0,len));
                    }
                    fis.close();

文件的移动(赋值/移动/上传)

创建一个输入流,创建一个输出流,从输入流读取字符同时将字符写入到目标文件

                        FileInputStream fis = null;
                        FileOutputStream fos = null;
                        try{
                            fis = new FileInputStream("c:\\t.zip");
                            fos = new FileOutputStream("d:\\t.zip");
                            //定义字节数组,缓冲
                            byte[] bytes = new byte[1024*10];
                            //读取数组,写入数组
                            int len = 0 ; 
                            while((len = fis.read(bytes))!=-1){
                                fos.write(bytes, 0, len);
                            }
                        }catch(IOException ex){                 
                            throw new RuntimeException("文件复制失败");
                        }finally{     
                        try{          // 需要将两个流关闭的方式全部用try/catch因为如果一下流出现异常,那么另一个流也需要关闭
                            if(fos!=null)
                                fos.close();
                        }catch(IOException ex){
                            throw new RuntimeException("释放资源失败");
                        }finally{
                            try{
                                if(fis!=null)
                                    fis.close();
                            }catch(IOException ex){
                                throw new RuntimeException("释放资源失败");
                            }
                        }
                    }

字符流(主要用来读文本文件)

Writer 字符输出流

字符输出数组的超类

  • write(int c) : 写1个字符
  • write(char[] c) : 写字符数组
  • write(char[] c,int,int) : 字符数组一部分,开始索引,写几个
  • write(String s) : 写入字符串

FileWriter (Writer的子类)

  • FileWriter(String path) FileWriter(File file)

写入字符流以后必须进行flush()刷新 Close()会自动刷新(不提倡)

                        FileWriter fw = new FileWriter("c:\\1.txt");
                    
                    //写1个字符
                    fw.write(100);
                    fw.flush();
                    
                    //写1个字符数组
                    char[] c = {'a','b','c','d','e'};
                    fw.write(c);
                    fw.flush();
                    
                    //写字符数组一部分
                    fw.write(c, 2, 2);
                    fw.flush();
                    
                    //写如字符串
                    fw.write("hello");
                    fw.flush();
                    
                    fw.close();

Reader (字符输入流)

所有字符输入流的超类

  • int read() : 读取单个字符
  • int read(char[] cbuf) : 将字符读入数组
  • abstract int read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。

FileReader

                    FileReader fr = new FileReader("c:\\1.txt");
                    /*int len = 0 ;
                    while((len = fr.read())!=-1){
                        System.out.print((char)len);
                    }*/
                    char[] ch = new char[1024];   
                    int len = 0 ;
                    while((len = fr.read(ch))!=-1){
                        System.out.print(new String(ch,0,len));
                    }
                    
                    fr.close();

字符流中flush() 和close() 的区别

  • flush() 刷新该流的缓冲,刷新完以后可以继续写
  • close() 在关闭以前会刷新缓冲,但是刷新完会关闭流,不可以再继续进行操作.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 远程调用服务框架-CXF(WebServic)

    介绍 远程调用web服务,不需要自己编写具体代码,只需要调用作者给出的接口即可. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或...

    李家酒馆酒保
  • 数据库事务和索引

    事务的性质:   原子性:同一个事务中的所有操作要不然全部成功要不然全部失败   一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,,也...

    李家酒馆酒保
  • Spring MVC面试整理

    Spring MVC执行过程 1. 客户端的请求提交到dispatcherServlet 2. DispatcherServ...

    李家酒馆酒保
  • Python 实现大整数乘法算法

    我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法。今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log...

    用户2870857
  • 数据结构 插入排序算法

    插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。

    Debug客栈
  • 【LeetCode02】找出不含重复字符的 最长子串 的长度

    这道题,一开始最直接的想法就是暴力法,直接穷举所有的子串,然后选择无重复的子串中最长的那个。

    Sam Gor
  • 【Go】slice的一些使用技巧

    slice 是 Go 语言十分重要的数据类型,它承载着很多使命,从语言层面来看是 Go 语言的内置数据类型,从数据结构来看是动态长度的顺序链表,由于 Go 不能...

    thinkeridea
  • 基础练习 高精度加法

      由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。   定义一个数组A,A[0]用于存储a的个位,A[1]...

    刘开心_1266679
  • 【 BowWow and the Timetable CodeForces - 1204A 】【思维】

    题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的...

    _DIY
  • 【POJ 1035】Spell checker

      每个单词,如果字典里存在,输出”该单词 is correct“;如果字典里不存在,但是可以通过删除、添加、替换一个字母得到字典里存在的单词,那就输出 “该单...

    饶文津

扫码关注云+社区

领取腾讯云代金券