IO流一:概述、IO异常处理、文件续写、文件读取、文件拷贝及练习

本文详细介绍了Java中的IO流,包括流的概述、异常处理、文件续写、字符流读取方式(逐个字符和字符数组)以及文件拷贝的实际操作。通过对FileWriter和FileReader的使用,展示了如何进行文件的读写和数据传输。

1. IO流概述

IO流用来在设备之间传输数据,Java对数据的传输就是通过IO流的方式,用于操作IO流的类封装在io包中。

IO流根据所操作的数据分为两种:字节流和字符流。

IO流根据数据传输的方向分为两种:输入流和输出流。

 

字节流的抽象基类:InputStreamOutputStream

字符流的抽象基类:ReaderWriter

由这四类派生的子类名称,都是以父类名作为后缀。

 

先以字符流为例,了解下IO流。

 

既然IO流是用于操作数据的,那么数据最常见的体现形式是:文件。

那么先以操作文件为主来演示。

 

需求:在硬盘上,创建一个文本文件,并写入一些数据。

思路:使用一个专门用于操作文件的Writer子类对象——FileWriter,三个方法:writecloseflush

 

代码示例:

import java.io.*;

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

2.  IO异常的处理

上一个例子中,FileWriter的构造方法、writeflushclose方法都会抛出IO异常IOException,上一个例子中只是简单的throws抛出处理。

这里学习内部的IO异常处理方法。

代码示例:

import java.io.*;

class FileWriterDemo2 {
	public static void main(String[] args){
		FileWriter fw = null; //finally块中需调用fw,所以fw全局定义,但在try块中初始化。
		try{
			fw = new FileWriter("k:\\Demo.txt"); //路径不存在抛出IO异常,初始化失败。
		
			fw.write("cbcdaf");  //把数据写入流中。
		}
		catch(IOException e){
			System.out.println("异常:"+e.toString());
		}
		finally{
			
			try{
				if(fw!=null)   //必须判断fw是不是为空。fw初始化失败则为空。
					fw.close(); //close关闭资源要写在finally中。
			}
			catch(IOException e){
				System.out.println(e.toString());
			}
			
		}
		
	}
}

3.  文件的续写

对已有的文件,在文件的末尾进行数据续写。

代码示例:

import java.io.*;

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

4.  IO流文件读取:逐个字符读取

FileReader调用read()方法,一次读取一个字符,逐个读取。

代码示例:

import java.io.*;

class FileReaderDemo{
	public static void main(String[] args) throws IOException{
		//创建一个文件用来读取流对象,和指定名称的文件相关联。
		//要保证指定文件是已经存在的,如果不存在,会发生FileNotFoundException
		FileReader fr = new FileReader("Demo.txt");
		
		//调用read方法,读取流对象。
		//read方法:一次读一个字符,而且会自动往下读,返回字符的十进制形式。
		int ch = fr.read();
		System.out.println("ch="+(char)ch);
		
		while(true){
			int ch = fr.read();
			if(ch==-1)
				break;
			System.out.println((char)ch);
		}
		/* 上面的while循环的优化。
		int ch = 0;
		while((ch=fr.read())!=-1){
			System.out.println((char)ch);
		} */
		fr.close();
	}
}

5.  IO流文件读取:通过字符数组读取

代码示例:

import java.io.*;

class FileReaderDemo2{
	public static void main(String[] args) throws IOException{
		FileReader fr = new FileReader("Demo.txt");
		
		//定义一个字符数组,用于存储读到字符。
		//该read(char[])返回的是读到字符个数。
		char[] buf = new char[1024];  //此处数组长度一般为1024整数倍。
		int num = 0;
		while((num=fr.read(buf))!=-1){ //读取文件中字符,逐个存入buf数组,返回读取的字符数。
			System.out.println(new String(buf,0,num));
		}
		fr.close();
	}
}

6.  FileReader练习

读取一个.java源文件,并打印在控制台上。

代码示例:

import java.io.*;

class FileReaderTest{
	public static void main(String[] args){
		FileReader fr = null;
		
		try{
			fr =  new FileReader("DateDemo.java");
			char[] buf = new char[1024];
			int num = 0;
			while((num=fr.read(buf))!=-1){
			
				//这里是print,不带换行,不然超过1024时,没打印完就换行。
				System.out.print(new String(buf,0,num));
			}
		}
		catch(IOException e){
			System.out.println(e.toString());
		}
		finally{
			try{
				if(fr!=null)
					fr.close();
			}
			catch(IOException e){
				System.out.println(e.toString());
			}
		}
	}
}

7.  拷贝文本文件

C盘一个文件复制到D盘。

步骤:

1,在D盘创建一个文件,用于存储C盘文件中的数据。

2,定义一个读取流,并和C盘文件关联。

3,定义一个写入流,并创建一个D盘的文件。

3,通过不断的读写,完成数据的存储。

4,关闭资源。

 

代码示例:

import java.io.*;

class CopyTextDemo {
	public static void main(String[] args) {
		//copy_1();
		copy_2();
	}
	 
	 //从C盘读一个字符,就往D盘写一个字符。
	 public static void copy_1(){
		FileReader fr = null;
		FileWriter fw = null;
		
		try{
			//创建目的地。创建写入流,和写入的文件。
			fw = new FileWriter("D:\\RuntimeDemo_copy.txt");
			
			//与已有文件关联。创建读取流,和要读取的文件。
			fr = new FileReader("C:\\RuntimeDemo.java");
			
			int ch = 0;
			
			//read方法返回的int类型,是字符的ASCII码值。
			while((ch=fr.read())!=-1){
				fw.write(ch);  //此处的read和write是逐个字符的读写,效率低。
			}
		}
		catch(IOException e){
			System.out.println(e.toString());
		}
		finally{
			try{
				fw.close();
				fr.close();
			}
			catch(IOException e){
				System.out.println(e.toString());
			}
		}
		
	 }
	 
	 //第二种实现方式。
	 public static void copy_2() {
		FileReader fr = null;
		FileWriter fw = null;
		
		try{
			fw = new FileWriter("D:\\RuntimeDemo_copy.txt");
			fr = new FileReader("C:\\RuntimeDemo.java");
			
			char[] buf = new char[1024];
			int size = 0;
			
			//此处的read和write按字符数组读取和写入。
			while((size=fr.read(buf))!=-1){
				fw.write(buf,0,size); //只把数组不为空的部分写入,避免浪费空间。
			}
		}
		catch(IOException e){
			System.out.println(e.toString());
		}
		finally{
			if(fw!=null)
				try{
					fw.close();
				}
				catch(IOException e){
					System.out.println(e.toString());
				}
			if(fr!=null)
				try{
					fr.close();
				}
				catch(IOException e){
					System.out.println(e.toString());
				}
		}
	 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值