字符流
Reader&FileReader类
java.io.Reader
字符输入流,他是字符输入流的最顶层的父类,定义了一些共性的成员方法。是一个抽象类。
成员方法:
-
int read();
读取单个字符 -
int read(char[] cbuf);
一此读取多个字符 -
void close();
释放资源
java.io.FIleReader extends InputStramReader extends Reader;
FileReader 文件字符输入流
作用:把硬盘中的数据已字符的形式读入到内存中来。
构造方法:
- FileReader(String filename) 参数:文件路径
- FileReader(File file) 参数:文件对象
**作用:**创建FileReader对象,把该对象指向我们要读取的文件。
一、字符输入流使用方法
1.使用步骤:
- 创建FileReader对象。构造方法中绑定数据源。
- 使用read读取文件
- 释放资源
2.实例
public class InCharDemo {
public static void main(String[] args) throws IOException {
FileReader fid1= new FileReader("E:\\learning\\20190222javaee 博学谷\\test\\a.txt");
//一次读入一个字符
int content=0;
while ((content=fid1.read())!=-1){
System.out.print((char)content);
}
fid1.close();
//使用一次读入多个字符
FileReader fid2= new FileReader("E:\\learning\\20190222javaee 博学谷\\test\\a.txt");
int len=0;
char[] chars=new char[2];
while ((len=fid2.read(chars))!=-1){
System.out.print(new String(chars));
}
fid2.close();
}
}
二、字符输出流 Writer&FileWriter
java.io.FileWriteer Extends OutputStreamWirter extends Writer;
FileWriter:文件字符输出流
**作用:**把内存中字符写入到文件中。
**构造方法:**创建一个FileWriter对象,根据传递的参数创建文件,把FileWriter指向该文件。
FileWriter(File file) 根据文件对象创建FileWriter对象。
FileWriter(String filename) 根据文件路径创建FileWriter对象。
1.使用步骤
- 创建FileWriter对象,构造方法中绑定要写入数据的目的地。
- 使用write方法,把数据写入到内存缓冲区中,(字符转换为字节的过程)
- 使用FileWirter中的flush,把内存缓冲区中的数据,刷新到文件中。
- 释放资源(会先把内存缓冲区中的数据刷新到文件中)
2.实例
public class Demo18Writer {
public static void main(String[] args) throws IOException{
FileWriter fit = new FileWriter("E:\\learning\\20190222javaee 博学谷\\test\\a.txt");
fit.write(97);
fit.flush();
fit.close();
}
}
3.flush和close的区别
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源,流对象不能再被使用了。
4.其它方法
字符输出流写数据的其它方法:
void writer(char[] cbuf):写入字符数组
abstract void writer(char[] cbuf,int off,int len)写入字符数组的某一部分,off开始索引,len字符个数
void write(String str) 写入字符串
void write(String str,int off,int len)写入字符串的某一部分,off开始索引,len字符个数
public static void main(String[] args) throws IOException{
FileWriter fit = new FileWriter("E:\\learning\\20190222javaee 博学谷\\test\\a.txt");
fit.write(97);
char[] ch={'1','b','c','d'};
fit.write(ch);
fit.write('\n');
fit.write(ch,0,2);
fit.write('\n');
String str="这是一个字符串测试";
fit.write(str);
fit.write('\n');
fit.write(str,0,3);
fit.write('\n');
fit.flush();
fit.close();
}
}
5.字符输出流的续写和换行
5.1续写
`**FileWriter**(File file, boolean append)`
`**FileWriter**(String fileName, boolean append)`
5.2换行
windows:\r\n
linux:/n
mac:/r
6.IO流异常的处理
try{
可能产生异常的代码;
}catch(IOException e){
异常的处理逻辑;
}finally{
释放资源;
//如果创建对象失败,fw的默认是是null,而null不能调用close();需要加判断fw!=null,继续执行后续内容。
//把变量定义放到try的外部,避免作用域影响。对变量进行初始化赋值(null)。
//fw.close();=此方法也会抛出IOException 异常,需要手动处理此异常。
}
jdk7处理异常的新特性
jdk7新特性:在try的后面可以增加一个(),在括号中定义流对象,那么这个流对象的作用域就在try中有效,try中代码执行完毕,会自动释放流对象,不用谢finally.
try(FileInputStream fis = new FileInputStream("E:\\test\\a.txt");){
可能会产生异常的代码。
}catch(IOException e){处理异常的逻辑。}
jdk9处理异常的新特性
在try前面可以定义流对象,可以在try后面的()中可以直接引入流对象的名称(变量名);在try执行完毕之后,流对象可以释放掉,不写finally.
A a = new A();
B b = new B();
try(a,b){可能会产生异常的代码
}catch(异常变量){
处理异常的方式。
}