IO(字符流)+属性集+缓冲流

字符流:
字节流读取文本文件时,可能会遇到一些小问题,就是遇到中文字符时,可能不会显示完整的字符,因为一个中文字符可能占用多个字节储存,所以 Java 提供了 一些字符流类,以字符作为单位读写数据,专门用于处理文本文件
一个中文:GBK 占用两个字节,UTF-8占用三个字节

flush 方法和 close 方法的区别
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了

续写:

FileWriter(String filename, boolean append)
FileWriter(File file, boolean append)`

JDK1.7之前使用 try catch finally 处理流中的异常

public class Deno01TryCatch{
     
    public static void main(String[] args){
     
        //提高变量fw的作用域,让finally可以使用
        //变量在定义的时候,可以没有值,但是使用的时候必须有值
        //fw = new FileWriter("Demo\\t.txt",true);执行失败fw.close会报错
        FileWriter fw = null;
        try{
     
            //可能会出现异常的代码
            fw = new FileWriter("Demo\\t.txt",true);
            for(int i = 0;i<10;i++){
     
                fw.write("Hello"+i+"\r\n");
            }
        }catch(IOException e){
     
            //异常的处理逻辑
            System.out.println(e);
        }finally{
     
            //一定会指定的代码
            //创建对象失败了,fw的默认值就是null,
            //不能调用方法,会抛出空指针异常
            //需要增加一个判断,不是把空资源释放
            if(fw!=null){
     
                try{
     
                //fw.close方法声明抛出了IOException异常对象
                //要么throws,要么try catch
                fw。close();
                }catch(IOException e){
     
            //异常的处理逻辑
            e.printStackTrace();
                }
            }
        }
    }
}

JDK7的新特性
在try的后边可以增加一个(),在括号里可以定义流对象
那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,不用写finally
格式:
try(定义流对象;定义流对象...){
     \
    可能会出现异常的代码
}catch(异常类变量 变量名){
     
    异常的处理逻辑
}
public class Demo{
     
   public static void main(String[] args){
     
        try{
     //1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
            FileInputStream fis = new FileInputStream("c:\\1.jdg");
            //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
            FileOutputStream fos = new FileOutputStream("d:\\1.jdg");
            //一次读取一个字节写入一个字节的方式
            //3.使用字节输入流对象中的方法read读取文件
            int len = 0;
            while((len=fis.read())!=-1){
     
                //使用字节输出流中的方法write,把读取到的字节写入到目的地文件中
                fos.write(len);
            }
        }catch(IOException e){
     
            //异常的处理逻辑
            System.out.println(e);
        }
        //fos.write(1);//Stream Closed
    }
}

十五、属性集
Properties extends Hashtable implements Map
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
Properties 集合是唯一和 IO 流相结合的集合
可以使用 Properties 集合中的方法 store ,把集合中的临时数据,持久化写入到硬盘中存储
可以使用 Properties 集合中的方法 load ,把硬盘中保存的文件(键值对),读取到集合中使用
属性列表中每个键及其对应值都是一个字符串
Properties 集合是一个双列集合,key 和 value 默认都是字符串

Object setProperty(String key, String value)调用 Hashtable 的方法 put
String getProperty(String key) 通过 key 找到 value 值,此方法相当于 Map 集合中的 get(key)
Set stringPropertyName() 返回此属性列表中的键集,其中该键及其对应值是字符串此方法相当于 Map 集合中的 keySet 方法

注意:
1.存储键值对的文件中,键与值默认的连接符号可以使用 = ,空格(其他符号)
2.存储键值对的文件中,可以使用 # 进行注释,被注释的键值对不会再被读取
3.存储键值对的文件中,键与值默认都是字符串,不用再加引号

十六、缓冲流
BufferedOutputStream extends OutputStream
BufferedOutputStream:字节缓冲输出流

BufferedInputStream extends InputStream
BufferedInputStream:字节缓冲输入流

BufferedWriter extends Writer
BufferedWriter:字符缓冲输出流
特有成员方法:
void newLine( ) 写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符

BufferedReader extends Reader
BufferedReader:字符缓冲输入流
特有成员方法:
String readLine( ) 读取一个文本行。读取一行数据
行的中止符号:通过下列字符之一即可认为某行已终止:换行(‘\n’)、回车(’\r’)或回车后直接跟着换行(\r\n)
返回值:
包含该行内容的字符串,不包含任何终止符,如果已达流末尾,则返回null

你可能感兴趣的:(java)