• 字节流 字符流


    一、IO概述

    Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
    • 输入流 :把数据从其他设备上读取到内存中的流。
    • 输出流 :把数据从内存 中写出到其他设备上的流。
    • 字节流 :以字节为单位,读写数据的流。
    • 字符流 :以字符为单位,读写数据的流。
     

    二、字节流

    一切皆为字节
     

    OutputStream、FileOutputStream

    java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。
    java.io.FileOutputStream类是文件输出流,用于将数据写出到文件。
    public void close() :关闭此输出流并释放与此流相关联的任何系统资源。  
    public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。  
    public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。  
    public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。  
    public abstract void write(int b) :将指定的字节输出流。
    
    public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。 
    public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。 
    
    数据追加续写
    true 表示追加数据,false 表示清空原有数据。
    public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。  
    public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称

    InputStream、FileInputStream

    java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。
    java.io.FileInputStream类是文件输入流,从文件中读取字节。
    public void close() :关闭此输入流并释放与此流相关联的任何系统资源。    
    public abstract int read(): 从输入流读取数据的下一个字节。 
    public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
    
    FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 
    FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。  
    
     

    图片复制练习

    public class Copy {
        public static void main(String[] args) throws IOException {
            // 1.创建流对象
            // 1.1 指定数据源
            FileInputStream fis = new FileInputStream("D:\test.jpg");
            // 1.2 指定目的地
            FileOutputStream fos = new FileOutputStream("test_copy.jpg");
    
            // 2.读写数据
            // 2.1 定义数组
            byte[] b = new byte[1024];
            // 2.2 定义长度
            int len;
            // 2.3 循环读取
            while ((len = fis.read(b))!=-1) {
                // 2.4 写出数据
                fos.write(b, 0 , len);
            }
    
            // 3.关闭资源
            fos.close();
            fis.close();
        }
    }
    
    

    三、字符流

    遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。
     

    Reader、FileReader

    java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。
    public void close() :关闭此流并释放与此流相关联的任何系统资源。    
    public int read(): 从输入流读取一个字符。 
    public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
    
    FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。   
    FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。  
    
    public class FISRead {
        public static void main(String[] args) throws IOException {
              // 使用文件名称创建流对象
               FileReader fr = new FileReader("read.txt");
              // 定义变量,保存有效字符个数
            int len ;
            // 定义字符数组,作为装字符数据的容器
            char[] cbuf = new char[2];
            // 循环读取
            while ((len = fr.read(cbuf))!=-1) {
                System.out.println(new String(cbuf,0,len));
            }
            // 关闭资源
            fr.close();
        }
    }
    
    输出结果:
    xx
    xx
    x

    Writer、FileWriter

    java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。
    java.io.FileWriter类是写出字符到文件的便利类。
    void write(int c) 写入单个字符。
    void write(char[] cbuf)写入字符数组。 
    abstract  void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 
    void write(String str)写入字符串。 
    void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    void flush()刷新该流的缓冲。  
    void close() 关闭此流,但要先刷新它。 
    
    FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。   
    FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。  
    
    public class FWWrite {
        public static void main(String[] args) throws IOException {
            // 使用文件名称创建流对象
            FileWriter fw = new FileWriter("fw.txt");     
              // 写出数据
              fw.write(97); // 写出第1个字符
              fw.write('b'); // 写出第2个字符
              fw.write('C'); // 写出第3个字符
              fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
          
              /*
            【注意】关闭资源时,与FileOutputStream不同。
               如果不关闭,数据只是保存到缓冲区,并未保存到文件。
            */
            // fw.close();
        }
    }
    输出结果:
    abC田
    
    关闭和刷新
    flush :刷新缓冲区,流对象可以继续使用。
    close: 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

    四、IO异常的处理

    我们一直把异常抛出,而实际开发中并不能这样处理,建议使用try...catch...finally 代码块,处理异常部分

    public class HandleException1 {
        public static void main(String[] args) {
              // 声明变量
            FileWriter fw = null;
            try {
                //创建流对象
                fw = new FileWriter("fw.txt");
                // 写出数据
                fw.write("黑马程序员"); //黑马程序员
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fw != null) {
                        fw.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    扩展
    try (创建流对象语句,如果多个,使用';'隔开) {
        // 读写数据
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    public class HandleException2 {
        public static void main(String[] args) {
              // 创建流对象
            try ( FileWriter fw = new FileWriter("fw.txt"); ) {
                // 写出数据
                fw.write("黑马程序员"); //黑马程序员
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    JDK9扩展
    public class TryDemo {
        public static void main(String[] args) throws IOException {
               // 创建流对象
            final  FileReader fr  = new FileReader("in.txt");
            FileWriter fw = new FileWriter("out.txt");
               // 引入到try中
            try (fr; fw) {
                  // 定义变量
                int b;
                  // 读取数据
                  while ((b = fr.read())!=-1) {
                    // 写出数据
                    fw.write(b);
                  }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    五、属性集

    java.util.Properties 继承于Hashtable ,来表示一个持久的属性集。

    构造方法:
    public Properties() :创建一个空的属性列表。
    存储方法:
    public Object setProperty(String key, String value) : 保存一对属性。  
    public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
    public Set<String> stringPropertyNames() :所有键的名称的集合。
    与流相关得
    public void load(InputStream inStream): 从字节输入流中读取键值对。 
    
    public class ProDemo2 {
        public static void main(String[] args) throws FileNotFoundException {
            // 创建属性集对象
            Properties pro = new Properties();
            // 加载文本中信息到属性集
            pro.load(new FileInputStream("read.txt"));
            // 遍历集合并打印
            Set<String> strings = pro.stringPropertyNames();
            for (String key : strings ) {
                  System.out.println(key+" -- "+pro.getProperty(key));
            }
         }
    }
    输出结果:
    filename -- a.txt
    length -- 209385038
    location -- D:a.txt
  • 相关阅读:
    iscsi一致性的测试验证方法
    ceph各个版本之间参数变化分析
    rgw的rgw_thread_pool_size配置调整
    rgw前端替换civetweb为beast
    配置内网访问的TV
    关于vm.min_free_kbytes的合理设置推测
    rbd的删除回收站功能
    python爬取微博热门话题榜
    Selenium+Pytest自动化测试框架—禅道实战
    python带参数装饰器的两种写法
  • 原文地址:https://www.cnblogs.com/alice-bj/p/12411172.html
Copyright © 2020-2023  润新知