I/O输入输出-输入/ 输出流
1, 流是一组有序的数据序列,根据操作类型,可以分为输入流和输出流,实际上是程序与文件/数组/网络连接/数据库的关系,但要以程序为中心。
2,IO流分类
1)按流向分:输入流与输出流
2)按数据分:字节流:二进制,一切文件均可
字符流:文本文件,只处理纯文本
3,字符流与字节流(重点)
1),字节流:输入流:InputStream(字节输入流)
输出流:OutputStream(字节输出流)
2),字符流:输入流:Reader(字符输入流)
输出流:Writer(字符输出流)
4,操作
举例:搬家------------->读取文件
1)关联房子 ----------->建立与文件的联系---------------->创建file对象
2)选择搬家------------->选择对应流---------------------->文件输入流(InputSream,FileInputStream)/文件输出流(InputSream,FileInputStream)
3)搬家------------------>读取/写出
a) 卡车大小------->数组大小
b)运输------------->读取/写出
4)打发over--------------->释放资源
---------读取文件内容-------------
public static void test()//读取文件内容操作 { File src = new File("e:/test/zjf.txt"); InputStream is = null; try { is = new FileInputStream(src);//使用src对象创建is对象 int len = 0; byte[] car =new byte[100]; try { //String info = null; while(-1!=(len=is.read(car)))//当len=-1时表示已经读到文件末尾 {//将字节流转变成字符流,然后读取字符流 String info = new String(car,0,len); System.out.println(info);//读取文件内容 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(is!=null)//将数据读取完后需要释放资源 { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
-------------向文件中写入内容----------------------
public static void test1() { File dest = new File("e:/test/zjf.txt"); OutputStream is = null; try { is = new FileOutputStream(dest,false);//true代表在文件中追加内容,false代表更新文件内容,不保留原有的 String src = "hkafhgkshgkag"; byte[] data = src.getBytes(); try { is.write(data); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
--------------文件的拷贝---------------------------------
比如:src = "e:/study/dir/zjf.txt" dest = "e:/test/dir/zjf.txt"
/** * 将一个文件中的内容拷贝到另一个文件中,源文件必须是存在的 * @throws IOException */ public static void copyFile(File src,File dest) throws IOException { //1建立联系,file对象,源头,目的地 //File src = new File(srcPath); //File dest = new File(destPath); //2选择流,文件输入流(InputStream,FileInputStream),文件输出流(OutahputStream,FileOutputStream) InputStream is = new FileInputStream(src); OutputStream os = new FileOutputStream(dest); //3 操作,循环读取+拷贝 int len =0; byte[] flush = new byte[1024]; while(-1!=(len=is.read(flush)))//不断将is中的内容读到flush, { //写出 os.write(flush, 0, len);//将flush中的内容写到os中 } os.flush();//强制刷出 //关闭流,先打开的后关闭 os.close(); is.close(); }
------------------------文件夹的拷贝,也包括文件夹的内容也一起拷贝过去---------------------
比如:src="e:/study/dir" 中的dir文件夹以及dir文件夹中的文件拷贝到"e:/test/"下
最后形成的结果是e:/test/dir/1.txt.........e:/test/dir/6.txt
package fjz; import java.io.File; import java.io.IOException; public class Demo005 { /** * 文件夹的拷贝 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub copyDir(); } public static void copyDir() throws IOException { File src = new File("e:/study/dir"); File dest = new File("e:/test"); if(src.isDirectory()) { dest = new File(dest,src.getName()); System.out.println(dest); } copydir(src,dest); } public static void copydir(File src,File dest) throws IOException { if(src.isFile())//如果src是指向的是一个文件的话 { /** * 将源文件的内容拷贝到目的文件中,并保持原来各自的格式,用的是上面文件拷贝的函数 * src:e:\study\dir\1.jpg,e:\study\dir\2.pptx * dest:e:\test\dir\1.jpg,e:\test\dir\2.pptx */ Demo004.copyFile(src,dest); }else if(src.isDirectory())//如果src指向的是一个文件夹的话 { dest.mkdirs();//若目标文件夹没有,就自行创建父目录和子目录 for(File sub:src.listFiles()) { /** * 依次遍历要拷贝的文件夹dir中的文件 * sub指的是文件的路径,sub.getName()指的是文件的名字 new File(dest,sub.getName())是在目的文件夹下生成一个空的文件 即:e:\test\dir\1.jpg,e:\test\dir\2.pptx */ copydir(sub,new File(dest,sub.getName()));//递归调用目录 } } } }