java IO流一 (字符流)

/*一,FileWriter
 *1.字节流的两个基类
 *Inputstream
 *OutputStream
 * 字符流的两个基类
 *Reader
 *Writer
 *如果操作文字数据,优先字符流

*实例

import java.io.FileWriter;
import java.io.IOException;
public class 字符流 {
	public static void main(String []args) throws IOException {
		//创建FileWriter实例对象,若此对象已经存在,则覆盖其中内容,如果文件不存在则创建文件
		FileWriter file=new FileWriter("demo1.txt",true);
		//数据写入被临时存储到流中,临时存储缓冲区
		file.write("haaavcasfcsdfsfdsfdsf");
		//进行刷新将字符写入到目标文件中
		file.flush();//刷新该流的缓冲,立即将缓冲区中的数据存储的目标文件中
		 //关闭此流后不再进行操作,在关闭前会调用flush刷新缓冲中的数据到目标文件
		file.close();//关闭流,将无法再进行一系列的流操作
		
	}
}

2.细节(换行,续写)
 *FileWriter file=new FileWriter("demo1.txt",true);//续写构造方式,在原来文件不改变的情况下,添加内容
 *file.writer("aaaaa\r\nbbbbbbbbb");//windows系统中的换行
  *另一种适用于所有操作系统的换行方式
  *定义:private static final String LINE_SEPARATOR=System.getProperty("line.separator");

*实例

import java.io.FileWriter;
import java.io.IOException;
public class 字符流 {
	private static final String LINE_SEPARATOR=System.getProperty("line.separator");
	public static void main(String []args) throws IOException {
		//向已经存在的demo1.txt文件中续写
		FileWriter file=new FileWriter("demo1.txt",true);
		//续写并且实现了换行
		file.write("haaavcasfcsdfsfdsfdsf"+LINE_SEPARATOR+"zhaozhaozhaio");
		file.close();
		
	}
}

3.IO异常处理

import java.io.FileWriter;
import java.io.IOException;
public class 字符流 {
	private static final String LINE_SEPARATOR=System.getProperty("line.separator");
	public static void main(String []args) {
		
		FileWriter file=null;//try的外面创建流引用
		try {
			file = new FileWriter("c://demo1.txt");//由与不存在该文件,抛出FileNotFoundException异常
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			file.write("haaavcasfcsdfsfdsfdsf"+LINE_SEPARATOR+"zhaozhaozhaio");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			file.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			if(file!=null)
			try {
				file.close();
			} catch (IOException e) {
				throw new RuntimeException("关闭失败");
			}//此处可能出现空指针异常
		}
	}
}

*/

/*二,FileReader
 * 1.读取方式一(读取单个字符)
 * (1)用于读取字符文件的便捷类
 * (2)使用read读取文件内容时, 若读取结束返回-1

*实例:

import java.io.*;

public class 字符流
{
	public static void main(String[]args) throws IOException {
		//创建读取字符对象的流对象,在创建读取流对象时,必须确定该文件是存在的
		FileReader file=new FileReader("demo1.txt");
		int num;
		while((num=file.read())!=-1) {
			System.out.print((char)num);
		}
		file.close();
	}
}

*2,读取方式二(读取字符数组)
 *(1)使用read(char[]arr)读取文本数据
 *(2)读取过程中, 将字符存储到字符数组数组,返回读取的字符的个数,如果返回值为-1则表明已经读取完成
 *

import java.io.*;

//i//mport com.sun.org.apache.bcel.internal.generic.NEW;
public class  字符流
{
	public static void main(String  []args) throws IOException {
		//建立FileWriter实例对象
		FileReader file=new FileReader("demo1.txt");//该文件中存储的内容为"aabbcc"
		//创建字符数组
		char  []s=new char[4]; 
		int num = file.read(s);//返回读取个数,此时已经读取完前四个
		System.out.println(num);//输出为4
		System.out.println(new String(s));//输出为aabb
		int num1 = file.read(s);//返回读取的个数
		System.out. println(num1);//输出为2,因为第一次读取已经读取完前四个
		System.out.println(new String(s));//输出为ccbb第一次读取完成后s为aabb第二次读取读取到两个字符,前两个字符被新读取的字符取代
		int num2=file.read(s);
		System.out.println(num2);输出为-1,因为所有的字符已经被读取
		System.out.println(new String(s));//输出为ccbb因为没有新的字符读入
		FileReader file1=new FileReader("demo2.txt");//该文件中存储的内容为"aabbcc"
		//创建字符数组
		char []ss=new char[4];
		int len=0;
		while((len=file1.read(ss))!=-1) {
			System.out.println(len);
			System.out.println(new String(ss,0,len));
		}
	}
}


 * */

/*三,练习:将e盘中的数据写入到d盘中
 * 1.读取方式一(按字符读入,读出)

*代码

public class 字符流
{
	public static void main(String []args) throws IOException {
			FileReader filein=new FileReader("E:\\ACM入门习题一百道.doc");//文件读取源
			FileWriter fileout=new FileWriter("D:\\Hello.java");//创建数据存储目的地
			int id=0;
			while((id=filein.read())!=-1) {
				fileout.write((char)id);
			}//进行数据存储
			filein.close();//关闭输入流
			fileout.close();//关闭输出流
	}
}

*2.读取方式二(按照字符串读入,读出·)

*代码

public class 字符流
{
	public static void main(String []args) throws IOException {
		FileReader filein=null;
		FileWriter fileout=null;
		try {
			filein=new FileReader("E:\\ACM入门习题一百道.doc");
			fileout=new FileWriter("D:\\Hello.java");
		}catch(IOException e){
			System.out.println("无法找到文件");
		}
		int len=0;
		char []s=new char[1024];
		try {
			while((len=filein.read(s))!=-1) {
			fileout.write(s);	
			}	
		}catch(IOException e) {
			System.out.println("文件读取过程异常");
		}finally {
			try {
				filein.close();
				fileout.close();
			}catch(IOException e) {
				System.out.println("流关闭异常");
			}
		}
	}
}

*/

/*四,缓冲流的使用
 * 1.字符流的缓冲区(处理流)
 * (1).对于读写都有缓冲
 * (2).提高了对数据读写效率
 * (3).对应类
 * BufferedWriter
 * BufferedReader
 * (4).缓冲区要结合流才能使用,在流的基础上对流的功能进行了增强
 * 2.BufferedWriter
 * (1)将文本写入字符输出流,缓冲各个字符,从而提供的单个字符,数组,字符串的高效写入,可以指定缓冲区大小,通常默认情况下就足够
 * (2)BufferedWriter(Writer out)//创建一个默认大小输出缓冲区的缓冲字符输出流,out为被缓冲对象
 *    BufferedWriter(Writer out,int size)//创建一个指定大小输出缓冲区的缓冲字符输出流
 * (3)代码

public class 字符流
{
	private static final String LINE_SEPERATOR = System.getProperty("line.separator");//换行

	public static void main(String []args) throws IOException {
	FileWriter file=new FileWriter("Buffered.txt");
		//为了提高写入效率,使用字符流的缓冲区
	BufferedWriter buffout=new BufferedWriter(file);//仅仅提到了提高效率的作用
	//使用缓冲区的方法对数据进行一系列操作能够大大提高效率
	buffout.write("aaahahahahah");
	buffout.newLine();//缓冲输出流的换行函数
	buffout.write("haheihei");
	buffout.write("sdsdsadsadsadsadsa"+LINE_SEPERATOR+"hahahahah");//将数据写入到缓冲区中
	for(int i=0;i<5;i++) {
		buffout.write("aaaaaaaaaa"+"............."+i);
		buffout.newLine();
		buffout.flush();
	}
	buffout.flush();//刷新缓冲区的内容,把数据全部存储到目标文件中
	buffout.close();//关闭缓冲区
	//file.write(1);buffout关闭,file流也会关闭,缓冲流的关闭底层是通过关闭file流实现的
	}
}

*3.BufferedReader
 *(1)从字符流中输入文本,缓冲各字符,从而实现字符,数组,行的高效读取
 *(2)readLine()

*(3)代码

public class 字符流
{
	public static void main(String []args) throws IOException  {
		FileReader fileReader=new FileReader("Buffered.txt");
		BufferedReader fileBufferedReader=new BufferedReader(fileReader);
		int len=0;
		String string=null;
		while((string=fileBufferedReader.readLine())!=null) {
			System.out.println(string);//每次读一行
		}
		fileBufferedReader.close();
	}
}

*4.文本复制

public class 字符流
{
	public static void main(String []args) throws IOException {
		FileWriter fileWriter=new FileWriter("out.txt");
		BufferedWriter fileBufferedWriter=new BufferedWriter(fileWriter);
		FileReader fileReader=new FileReader("in.txt");
		BufferedReader fileBufferedReader=new BufferedReader(fileReader);
//		int ch=0;
//		while((ch=fileBufferedReader.read())!=-1) {
//			fileBufferedWriter.write((char)ch);
//		}
		String ssString=null;
		while((ssString=fileBufferedReader.readLine())!=null) {
			fileBufferedWriter.write(ssString);
			fileBufferedWriter.newLine();
		}
		fileBufferedReader.close();
		fileBufferedWriter.close();
	}
}

*5.自定义MyBufferedReader的read方法
 * (1)自定义缓冲区模拟BufferedReader
 * (2)代码实现
 * (3)代码

public class 字符流
{
	private static final String LINE_SEPERATOR = System.getProperty("line.separator");//换行
	public static void main(String []args)throws IOException {
		FileReader reader=new FileReader("in.txt");
		MyBufferedReader bufferedReader=new MyBufferedReader(reader);
//		int ch=0;
//		while((ch=bufferedReader.Myread())!=-1) {
//			System.out.println((char)ch);
//		}//每次读取一个字符
		//每次读取一行
		String string=null;
		string=bufferedReader.MyreadLine();
		System.out.print(string);
		string=bufferedReader.MyreadLine();
		System.out.print(string);
		string=bufferedReader.MyreadLine();
		System.out.print(string);
		string=bufferedReader.MyreadLine();
		System.out.print(string);
		bufferedReader.Myclose();
	}
}
class MyBufferedReader
{
	private static final String LINE_SEPERATOR = System.getProperty("line.separator");//换行
	//缓冲原理:将数据暂时存储到数组里,使用时再取出,
	//定义一个reader对象
	private Reader reader;
	//定义一个字符数组作为缓冲区
	private char[]buff=new char[1024];
	//记录当前缓冲数组已到达哪个位置,当操作到最后一个元素后,归零
	private int pos=0;
	//计数器,记录缓冲区中的数据个数,当该数据为零时,从源中继续获取数据到缓冲区中
	private int count=0;
	public MyBufferedReader(Reader reader) {
		this.reader=reader;
	}
	//读取单个字节,从缓冲区中获取
	public int Myread() throws IOException {
		if(count==0) {
			//缓冲区中没有数据时,获取数据
		count=reader.read(buff);
	//	System.out.println("buff..........."+count);
		//每次获取数据到缓冲去pos=0
		pos=0;
		}
		if(count<0)
			return -1;
		//每获取一个字符pos++,count--
		char c=buff[pos];
		pos++;
		count--;
		return c;
	}
	//读取一行
	public String MyreadLine() throws IOException {
		//储存一行的数据,暂时存储在StringBuilder
		StringBuilder stringBuilder=new StringBuilder();
		int ch=0;
		int flag=0;
		while((ch=Myread())!=-1) {
			//遇到换行则说明已经读一行
			if((char)ch=='\r') {
				flag=1;
			}
			if((char)ch=='\n'&&flag==1) {
				return stringBuilder.toString();
			}
			stringBuilder.append((char)ch);
		}
		if(stringBuilder.length()!=0)
			return stringBuilder.toString();
		return null;
	}
	public void Myclose() throws IOException{
		reader.close();
	}
}


 * */ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值