黑马程序员——java基础知识篇——>IO流

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一、概述

特点:

        a、IO流用来处理设备之间的数据传输。

        b、Java对数据的操作是通过流的方式。

        c、Java用于操作流的对象都在IO包中。

        d、流按操作数据分为两种:字节流和字符流。

        e、流按流向分为:输入流和输出流。

IO流的常用基本类:

        1 字节流:InputStreamOutputStream

        2 字符流:ReaderWriter

写方法展示

public class FileWriterDemo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件
		//而且该文件会被创建到指定("d:\\demo.txt")目录下,如果该目录下已经有同名文件,则该文件将被覆盖
			//其实该步骤就是在明确数据要存放的目的地
		FileWriter fw = new FileWriter("demo.txt");
		//调用write方法,将字符串写入到流中
		fw.write("abcde");
		//刷新流对象中缓冲中的数据;将数据刷新到目的地
		fw.flush();
		//关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。
		//将数据刷新到目的地中
		//和flush区别:flush刷新后可以继续使用;close刷新后会将流关闭
		fw.close();	//关闭前会刷新一次,把数据刷新出来		
	}
}
读方法展示

public class FileReaderDemo {
	public static void main(String[] args)throws IOException {
		FileReader fr = new FileReader("e:\\demo.txt");
	//第一种读取方式
/*		int ch=0;
		while((ch=fr.read())!=-1){
			System.out.println((char)ch);
		}*/
	/*	while(true){
			int ch=fr.read();
			if(ch==-1)
				break;
			System.out.println((char)ch);
			}
			*/
	//第二种读取方式
		//	FileReader fr = new FileReader("e:\\demo.java"); //这是读取java文件方式
		char[] buf = new char[1024];
		int num = 0;
		while((num = fr.read(buf))!=-1){
			System.out.println(new String(buf,0,num));
		
		}
		fr.close();//这里的close只有关闭的作用
	}
}
流的异常处理方式

public class FileWriterException {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileWriter fw = null;
		try {
			fw = new FileWriter("e:\\demo.txt",true);//这里传递一个参数true代表不覆盖已有文件,并在已有文件末尾进行续写
			fw.write("\r\npoiu");					//这里续写
		} catch (IOException e) {
			System.out.println(e.toString());
		} finally {
			try {
				if (fw != null)	//为什么是不等于null,因为fw如果为null关闭不了资源,只有fw有资源才能关闭
					fw.close();
			} catch (IOException e) {
				System.out.println(e.toString());
			}
		}
	}
}
为了增加读写数据效率加入缓冲区BufferedReader和BufferedWriter

以示例方式进行展示:复制文件

public class BufferedCopy {
	public static void main(String[] args) {
		BufferedReader bufr = null;
		BufferedWriter bufw = null;
		try{
			bufr = new BufferedReader(new FileReader("e:\\buf.txt"));
			bufw = new BufferedWriter(new FileWriter("e:\\buf_copy.txt"));
			String line = null;
			while((line=bufr.readLine())!=null){
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}
		}
		catch(IOException e){
			throw new RuntimeException("复写失败");
		}
		finally{
			try{
				if(bufr!=null)
					bufr.close();
			}
			catch(IOException e){
				throw new RuntimeException("读取关闭失败");
			}
			try{
				if(bufw!=null)
					bufw.close();
			}
			catch(IOException e){
				throw new RuntimeException("写入关闭失败");
				
			}			
		}
	}
}

单读取流的示例:行读取

public class BufferedReaderDemo {
	public static void main(String[] args)throws IOException {
		FileReader fr = new FileReader("e:\\buf.txt");
		BufferedReader bufr = new BufferedReader(fr);
		//循环读取数据
/*		char[] chs = new char[1024];
		int len = 0;
		while((len=bufr.read(chs))!=-1){
			System.out.println(new String(chs,0,len));
		}
		bufr.close();
		*/
		//单行读取数据
		String line = null;
		while((line=(bufr.readLine()))!=null){
			System.out.println(line);
		}
		bufr.close();
	}
}

BufferedWriter特有的方法换行示例

public class BufferedWriteDemo {
	public static void main(String[] args)throws IOException {
		//创建一个字符写入流对象
		FileWriter fw = new FileWriter("e:\\buf.txt");
		//为了提高字符写入流的效率,加入了缓冲技术
		//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
		BufferedWriter bufw = new BufferedWriter(fw);
		for(int x=1;x<5;x++){
			bufw.write("abc"+x);
			bufw.newLine();			//换行
			bufw.flush();			//只要用到缓冲区就要刷新
		}
		//关闭缓冲区就是在关闭缓冲区的流对象
		bufw.close();
	}
}
LineNumberReader将读取的java文件加入行

public class LineNumberReaderDemo {
	public static void main(String[] args){
		
		FileReader fr = null;
		LineNumberReader lnr = null;
		try{
			fr = new FileReader("e:\\MathDemo.java");
			lnr = new LineNumberReader(fr);
		
		String line=null;
		lnr.setLineNumber(100);				//设定行号从100开始
		while((line=lnr.readLine())!=null){
			System.out.println(lnr.getLineNumber()+":"+line);
			}
		}
		catch(IOException e){
			System.out.println("erro");
		}
		finally{								//不能忘了finally
		try{
			lnr.close();
		}
		catch(IOException e){
			System.out.println("关闭失败");
			}
		}	
	}
}
根据LineNumberReader自己写一个程序模仿功能

class MyLineNumReader {
	private Reader fr;
	private int lineNumber = 0;

	MyLineNumReader(Reader fr) {
		this.fr = fr;
	}
	
	public int getLineNumber() {
		return lineNumber;
	}

	public void setLineNumber(int lineNumber) {
		this.lineNumber = lineNumber;
	}

	public String MyLineNumber() throws IOException {
		StringBuilder sb = new StringBuilder();
		int ch = 0;
		lineNumber++;		//读一行才自增,所以放在while外面
		while ((ch = fr.read()) != -1) {

			if (ch == '\r')
				continue;
			if (ch == '\n')
				return sb.toString();
			else
				sb.append((char) ch);
		}
		if (sb.length() != 0)
			return sb.toString();
		return null;
	}

	public void MyClose() throws IOException {
		fr.close();
	}
}

public class MyLineNumberReader {
	public static void main(String[] args) throws IOException {
		FileReader fir = new FileReader("e:\\mm.java");
		MyLineNumReader ml = new MyLineNumReader(fir);
		String line = null;
		ml.setLineNumber(100); // 设置行号
		while ((line = ml.MyLineNumber()) != null) {
			System.out.println(ml.getLineNumber() + ":" + line);
		}
		ml.MyClose();
	}
}


-----------android培训java培训、java学习型技术博客、期待与您交流!------------  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值