【Java基础】IO流(2) —— 字符流

【Java基础】IO流(1) —— 简介
【Java基础】IO流(2) —— 字符流
【Java基础】IO流(3) —— 字节流
【Java基础】IO流(4) —— 转换流、打印流
【Java基础】IO流(5) —— 序列流、内存流
【Java基础】IO流(6) —— 随机访问文件流、数据流

字符流

文件流

文件输出流

FileWriter

write(String str)

文件输入流

FileReader

从文本文件中读取数据:因为是文本文件所以使用字符流,又因为是读取,所以使用字符读取流

因为是文件,所以使用Reader的子类FileReader

int read( ) 一次读一个字符
int read(char [] arr) 返回的是读取的字符的个数

复制文件

import java.io.*;
class Demo9{
	public static void main(String[] args){
		FileWriter fw=null;
		FileReader fr=null;
		try{
			fr=new FileReader("Demo3.java");
			fw=new FileWriter("Demo3_copy.java");
			char[] arr=new char[1024];
			int num;
			while((num=fr.read(arr))!=-1){
				fw.write(arr,0,num);
			}
		}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();
				}
		}
		System.out.println("Hello World!");
	}
}

字符缓冲流

是为了提高读或写的效率,缓冲流本身不具备读或写的功能,使用缓冲流必须结合读流写流使用。

BufferedReader(Reader r):字符缓冲输入流
BufferedWriter(Writer w):字符缓冲输出流

字符缓冲输出流

newLine() 跨平台的写入换行符

//使用字符缓冲输出流向文本文件中输出数据
//1. 创建文件输出流对象和文件向关联
FileWriter fw=new FileWriter("tt.txt");
//2. 为了提高输出效率,使用字符缓冲输出流
//把需要提高效率的输出流对象作为参数传递给
BufferedWriter bw=new BufferedWriter(fw);
for (int i=1;i<=3;i++)
{
	bw.write("abc"+i);
	bw.newLine();
	bw.flush();
}
bw.close();//关闭缓冲流其实就是关闭写入流
字符缓冲输入流

readLine() 一次读一行,返回的一行不包括换行符

//使用字符缓冲输入流实现读取文本文件
//1. 创建文件读取流对象和文件相关联
FileReader fr=new FileReader("tt.txt");
//2.为了提高读的效率,把文件读取流对象作为参数传递给BufferedReader
BufferedReader br=new BufferedReader(fr);
String line=null;
while ((lin=br.readLine())!=null){
	System.out.println(line);
}
br.close();

行号LineNumberReader

FileReader fr=new FileReader("tmp.txt");
LineNumberReader bnr =new LineNumberReader(fr);
String line=null;
while((line=bnr.readLine())!=null){
   System.out.println(bnr.getLineNumber()+":"+line);
}
bnr.close();
模拟

模拟BufferedReader,自定义一个MyBufferedReader
提高效率,提供一个缓冲区

class MyBufferedReader{
	private char[] arr=new char[1024]; //缓冲区
	private int index; //记录缓冲区使用的下标
	private int count; //记录缓冲区中字符的个数
	private Reader r;  //具备读功能的流
    MyBufferedReader(Reader r){
		this.r=r;
	}
	//一次读一个字符的功能
	public int myRead()throws IOException{
		//判断缓冲区中是否有字符
		if(count==0){
			//读取一批
			count = r.read(arr);
            index=0;
		}
		if(count<0)
			return -1;
		int num = arr[index];
		index++;
		count--;
		return num;
	}
	//一次读一行的功能
	public String myReadLine()throws IOException{
		//反复调用一次读一个字符的功能,当够一行时返回
		StringBuilder sb=new StringBuilder();
		int num;
		while((num=myRead())!=-1){
			if(num=='\r')
				continue;
			else if(num=='\n')
				return sb.toString();
			else
				sb.append((char)num);
		}
		return null;
	}
	public void myClose()throws IOException	{
		r.close();
	}
}

class Demo1 {
	public static void main(String[] args) throws IOException{
		FileReader fr=new FileReader("tmp.txt");
		MyBufferedReader mbr=new MyBufferedReader(fr);
		String line=null;
		while((line=mbr.myReadLine())!=null){
			System.out.println(line);
		}
        mbr.myClose();
	}
}
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值