您的位置:首页 > 编程语言 > Java开发

Java基础之(九)-----Java中的IO流(一)【进阶必备】

2014-01-06 14:34 351 查看
Java中的IO包是java基础的核心包,掌握好IO包,对以后程序开发有很大影响。不管是桌面应用还是J2EE开发,都会频繁使用输入输出。自我感觉,输入输出就想人得呼吸一样正常,在第一遍学习java基础的时候,由于IO包中的类多而且杂,曾经学习起来感觉很吃力,特别是一个人想通过看书来解决这一章的时候要有耐心,还要有方法。这里客串一下学习java的方法。

学习Java方法体会。

网上很多人说java基础就是几个核心包,掌握了这几个核心包(lang,IO,sql,util等)就等于掌握好了java基础。

我觉得,在学习这些包之前,要弄清这些包的结构,因为java是面向对象的语言,所以,java会把关系密切的类放在同一个包,同理,同一个包里面的类必然有联系,比如Exception的子类分为RuntimeException和Exception的直接子类,这就是两条线,沿着这两条线索学习,就会感觉很有条理。方法就介绍到这。这次是IO包的复习。

基于字符的IO操作

基于字符的IO操作指的是操作对象是以字符为基本单位。常见得有对于文本的读写等。

Reader

Rader类是所有读取字符类的父类。它的直接父类是Object类。它定义了一系列的方法来对文件进行读操作,关闭流等方法。一般不会使用Reader的实例来读取文件,而是使用Reader类得子类的实例读取文件。它的直接实现子类有FileReader和BufferedReader等。

FileReader

FileReader是Reader的直接子类,拥有父类的对文件进行操作的方法。提供两个重载的read方法,一个read方法无参,返回读取到字符的码值,另外一个read方法用字符数组作为参数,返回读取到的字符数。对于小型文件,一般会直接用FilrrReader来读,当文件较大时,一般会套上缓冲流来加大效率。

BufferedReader

BufferedReader也是Reader类直接子类。在它底层定义了一个数组,并且重写了read方法,增加了readLine方法,实现缓冲的原理是:将读取到的数据先放入到数组保存,然后再从数组中读取存入的数据。有点象FileReader有参方法,从而实现缓冲的功能。readLine方法会直接读取文本的一行,但是不会读到换行符。
代码示例:
package BufferedReader;

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

public class BufferedReaderDemo {

	public static void main(String[] args) {
		
	
		
		try
		{
			BufferedReader bf =new BufferedReader(new FileReader("copyText.txt"));
			char[] ch=new char[1024];
			int len=0;
			String s =null;
			while((s=bf.readLine())!=null)
			{
				System.out.println(s);
			}
			
			bf.close();
			
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		
	}

}

Writer

在介绍读取数据之后,在介绍怎么写入数据。和Reader一样,Writer是所有写字符类的父类,它定义了一系列对文件进行写操作的方法。一般也不会使用Writer来写入数据。下面介绍FileWriter。

FileWriter

FileWriter是Writer类的直接子类,它重载了write方法来对文件进行写操作,可以写入字符数组,字符串,单个字符。对于小型文件,直接使用此类,但是对于大型文件,就需要对该类实现缓冲。

BufferedWriter

BufferedWriter是包装流,用法和BufferedReader用法大同小异。
代码示例:
package BufferedWriter;

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

public class BufferedWriterDemo {

	
	public static void main(String[] args) {
		
		try
		{
			
			//创建一个带缓冲的字符流,并且指定数据源
			
			BufferedWriter bf=new BufferedWriter(new FileWriter("IO流.txt"));
			//写入数据
			bf.write("abcde");
			bf.newLine();
			bf.write("haha");
			//刷出缓冲出的数据
			bf.flush();
			//关闭缓冲区,注意:这里只用关闭包装流
			bf.close();
		}catch(IOException e)
		{
			e.printStackTrace();
		}

	}

}


至此,对于字符的读写操作介绍完了,主要是四个类的使用,先将四个类一起使用,实现一个文件的复制。
package test;

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

public class CopyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		
		try
		{
			copyText();
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		

	}
	
	public static void copyText() throws IOException
	{
		
		BufferedReader bf=new BufferedReader(new FileReader("copyText.txt"));
		
		BufferedWriter bw=new BufferedWriter(new FileWriter("copyText2.txt"));
		
		int h=0;
		
		char[] ch=new char[1024];
		
		while((h=bf.read(ch))!=-1)
		{
			bw.write(ch,0,h);
		}
		
		bf.close();
		bw.flush();
		bw.close();
	}

}

基于字节的IO操作

基于字节的IO操作与基于字符的操作大同小异,不过最根本的是操作对象不同。一个是字节,一个是字符。在程序设计过程中,只需要把对象由char改为byte,很多情况都和字符操作相似。它的主要的四个类分别如下:

InputStream

OutputStream

FileInputStream

FileOutputStream

BufferedInputStream

BufferedOutputStream

对于这些类的用法没有特别的新意,只用代码介绍一下:
package snippet;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3Test {

	/**
	 * 一个使用字节流来赋值MP3
	 * 的程序
	 */
	public static void main(String[] args) {
		
		try
		{
			FileInputStream in =new FileInputStream("d:\\陶喆 - 流沙.mp3");
			FileOutputStream out= new FileOutputStream("d:\\陶喆 - 流沙1.mp3");
			BufferedInputStream bf=new BufferedInputStream(in);
			BufferedOutputStream bp=new BufferedOutputStream(out);
			
			int h=0;
			byte[] b =new byte[1024];
			while((h=bf.read(b))!=-1)
			{
				bp.write(b);
			}
			bf.close();
			bp.flush();
			bp.close();
			
			
		}catch(IOException e)
		{
			e.printStackTrace();
		}

	}

}


两种流应该比较着来学习,会有很大的收货,比如说,它们都有相同的方法名,参数的形式也很相似等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: