File类及IO流(文件字节输入输出流、文件字符输入输出流、字节数组输入输出流)

1、按流的方向分类(以程序为中心):

1、输入流:数据流向数据源到程序(以InputStream,Reader结尾的流)

2、输出流:数据流向是程序到目的地,(以OutputStream,write结尾的流)

2、相对路径和绝对路径

  • 存在盘符,绝对路径

  • 不存在盘符,相对路径,相对于当前目录(System.getProperties(“user.dir”))

3、File

1、File.Separator:连接符
  • 在window上是\,在unix上是/
2、创建File对象
  • File file = new File("E:/a.txt");
    
  • File file1 = new File("e:/", "b.txt");
    
3、创建文件
 		boolean flag = file.createNewFile();//是否创建成功
4、判断文件是否可读写
		System.out.println(file.canRead());
		System.out.println(file.canWrite());
5、判断文件是否存在
		file.exists();
6、创建目录
		File file1 = new File("e:/电影/华语");
		boolean mkdir = file1.mkdir();//如果目录中中间某层不存在,则创建失败
		boolean mkdir = file1.mkdirs();//如果目录中某层不存在,则会自动创建出来
7、判断是文件还是文件夹
        file.isFile();
        file1.isDirectory();
8、删除指定文件
		file.delete();
9、得到文件长度(是文件的长度,不是文件夹的长度)
        System.out.println(file.length());
        System.out.println(file1.length());//如果是文件的话,返回为0
10、得到路径 getPath()
		System.out.println(file.getPath());//如果创建的时候是以绝对路径创建的,则返回绝对路径,如果是相对路径创建的话,返回相对路径
11、得到绝对路径
		System.out.println(file.getAbsolutePath());
12、getParent()
        System.out.println(file.getParent());	//得到的是文件的父目录
        System.out.println(file.getParentFile());	//得到的是文件父目录对象,是一个file对象
13、list()
String[] list = file.list();//返回目录下所有的目录名和文件名
File[] files = file.listFiles();//返回目录下所有的目录对象和文件对象
14、打印子孙级目录和文件名
//递归打印子孙级目录和文件名
public static void printFile(File file,int level){
        for (int i=0;i<level;i++){
            System.out.print("-");
        }
        System.out.println(file.getName());
        if (file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files) {
                printFile(file1,level+1);
            }
        }
    }
15、统计文件夹的大小
public static Long len=0l;
    public static void count(File file){
        if(null!=file&&file.exists()){
            if(file.isFile()){
                len+=file.length();
            }else{//是文件夹的,遍历子孙
                File[] files = file.listFiles();
                for (File file1 : files) {
                    count(file1);
                }
            }
        }
    }

4、字符集

  • 编码:有字符到字节
  • 解码:由字节到字符
		String msg="问题集合";
        //编码
        byte[] bytes = msg.getBytes();//默认使用工程的字符集,UTF-8,一个中文3个字节
        System.out.println(bytes.length);//12
		//编码:其他字符集
        byte[] gbks = msg.getBytes("GBK");//GBK编码一个中文2个字节,一个英文一个字节
        System.out.println(gbks.length);
        //解码
        String s = new String(bytes, 0, bytes.length);
        System.out.println(s);

		//乱码问题
			1、字节数不够
            2、编码解码字符集不统一
              	    System.out.println(new String(bytes, 0, bytes.length - 2));//问题集�
        			System.out.println(new String(bytes, 0, bytes.length, "GBK"));//闂闆嗗悎

5、IO流(输入输出流)

1、四个抽象类
image-20200606155727500
2、操作步骤
  • 创建源

  • 选择流

  • 操作

  • 释放资源

    • 		//创建源
              File file = new File("src/abc.txt");
              //选择流
              InputStream is = null;
              try {
                  is = new FileInputStream(file);
                  //操作
                  int data;
                  while((data=is.read())!=-1){	//当读不到时返回-1
                      System.out.println((char) data);
                  }
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }finally {
                  //释放资源
                  if(null!=is){
                      try {
                          is.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
      

6、文件字节流(FileInputStream&FileOutputStream)

  • FileInputStream:通过字节的方式读取文件,适合读取所有类型的文件
		//创建源
        File file = new File("src/abc.txt");
        //选择流
        InputStream is=null;
        try {
            is=new FileInputStream(file);
            //操作
            byte[] bytes = new byte[1024];
            int len=-1;//读取到的实际大小
            while((len=is.read(bytes))!=-1){	//先读到byte[]中
                String s = new String(bytes);	//解码
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(null!=is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  • FileOutputStream:通过字节的方式写出或者追加数据到文件,适合所有类型的文件
  //创建源
        File file=new File("src/dest.txt");
        //选择流
        OutputStream os=null;
        try {
            os=new FileOutputStream(file);
            //操作
            String msg="我们相拥岁月,安暖人生";
            //编码
            byte[] bytes = msg.getBytes();
            try {
                os.write(bytes,0,bytes.length);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            if(null!=os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

7、文件拷贝

	 /**
     * 文件复制
     * @param srcPath   源文件路径
     * @param destPath  目标文件路径
     */
    public static void copy(String srcPath,String destPath){
        //创建源
        File src = new File(srcPath);
        File dest = new File(destPath);
        //选择流
        InputStream is=null;
        OutputStream os=null;
        try {
            is = new FileInputStream(src);
            os=new FileOutputStream(dest);
            /*操作*/
            byte[] flush=new byte[1024];
            int len=-1;
            while((len=is.read(flush))!=-1){	//先读取到缓冲字节数组中
                os.write(flush,0,len);
                os.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //分别关闭,先打开的先关闭
            if(null!=is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null!=os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

8、文件字符流(FileReader&FileWeiter)

  • FileReader:通过字符的方式读取文件,仅适用于字符文件
//创建源
        File file = new File("src/dest.txt");
        //选择流
        Reader reader=null;
        try {
            reader=new FileReader(file);
            char[] flush=new char[1024];
            int len=-1;
            while((len=reader.read(flush))!=-1){
                System.out.println(flush);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null!=reader){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  • FileWriter:通过字符的方式写出或追加数据到文件,仅适用于字符文件
 //创建源
        File file=new File("src/dest.txt");
        //选择流
        Writer writer=null;
        try {
            writer=new FileWriter(file);
            //操作
            //第一种,写出字符数组
            String msg="人生是一场旅途,谁都是过客";
            /*char[] chars=msg.toCharArray();
            writer.write(chars);*/
            //第二种,写出字符串
            writer.write(msg);
            //第三种
            writer.append("我们相拥岁月,安暖人生").append("dsdsdsdsds");
            writer.flush();
        } catch (IOException e) {e.printStackTrace();
        }finally {
            //释放资源
            if(writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

9、字节数组流(ByteArrayInputStream&ByteArrayOutputStream)

源头由原来的文件变为字节数组,任何文件都可以转为字节数组,字节数组不能太大,不用关闭,不用使用多态。跟电脑内存打交道

  • ByteArrayInputStream
 //创建源,源头为字节数组,不要太大
        byte[] bytes="Process finished with exit code 0".getBytes();
        //选择流
        ByteArrayInputStream bais=new ByteArrayInputStream(bytes);
        //操作
        try {
            byte[] flush=new byte[1024];
            int len=-1;
            while((len=bais.read(flush))!=-1){
                String s = new String(flush, 0, len);
                System.out.println(s);
            }
            } catch (IOException e) {
                e.printStackTrace();
            }

  • ByteArrayOutputStream
		//创建源,不需要源头
        //选择流
        ByteArrayOutputStream baos=null;
        baos=new ByteArrayOutputStream();
        //操作
        String msg="Process finished with exit code 0";
        byte[] bytes = msg.getBytes();//编码
        baos.write(bytes,0,bytes.length);
        try {
            baos.flush();
            //获取数据
            byte[] bytes1 = baos.toByteArray();
            System.out.println(new String(bytes1, 0, bytes1.length));
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //不需要关闭
        }

10、小应用(图片转为字节数组,字节数组写出到文件)

	//字节数组到程序再到文件
    public static void byteArrayToFile(byte[] bytes,String destPath){
        //创建源
        File file = new File(destPath);
        ByteArrayInputStream bais=null;
        OutputStream os=null;
        try {
            bais=new ByteArrayInputStream(bytes);
            os=new FileOutputStream(file);
            byte[] flush=new byte[1024];
            int len=-1;
            while((len=bais.read(flush))!=-1){
                os.write(flush,0,len);
            }
            os.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    //图片到字节数组
    public static byte[] fileToByteArray(String srcPath){
        //创建源(文件字节输入流的)
        File file = new File(srcPath);
        //选择流
        InputStream is=null;
        ByteArrayOutputStream baos=null;
        try {
            is=new FileInputStream(file);
            baos=new ByteArrayOutputStream();
            byte[] flush=new byte[1024];
            int len=-1;
            while((len=is.read(flush))!=-1){
                baos.write(flush,0,len);
            }
            baos.flush();
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭文件字节输入流
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return null;
    }

你可能感兴趣的:(笔记)