io流(input output)


IO流(数据流)

用来处理设备之间的数据传输,Java对数据的操作(硬盘上的文件,内存中的数据)是通过流的方式
Java用于操作流的对象都在IO包中

流按流向分为:输入流,输出流。

流按操作数据分为两种:字节流与字符流

通用:字节流(数据(mp3,mp4等媒体视频音频,图片)都是字节,也就是二进制

ASCII外国人弄的识别英文字母)

我们国家也弄了一个对应中文的表:GBK2312表

国际标准(UNICODE码表(无论什么字符都用16个字节表示),

再进行优化后UTF-8码表(两个相同字母时里面的编码就会优化)

基于字节流产生字符流(内部糅合编码表):对于读取的数据,查哪个表可以由我们来指定

(处理文字就会变得很方便)

字节流的抽象基类:Input Stream ,Output Stream。

字符流的抽象基类:Reader ,Writer。

由这四个类派生出来的子类名称都是

以其父类名作为子类名的后缀。

如:Input Stream的子类File Input Stream。

如:Reader的子类File Reader。前缀名是该流对象的功能

字符流-读取文件

建立一个流对象,将已存在的一个文件加载进流。

File Reader fr = new File Reader(“Test.txt”);

创建一个临时存放数据的数组。

char[] ch = new char[1024];

调用流对象的读取方法将流中的数据读入到数组中。

fr.read(ch);

注:定义文件路径时,可以用“/”或者“\\”。

在创建一个文件时,如果目录下有同名文件将被覆盖。

在读取文件时,必须保证该文件已存在!!否则出异常。

/*writer写*/
//创建一个FileWriter对象,该对象一被初始化就必须明确被操作的文件
//new的文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖.
//该步就是明确数据存放的目的地(要写字得有纸,起到纸的作用)
	FileWriter fw = null;//外面建立引用
		try {
			//里面进行初始化    传递一个true参数,代表不覆盖已有文件,并在已有文件末尾处进行数据续写
			fw = new FileWriter("D:\\aio\\demo.txt",true);
	//调用write方法,将字符串写入流中,但目前文件中是没有的哦!!
			fw.write("hahahha");//写很多到硬盘没空间了,所以有可能有异常
	//刷新流对象中的缓冲中的数据,将数据弄到目的地中,流可以继续使用.
			fw.flush();//用几次都无所谓,重点是最后要调用close();
			//fw.write("3829399dikdjdl");
			//fw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}//抛出异常
		finally {
			//关闭流资源,但是关闭前会刷新一次内部的缓冲中的数据,将数据弄到目的地中.
			//close刷新后,会将流关闭.
			try {
				if(fw != null) {//为空时,是没法关闭的,所以要判断一下
					fw.close();//如果写了5个或更多流,要分别关闭,不能&& 或||写
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//java是调用系统中的资源来进行读写操作,它本身是不能进行这种操作的,
			//所以用完了要把系统的资源给关闭,释放出来
		}
/*读Reader*/	throws IOException	
	//先创建一个文件读取流对象,和要读的文件名称相关联
	//要保证该文件已经存在,若不存在,会报FileNotFoundException
	FileReader fr = new FileReader("D:\\aio\\demo.txt");	
	//调用读取流对象的read方法,
	//read(); :一次读一个字节,并且会自动往下读,返回一个int型的数字
	//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);
	}
	*/
	//通过字符数组进行读取
	//定义一个字符数组read(char[]),用于存储读到的字符,返回读到的字符个数
	char[] buf = new char[1024];//定义为1024(2k)的整数倍的数组长度
	int num = 0;
	while((num = fr.read(buf)) != -1) {
			//把数组打印变成字符串打印一下,从什么位置开始,取几个
		System.out.print(new String(buf,0,num));
	}
	
	//int num = fr.read(buf);//读一个,存数组里一个
	fr.close();
package io;
import java.io.*;
public class lOtext {
/*把复制文件到另一个地方  */									
public static void main(String[] args) {

	copy_2();
	}
//用这个
public static void copy_2() {
	FileWriter fw =null;
	FileReader fr = null;
	try {
		fw = new FileWriter("D:\\aio\\demo_copy.txt");
		fr = new FileReader("D:\\aio\\demo.txt");
		char[] buf = new char[1024];
		int len = 0;
		while((len=fr.read(buf)) != -1) {
			fw.write(buf,0,len);}
			
	}catch(IOException e){
		throw new RuntimeException("读写失败");
	}finally {
		if(fr!= null) {
			try {
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			}
		if(fw != null) {
			try {
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			}
	}
}
//读一个字符,存一个字符的方法
public static void copy_1() throws IOException {
	//创建目的地
	FileWriter fw = new FileWriter("D:\\aio\\demo_copy.txt");
	//与已有文件关联
	FileReader fr = new FileReader("D:\\aio\\demo.txt");
	int ch = 0;
	while((ch=fr.read()) != -1) {
		fw.write(ch);
	}
	fr.close();
	fw.close();
	}
}

相关推荐