您的位置:首页 > 职场人生

【黑马程序员】----Java 基础之 IO流__字符流

2015-04-09 09:46 176 查看
Java中的IO流,在平时也是很常用的一个类,IO流包括四个基类,InputStream,OutputStream,Reader,Writer,前两个为字节流的读写操作类,后两个是字符流的读写操作类,字符流的出现可以有效解决数据在读写过程中的编码转换问题。

下面根据毕老师的讲解,从不同角度总结IO的使用方法:

一、Reader && Writer

1、FileWriter,从字面上可以看出,这个是Writer的一个子类,看下具体用法

<span style="white-space:pre">		</span>//先引用
FileWriter fw = null;
try {
//再实例化,数据IO流,肯定需要制定操作的数据,写文件,肯定也要制定待操作的文件
//注意,如果指定的文件已存在,该方法会覆盖源文件内容
fw = new FileWriter("E:\\test.txt");
fw.write("黑马程序员");
} catch (IOException e) {
e.printStackTrace();
}finally{
//使用完IO流,一定记得要关闭,所以放在finally代码块中处理
try {
//此处值得注意的是,如果fw在实例化的过程中出错,如硬盘未找到,则实例化会失败,fw对象为null
//此处再执行close时会空指针异常,所以要先进行判断
if(fw != null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//结果: 在E盘下创建了test.txt文件,文件内容为“黑马程序员”
2、文件的追加读写

上一种文件的写入方式很直观且很便捷,但是有一个很明显的问题就是,如果文件已经存在,它会暴力的覆盖掉原内容,这时就引入了另外一个问题,文件的追加读写。仔细看FileWriter的构造函数,可以添加一个参数,是否在末尾进行数据追加,那么就简单了:

//其他步骤不变,仅添加true参数
fw = new FileWriter("E:\\test.txt",true);
fw.write(",我来了");
//结果: test.txt文件未被覆盖,末尾追加了,我来了
3、文件的读取

3.1 FileReader , 字符读取的便捷类,先将上次写好的文件内容读取出来

FileReader fr = null;
try {
//创建文件读取流对象,并制定文件路径,需要确保文件存在,否则会抛文件不存在异常
fr = new FileReader("E:\\test.txt");
int r = 0;
//注意read(),每次只读取一个字符,且是依次读取,当读到末尾时返回-1
while((r=fr.read()) != -1){
System.out.print((char)r);
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(fr != null){
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3.2 通过字符数组读取

read(byte[] bt);  这种方法是将数据读取到byte[]数组中,返回的读取到的字符个数,读取到末尾时返回 -1 .

case: 将D盘下的一个txt文件copy到E盘下。

原理: 先读取D盘下的文件,然后再写入到E盘,使用FileReader、FileWriter

//创建Reader
FileReader fr = null;
//创建Writer
FileWriter fw = null;
try {
fr = new FileReader("E:\\test.txt");
fw = new FileWriter("E:\\test1.txt");
//先读取文件,存储在内存中,然后再写入文件,可以提高效率
char[] buffer = new char[1024];
int len = 0; //读取到的长度
while((len = fr.read(buffer)) != -1){
fw.write(buffer,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr != null){
try {
//关闭流
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fw != null){
try {
//关闭流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、BufferedWriter && BufferedReader

提高效率之 字符流缓冲区。 缓冲区的出现是为了提高流的操作效率的,因此在创建缓冲区之前必须先有流对象。

 1、BufferedWriter 的用法

try {
//创建写入流
FileWriter fw = new FileWriter("E:\\test2.txt");
//创建缓冲区,将写入流作为参数传入即可
BufferedWriter bfw = new BufferedWriter(fw);
bfw.write("你好,黑马");
//用到缓冲区,就要刷新
bfw.flush();
//关闭缓冲区就关闭了流
bfw.close();

} catch (IOException e) {
e.printStackTrace();
}
注意点: 在循环写数据时,最好写一次flush一次; 跨平台换行符  newLine();

2、BufferedReader的用法

try {
//创建读写流
FileReader fr = new FileReader("E:\\test2.txt");
//创建缓冲区
BufferedReader br = new BufferedReader(fr);
String back = "";
//readLine会读取一行,读取到数据末尾时返回null
while((back = br.readLine()) != null){
System.out.println(back);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

注意点: 缓冲区一定要关闭,可以在finally代码块中进行关闭,也要进行非空判断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐