JAVA_ character stream and properties class

1 Character input stream Reader

concept

1. 使用字节流读取中文文件
	1个中文
    GBK:占用两个字节
    UTF-8:占用3个字节
2. java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类
3. 共性的成员方法:
    int read() 读取单个字符并返回。
    int read(char[] cbuf)一次读取多个字符,将字符读入数组。
    void close() 关闭该流并释放与之关联的所有资源。
4.  java.io.FileReader extends InputStreamReader extends Reader
	FileReader:文件字符输入流
	作用:把硬盘文件中的数据以字符的方式读取到内存中
5. 构造方法:
    FileReader(String fileName)
    FileReader(File file)
    参数:读取文件的数据源
        String fileName:文件的路径
        File file:一个文件
    FileReader构造方法的作用:
        1. 创建一个FileReader对象
        2. 会把FileReader对象指向要读取的文件
6. 字符输入流的使用步骤:
    1. 创建FileReader对象,构造方法中绑定要读取的数据源
    2. 使用FileReader对象中的方法read读取文件
    3. 释放资源
7. 读取的方法
	int read() 读取单个字符并返回。
	int read(char[] cbuf)一次读取多个字符,将字符读入数组,返回的是有效数组长度
import java.io.FileReader;
import java.io.IOException;
public class Demo02Reader {
    
    
    public static void main(String[] args) throws IOException {
    
    
        FileReader fr = new FileReader("09_IOAndProperties\\c.txt");
        //int read() 读取单个字符并返回。
        /*int len = 0;
        while((len = fr.read())!=-1){
            System.out.print((char)len);
        }*/

        //一次读取多个字符
        char[] cs = new char[1024];//存储读取到的多个字符
        int len = 0;//记录的是每次读取的有效字符个数
        while((len = fr.read(cs))!=-1){
    
    
            /*
                String类的构造方法
                String(char[] value) 把字符数组转换为字符串
                String(char[] value, int offset, int count) 把字符数组的一部分转换为字符串 offset数组的开始索引 count转换的个数
             */
            System.out.println(new String(cs,0,len));
        }
        //3.释放资源
        fr.close();
    }
}

2 Character output stream Writer

concept

1. java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类

2. 共性的成员方法:
    - 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() 关闭此流,但要先刷新它。

2. java.io.FileWriter extends OutputStreamWriter extends Writer
	FileWriter:文件字符输出流
	作用:把内存中字符数据写入到文件中

3. 构造方法:
    FileWriter(File file)根据给定的 File 对象构造一个 FileWriter 对象。
    FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
    参数:写入数据的目的地
        String fileName:文件的路径
        File file:是一个文件
4. 构造方法的作用:
        1.会创建一个FileWriter对象
        2.会根据构造方法中传递的文件/文件的路径,创建文件
        3.会把FileWriter对象指向创建好的文件

5. 字符输出流的使用步骤(重点):
    1.创建FileWriter对象,构造方法中绑定要写入数据的目的地
    2.使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
    3.使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
    4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
import java.io.FileWriter;
import java.io.IOException;
public class Demo01Writer {
    
    
    public static void main(String[] args) throws IOException {
    
    
        FileWriter fw = new FileWriter("09_IOAndProperties\\d.txt");
        //写入单个字符。
        fw.write(97);
        //fw.flush();
        //4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
        fw.close();
    }
}

The difference between flush method and close method

flush方法和close方法的区别
    - flush :刷新缓冲区,流对象可以继续使用。
    - close:  先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
import java.io.FileWriter;
import java.io.IOException;
public class Demo02CloseAndFlush {
    
    
    public static void main(String[] args) throws IOException {
    
    
        FileWriter fw = new FileWriter("09_IOAndProperties\\e.txt");
        //2.使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
        //void write(int c) 写入单个字符。
        fw.write(97);
        //3.使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
        fw.flush();
        //刷新之后流可以继续使用
        fw.write(98);

        //4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
        fw.close();

        //close方法之后流已经关闭了,已经从内存中消失了,流就不能再使用了
        fw.write(99);//IOException: Stream closed
    }
}

Other methods of writing data in character output stream

void write(char[] cbuf)Write character array.
abstract void write(char[] cbuf, int off, int len)Write a certain part of the character array, the start index of the off array, and the number of characters written by len.
void write(String str)Write a string.
void write(String str, int off, int len)Write a certain part of the string, the start index of the off string, and the number of characters written by len.

import java.io.FileWriter;
import java.io.IOException;
public class Demo03Writer {
    
    
    public static void main(String[] args) throws IOException {
    
    
        FileWriter fw = new FileWriter("09_IOAndProperties\\f.txt");
        char[] cs = {
    
    'a','b','c','d','e'};
        //void write(char[] cbuf)写入字符数组。
        fw.write(cs);//abcde

        //void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
        fw.write(cs,1,3);//bcd

        //void write(String str)写入字符串。
        fw.write("传智播客");//传智播客

        //void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
        fw.write("黑马程序员",2,3);//程序员

        fw.close();
    }

Continuation and line feed

续写和换行
续写,追加写:使用两个参数的构造方法
    FileWriter(String fileName, boolean append)
    FileWriter(File file, boolean append)
    参数:
        String fileName,File file:写入数据的目的地
        boolean append:续写开关 true:不会创建新的文件覆盖源文件,可以续写; false:创建新的文件覆盖源文件
 换行:换行符号
    windows:\r\n
    linux:/n
    mac:/r
import java.io.FileWriter;
import java.io.IOException;
public class Demo04Writer {
    
    
    public static void main(String[] args) throws IOException {
    
    
        FileWriter fw = new FileWriter("09_IOAndProperties\\g.txt",true);
        for (int i = 0; i <10 ; i++) {
    
    
            fw.write("HelloWorld"+i+"\r\n");
        }
        fw.close();
    }
}

New features of JDK7

JDK7的新特性
在try的后边可以增加一个(),在括号中可以定义流对象
那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,不用写finally
格式:
    try(定义流对象;定义流对象....){
        可能会产出异常的代码
    }catch(异常类变量 变量名){
        异常的处理逻辑
    }
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo02JDK7 {
    
    
    public static void main(String[] args) {
    
    
        try(//1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
            FileInputStream fis = new FileInputStream("c:\\1.jpg");
            //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
            FileOutputStream fos = new FileOutputStream("d:\\1.jpg");){
    
    

            //可能会产出异常的代码
            //一次读取一个字节写入一个字节的方式
            //3.使用字节输入流对象中的方法read读取文件
            int len = 0;
            while((len = fis.read())!=-1){
    
    
                //4.使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
                fos.write(len);
            }

        }catch (IOException e){
    
    
            //异常的处理逻辑
            System.out.println(e);
        }
    }
}

3 Properties collection

concept

1. java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v>
	Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
2. Properties集合是一个唯一和IO流相结合的集合
    可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
    可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用

3. 属性列表中每个键及其对应值都是一个字符串。
    Properties集合是一个双列集合,key和value默认都是字符串

Use setProperty to add data to the collection

使用Properties集合存储数据,遍历取出Properties集合中的数据
Properties集合是一个双列集合,key和value默认都是字符串
Properties集合有一些操作字符串的特有方法
   Object setProperty(String key, String value) 调用 Hashtable 的方法 put。
   String getProperty(String key) 通过key找到value值,此方法相当于Map集合中的get(key)方法
   Set<String> stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keySet方法
private static void show01() {
    
    
    //创建Properties集合对象
    Properties prop = new Properties();
    //使用setProperty往集合中添加数据
    prop.setProperty("zyx","168");
    prop.setProperty("zx","165");
    prop.setProperty("top","160");
    //prop.put(1,true);

    //使用stringPropertyNames把Properties集合中的键取出,存储到一个Set集合中
    Set<String> set = prop.stringPropertyNames();

    //遍历Set集合,取出Properties集合的每一个键
    for (String key : set) {
    
    
        //使用getProperty方法通过key获取value
        String value = prop.getProperty(key);
        System.out.println(key+"="+value);
    }
}

Method store

 可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
     void store(OutputStream out, String comments)
     void store(Writer writer, String comments)
     参数:
         OutputStream out:字节输出流,不能写入中文
         Writer writer:字符输出流,可以写中文
         String comments:注释,用来解释说明保存的文件是做什么用的
                 不能使用中文,会产生乱码,默认是Unicode编码
                 一般使用""空字符串

     使用步骤:
         1.创建Properties集合对象,添加数据
         2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
         3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
         4.释放资源
 private static void show02() throws IOException {
    
    
        //1.创建Properties集合对象,添加数据
        Properties prop = new Properties();
        prop.setProperty("zyx","168");
        prop.setProperty("zx","165");
        prop.setProperty("top","160");

        //2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
        //FileWriter fw = new FileWriter("09_IOAndProperties\\prop.txt");

        //3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
        //prop.store(fw,"save data");

        //4.释放资源
        //fw.close();

        prop.store(new FileOutputStream("09_IOAndProperties\\prop2.txt"),"");
    }

Method load

可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用
    void load(InputStream inStream)
    void load(Reader reader)
    参数:
        InputStream inStream:字节输入流,不能读取含有中文的键值对
        Reader reader:字符输入流,能读取含有中文的键值对
    使用步骤:
        1.创建Properties集合对象
        2.使用Properties集合对象中的方法load读取保存键值对的文件
        3.遍历Properties集合
    注意:
        1.存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他符号)
        2.存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
        3.存储键值对的文件中,键与值默认都是字符串,不用再加引号
//方法体:
    private static void show03() throws IOException {
    
    
        //1.创建Properties集合对象
        Properties prop = new Properties();
        //2.使用Properties集合对象中的方法load读取保存键值对的文件
        prop.load(new FileReader("09_IOAndProperties\\prop.txt"));
        //prop.load(new FileInputStream("09_IOAndProperties\\prop.txt"));
        //3.遍历Properties集合
        Set<String> set = prop.stringPropertyNames();
        for (String key : set) {
    
    
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);
        }
    }

Guess you like

Origin blog.csdn.net/TOPic666/article/details/107966030