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