黑马程序员——IO流(一)

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


-IO流的有关类

字节流:InputStream, OutputStream

    FileInputStream, FileOutputStream // BufferedInputStream, BufferedOutputStream 

    PrintWriter类:向文本输出流打印对象的格式化表示形式。此类实现在PrintStream 中的所有print 方法。它不包含用于写入原始字       节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。

字符流:Reader, Writer

    FileReader, FileWriter // BufferedReader, BufferedWriter

转换流:InputStreamReader, OutputStreamWriter


-学习FileWriter

package day18_IO;

import java.io.FileWriter;
import java.io.IOException;

/**
 * 学习FileWriter,注意异常产生的原因和正确关闭资源的书写方法
 * @author Administrator
 */
public class Day18_08_IOException {
	public static void main(String[] args) {
		
		//在 代码块 外部建立用,代码块内部实例化创建
		FileWriter fw = null;
		try {
			fw = new FileWriter("demo.txt");
			fw.write("aaaaa");
		} catch (IOException e) {
			//e.printStackTrace();
			System.out.println("catch: "+e.toString());
		} finally {
			if(fw!=null)
				try {
					fw.close();
				} catch (IOException e) {
					//e.printStackTrace();
					System.out.println("catch: "+e.toString());
					throw new RuntimeException("写入资源关闭失败");
				}
		}
	}
}

FileWriter的常用方法:fw.writer();  fw.flush();  fw.close();

注意点:1、一创建FileWriter对象就要指定要操作的源(默认覆盖已存在同名的文件)

    2、为什么要flush方法,与close方法有什么区别。

    3、文件的续写(不覆盖) FileWriter fw = new FileWriter("文件名",true);,换行\r\n

    4、换行:Windows系统下(\r\n);Linux系统下(\n)


-学习FileReader

文件读取方式一:

FileReader fr = new FileReader("demo.txt");

int ch = 0;

//read()方法一次读一个字符,而且会自动往下读

while((ch= fr.read())!=-1){

System.out.print((char)ch);//强转为字符型输出

}

文件读取方式二:

FileReader fr = new FileReader("demo.txt");

//定义一个字符数组

char[] cbuf = new char[1024];

int count = 0;

while((count=fr.read(cbuf))!=-1){

System.out.println(new String(cbuf,0,count));

}


-有关FileWriter 和 FileReader 操作的练习

package day18_IO;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 通过copy练习,熟悉IO流中FileWriter与FileReader类的写法操作
 * @author Administrator
 */
public class Day18_13_CopyPractice2 {
	
	static FileWriter fw = null;
	static FileReader fr = null;
	
	public static void main(String[] args) {
		//copy_1();
		copy_2();
	}
	
	//读一个字符,复制一个字符
	public static void copy_1(){
		
		try {
			fw = new FileWriter("copydemo.txt");
			fr = new FileReader("demo.txt");
			int ch = 0;
			while((ch=fr.read())!=-1){
				fw.write(ch);
			}
			System.out.println("复制成功");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("复制失败");
		} finally {
			colseResource();
		}
	}
	
	//通过字符数组进行复制
	public static void copy_2(){
		try {
			fw = new FileWriter("copydemo2.txt");
			fr = new FileReader("demo.txt");
			char[] buf = new char[1024];
			int len = 0;
			while((len=fr.read(buf))!=-1){
				fw.write(buf,0,len);
			}
			System.out.println("复制成功");
		} catch (IOException e) {
			System.out.println("复制失败");
			e.printStackTrace();
		} finally {
			colseResource();
		}
	}
	
	//释放资源
	private static void colseResource() {
		if(fr!=null){
			try {
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if(fw!=null){
			try {
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}


-学习缓冲流技术 BufferedWriter 与 BufferedReader

特有方法:newLine(); readLine();

注意:1、readLine()方法返回类型为字符串String类型,read()方法返回的是整数类型。

 2、readLine()方法的返回值并不包含末尾的换行符。


-通过缓冲区技术实现对文本文件的复制

package day19_IO;

import java.io.*;

/**
 * 通过缓冲区技术实现对文本文件的复制
 * 
 * @author Administrator
 *
 */
public class Day19_03_CopyByBuffered {
	
	public static void main(String[] args) {
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		
		try {
			bw = new BufferedWriter(new FileWriter("bufferedCopy.txt"));
			br = new BufferedReader(new FileReader("demo.txt"));
			
			String line = null;
			while((line=br.readLine())!=null){
				bw.write(line);
				bw.newLine();
				//bw.flush();
			}
			
			System.out.println("文件复制成功....");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//释放资源
			try {
				if(br!=null)
					br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(bw!=null)
					bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

-自定义MyBufferedReader类

package day19_IO;

import java.io.FileReader;
import java.io.IOException;

/**
 * 通过理解BuffereReader类中的方法readLine(),学习自己创建一个MyBufferedReader
 * @author Administrator
 *
 */
public class Day19_05_MyBufferedReader {
	private FileReader fr;
	public void MyBufferedReader(FileReader fr){
		this.fr = fr;
	}
	
	public String myBufferedReader() throws IOException{
		//定义一个临时容器,源BufferedReader封装的是字符数组
		//因为最终还是要将数据转换为字符串,我们这里就定义一个StringBuilder容器
		StringBuilder sb = new StringBuilder();
		int ch = 0;
		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;
	}
	//为MyBufferedReader 同样添加一个关闭资源的方法
	public void myClose() throws IOException{
		fr.close();
	}
}


-LineNumberReader类

跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int)getLineNumber(),它们可分别用于设置和获取当前行号。

默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由getLineNumber() 返回的值。

可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。

package day19_IO;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

/**
 * 学习LineNumberReader类
 * 练习:模拟创建一个带行号的缓冲区对象。
 * @author Administrator
 *
 */
public class Day19_09_LineNumberReader {
	public static void main(String[] args) {
		FileReader fr = null;
		LineNumberReader lnr = null;
		try {
			fr = new FileReader("demo.txt");
			lnr = new LineNumberReader(fr);
			String line = null;
			//可以自己设定开始行号
			//lnr.setLineNumber(100);
			while((line=lnr.readLine())!=null){
				System.out.println(lnr.getLineNumber()+": "+line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值