字符流:
字节流读取文本文件时,可能会遇到一些小问题,就是遇到中文字符时,可能不会显示完整的字符,因为一个中文字符可能占用多个字节储存,所以 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
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