黑马程序员-day18-IO流(字符流)

------- android培训java培训、期待与您交流! ----------

 IO(Input Output)流
1.IO流用来处理设备之间的数据传输
2.Java对数据的操作是通过流的方式
3.Java用于操作流的对象都在IO包中
4.流按操作数据分为两种:字节流与字符流。  
5.流按流向分为:输入流,输出流。

思考:
为什么会有字符流?

为了解决由不同的编码表读写出现乱码的问题,java在字节流基础上产生了字符流,字符流可以在内部融合编码表,由你来指定编码表。

字节流与字符流
1.字节流:用来处理数据,通用
2.字符流:专门用来编码文字

IO流常用基类
1.字节流的抽象基类:
  InputStream ,OutputStream。
2.字符流的抽象基类:
  Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。

IO程序的书写
1.导入IO包中的类
2.进行IO异常处理
3.在finally中对流进行关闭

思考:
1.有了垃圾回收机制为什么还要调用close方法进行关闭。  
2.为什么IO异常一定要处理。


字符流——创建文件
1.创建流对象,建立数据存放文件
FileWriter fw = new FileWriter(“Test.txt”);
2.调用流对象的写入方法,将数据写入流
fw.write(“text”);
3.关闭流资源,并将流中的数据清空到文件中。
fw.close();

创建文件并写入数据实例:
import java.io.FileWriter;
import java.io.IOException;

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


IO异常的处理方式
import java.io.FileWriter;
import java.io.IOException;

/*
 * IO异常的处理方式
 */
public class FileWriterDemo2 {
	public static void main(String[] args) {
		FileWriter fw = null;
		try {
			fw = new FileWriter("HelloWorld.txt");
			fw.write("Hello World");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally{
			try {
				if(fw!=null){
					fw.close();
				}
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}


思考:
如果想在原有文件上继续加入新的数据呢?
使用FileWriter(File file, boolean append)构造函数,如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。 

对已有文件的数据续写实例:
import java.io.FileWriter;
import java.io.IOException;

/*
 * 演示对已有文件的数据续写。
 */
public class FileWriterDemo3 {
	public static void main(String[] args) {
		FileWriter fw = null;
		try {
			//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
			fw = new FileWriter("HelloWorld.txt",true);
			fw.write(",Java");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally{
			try {
				if(fw!=null){
					fw.close();
				}
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}


字符流——读取文件
1.建立一个流对象,将已存在的一个文件加载进流。
FileReader fr = new FileReader(“Test.txt”);
2.创建一个临时存放数据的数组。
char[] ch = new char[1024];
3.调用流对象的读取方法将流中的数据读入到数组中。
fr.read(ch);

读取文件方式:
1.通过字符进行读取。
2.通过字符数组进行读取。

读取文件实例(通过字符进行读取):
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
	public static void main(String[] args) {
		FileReader fr = null;
		try {
			//创建一个文件读取流对象,和指定名称的文件相关联。
			//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
			fr = new FileReader("HelloWorld.txt");
			
			//调用读取流对象的read方法。
			//read():一次读一个字符。而且会自动往下读。
			int ch = 0;
			while((ch = fr.read())!= -1){
				System.out.print((char)ch);
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally{
			if(fr!=null){
				try {
					fr.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
		}
	}
}

读取文件实例(通过字符数组进行读取):
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
	public static void main(String[] args) {
		FileReader fr = null;
		try {
			//创建一个文件读取流对象,和指定名称的文件相关联。
			//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
			fr = new FileReader("HelloWorld.txt");
			
			//调用读取流对象的read方法。
			//read():一次读一个字符。而且会自动往下读。
			int ch = 0;
			while((ch = fr.read())!= -1){
				System.out.print((char)ch);
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally{
			if(fr!=null){
				try {
					fr.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
		}
	}
}


思考:
1.在加载文件时候是否是将文件全部加载进流?
  数据是先加载在内存区,然后又被马上被读取出去。
2.为什么定义数组,要定义多大呢?
  更好的存储数据,一般定义为1024的倍数。

注意:
1.定义文件路径时,可以用“/”或者“\\”。
2.在创建一个文件时,如果目录下有同名文件将被覆盖。
3.在读取文件时,必须保证该文件已存在,否则出异常。


文本文件复制
复制的原理:其实就是将一个盘下的文件数据存储到另外一个盘的一个文件中。

文件复制实例:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
需求:将C盘一个文本文件复制到D盘。
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。

步骤:
1,在D盘创建一个文件。用于存储C盘文件中的数据。
2,定义读取流和C盘文件关联。
3,通过不断的读写完成数据存储。
4,关闭资源。
*/
public class CopyText {
	public static void main(String[] args) {
		copy();
	}
	
	//文件复制
	public static void copy(){
		FileReader fr = null;
		FileWriter fw = null;
		try {
			fr = new FileReader("HelloWorld.txt");
			fw = new FileWriter("HelloWorld_copy.txt");
			
			//从C盘读一个字符,就往D盘写一个字符。
			//int num;
//			while ((num =fr.read())!=-1) {
//				fw.write(num);
//			}
			
			//一次写多个字符
			char ch[] = new char[1024];
			int len;
			while ((len =fr.read(ch))!=-1) {
				fw.write(ch,0,len);
			}
			
		} catch (IOException e) {
			throw new RuntimeException("复制失败");
		} finally{
			if(fr != null){
				try {
					fr.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
			if(fw != null){
				try {
					fw.close();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
			}
		}
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值