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();
}
}
上面的文件复制思路图解
