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

© 森111 中级黑马   /  2018-11-26 15:19  /  799 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

IO:

数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input输出output ,即流向内存是输入流流出内存的输出流

IO流分类:

流的关闭原则:先开后关,后开先关  实际都可以

字节流:以字节为单位,读写数据的流

顶级父类:

输入:InputStream(抽象类) 字节输入流

read();  从输入流读取数据的下一个字节, 每次可以读取一个字节的数据,并提升为 int 类型数值,读取到文件末尾返回 -1

read(byte[ ]  b); 从输入流中读取一些字节数,并将它们存储到字节数组 b中


用OutputStream(抽象类)的实现类完成操作 FileInputStream类

FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException

public class FileInputStreamConstructor throws IOException{

    public static void main(String[] args) {

                    // 使用File对象创建流对象

        File file = new File("a.txt");

        FileInputStream fos = new FileInputStream(file);


        // 使用文件名称创建流对象

       FileInputStream fos = new FileInputStream("b.txt");

    }

}


输出:OutputStream(抽象类) 字节数出流

close():刷新缓冲区并关闭此输出流,释放资源 (完成输出后必须释放系统资源)

flush():刷新缓冲区,流对象可以继续使用

·write(int b):将指定的字节输出流(参数为int数值,文件中显示为对应的字符)

·write(byte[ ] b):将指定的字节数组写入此输出流(数组元素没有,默认值为0,表示空格)

·write(byte[ ] b, int start , int length):将指定数组内的 从 start号索引开始  length 个元素内容写入输出流


需要用OutputStream(抽象类)的实现类完成操作 FileOutputStream类

1.创建对象

FileOutputStream fos = new FileOutputStream(File file , boolean b); 构造方法file参数为指定输出流内容的目标文件 file文件中, b 表示是否续写(true表示续写;false表示清空后在写入)

public FileOutputStream(String name) 创建文件输出流以指定的名称写入文件

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据

2.调用 write();方法输出内容

3.close(); 释放资源

例:

public class FileOutputStreamConstructor throws IOException {

    public static void main(String[] args) {

                    // 使用File对象创建流对象

       File file = new File("a.txt");

        FileOutputStream fos = new FileOutputStream(file);


        // 使用文件名称创建流对象

       FileOutputStream fos = new FileOutputStream("b.txt");

    }

}


Windows系统里,换行符号是\r\n

Unix系统:\n

Mac系统:\r

回车符\r和换行符\n

回车符:回到一行的开头(return)

换行符:下一行(newline) 从 Mac OS X开始与Linux统一

字符流:以字符为单位,读写数据的流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储

字符输入流: Reader 抽象类

close() :关闭此流并释放与此流相关联的任何系统资源。

read(): 从输入流读取一个字符。

read(char[ ] ch): 从输入流中读取一些字符,并将它们存储到字符数组 ch中 。

字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。

idea中UTF-8

字节缓冲区:一个字节数组,用来临时存储字节数据。


字符输出流:Writer 抽象类

write(int c) 写入单个字符。

write(char[ ] ch)写入字符数组。

write(char[ ] ch, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。       

write(String str)写入字符串。

write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。

flush()刷新该流的缓冲。

close() 关闭此流,但要先刷新它。



public class FWWrite {

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

        // 使用文件名称创建流对象

        FileWriter fw = new FileWriter("fw.txt");     

              // 字符串转换为字节数组

              char[] chars = "黑马程序员".toCharArray();


              // 写出字符数组

              fw.write(chars); // 黑马程序员


        // 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。

        fw.write(b,2,2); // 程序


              // 关闭资源

        fos.close();

    }

}


字符流,只能操作文本文件,不能操作图片,视频等非文本文件。


IO异常处理

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();

            }

        }

    }

}


JDK7优化后的try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。

格式:

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();

        }

    }

}


Properties类

构造方法

public Properties() :创建一个空的属性列表。

基本的存储方法

public Object setProperty(String key, String value) : 保存一对属性。  

public String getProperty(String key) :使用此属性列表中指定的键搜索对应的属性值。

public Set<String> stringPropertyNames() :所有键的名称的集合。


public class ProDemo {

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

        // 创建属性集对象

        Properties properties = new Properties();

        // 添加键值对元素

        properties.setProperty("filename", "a.txt");

        properties.setProperty("length", "209385038");

        properties.setProperty("location", "D:\\a.txt");

        // 打印属性集对象

        System.out.println(properties);

        // 通过键,获取属性值

       System.out.println(properties.getProperty("filename"));

        System.out.println(properties.getProperty("length"));

        System.out.println(properties.getProperty("location"));


        // 遍历属性集,获取所有键的集合

        Set<String> strings = properties.stringPropertyNames();

        // 打印键值对

        for (String key : strings ) {

                  System.out.println(key+" -- "+properties.getProperty(key));

        }

    }

}

输出结果:

{filename=a.txt, length=209385038, location=D:\a.txt}

a.txt

209385038

D:\a.txt

filename -- a.txt

length -- 209385038

location -- D:\a.txt


与流相关的方法

store(OutputStream out, String comments): 将集合用字节流写入文件(不能中文),并写入注释

store(Writer writer, String comments): 将集合用字符流写入文件(可以中文),并写入注释

load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能中文)

load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以中文)

文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。



属性集(配置文件), 标准的后缀是 .properties

配置文件格式要求:

        一行一个键值对

        键和值中间用=分隔 (标准格式, 但空格分开也行)

        #表示单行注释





0 个回复

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