Java学习笔记07:Java语法IO流File

Java语法IO流:File

  • IO介绍
  • File
  • 字节流
  • 字符流
  • CommonsIO

IO流

程序=>数据源(文件,数据库,网络...)

流分类:

  • 节点流:可以直接从数据源或者目的地读写数据
  • 处理流:不直接连接到数据源或目的地,是其他流进行封装,目的是简化操作和提高性能

节点流和处理流的关系:

  1. 节点流处于IO操作的第一线,所有的操作必须通过他们进行
  2. 处理流可以对其他流进行处理(提高效率或者操作灵活性)

具体的流类别分类:

  1. 字节流:按照字节读取数据(InputStream,OutputStream)
  2. 字符流:按照字符读取数据(Reader、Writer),因为文件的编码不同,从而有了对字符进行高效操作的字符流对象

底层原理:底层还是基于字节流操作,自动搜寻指定的码表

  • Reader
    • InputStreamReader
      • FileReader
    • BufferReader
      • LineNumberReader
    • FilterReader
      • PushbackReader
    • CharArrayReader
    • PipeReader
    • StringReader
  • Writer
    • OutputStreamWriter
      • FileWriter
    • BufferedWriter
    • FilterWriter
    • CharArrayWriter
    • PipeWriter
    • StringWriter

File

  • File.separator

    //获取路径类型: / \

构建File对象
//1.构建file对象
File file = new File(path);
System.out.println(file.length());
//大小 file.length

String parent = File.separator + "Users" + File.separator + "huangfl" + File.separator + "repos"+          File.separator+"IdeaWorkfroce"+File.separator+"BaseGrammer"+File.separator+"src"+File.separator+"com"+File.separator+"IO";

//2.构建file对象 父元素路径, 名称
File file1 = new File(parent, "archive.jpg");
System.out.println(file1.length());

1.查看文件的目录

File src = new File("archive.jpg");
System.out.println(src.getAbsoluteFile());
//获取src的相对路径 
System.out.println(System.getProperty("user.dir"));

2.构建一个不存在的文件

File src = new File("asdasd.jpg")
//实际这个文件是构建存在的
  • getName() //获取文件名字
  • getPath() //获取文件路径,如果是相对路径得到相对路径 如果是绝对路径就是绝对路径
  • getParent() //获取父组件的路径,如果是绝对路径得到绝对路径,如果是相对路径结果就是null
  1. 判断状态
  • 不存在

    • exists()
  • 存在

    • 文件 exists()

    • 文件夹 isDirectory()

      String path = " slkjs;fdsf";
      File src = new File(path);
      System.out.println(src.exists()); //true
      System.out.println(src.isFile()); //true
      System.out.println(src.isDirectory()); //false
      
  • length

    • 返回文件字节的长度
  • createNewFile()

    • 不存在的时候才会创建,不存在这不会创建,只能创建文件,不能创建文件夹
  • delete()

    • 删除已经存在的文件
  • mkdir() mkdirs()

    • 创建目录,如果父目录链不存在一同创建
  • list

    • 下级名称
  • listFiles()

    • 下级File
  • listRoots

    • 跟路径
  • list()

    • 获取下级名称,遍历数组
package com.IO;

import java.io.File;

public class demo02 {
    public static void main(String[] args) {
        String s = "/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO";
        File file = new File(s);
        
        String[] str = file.list();
        for(String item:str ){
            System.out.println("item: "+item);
        }
    }
}
  • listFiles()
    • 获取下级名称对象
File[] subFiles = file.listFiles();
for(File item: subFiles){
   System.out.println(item.getAbsolutePath());
}
/*
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/archive.jpg
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/demo02.java
/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/IO/PathDemo.java
*/
  • listRoots()
    • 获取所有的盘符
  • 计算文件的大小
public static void count(File src){
  if(null!=src&&src.exists()){
    if(src.isFile()){
      src.length()
    }else{
      for(File s:src.listFiles()){
        count(s);
      }
    }
  }
}

字符 ==> 字节 (编码)

字节 ==> 字符 (解码)

  • 编码-->字节(UTF-8)
String msg = "性命 生命 使命";
byte[] datas = msg.getBytes();
System.out.println(datas.length());
//对于UTF-8而言,一个汉字占用3个字节,一个字母占用1个字节
//所以这里应该输出20,要计算其中两个空格
  • 编码其他字符集(UTF-16LE)
String msg = "性命生命使命";
byte[] datas = msg.getBytes("UTF-16LE");
System.out.println(datas.length());
//对于UTF-16LE而言,无论是汉字还是字节都是占用两个字节 所以输出为12;
  • 编码为GBK
byte[] datas = msg.getBytes("GBK");
System.out.println(data.length());
//如果是汉字就是两个字节,如果是字母或者空格就是一个字节
  • 导致乱码的原因
String msg = "我是中国人";
byte[] datas = msg.getBytes();

//正确解码方式
msg =new String(datas,0,datas.length,"UTF8");

//1.字节长度不够
msg = new String(datas,0,datas.length-2,"UTF8");

//2.字节编码格式不对
msg = new String(datas,0,datas.length,"GBK");

抽象类

抽象类 说明 常用方法
InputStream 字节输入流的父类,数据单位为字节 * int read() * void close()
OutputStream 字节输出流的父类,数据单位为字节 * void wirte(int) * void flush() *void close()
Reader 字符输入流的父类,数据单位为字符 * int read() * void close()
Writer 字符输出流的父类,数据单位为字符 * void wirte(int) * void flush() *void close()

一切文件都可以处理为字节,但是不是所有的字节都可以处理为字符

处理音频视频只能使用字节流来处理

IO基本操作步骤:

  1. 创建源
  2. 选择流
  3. 操作
  4. 释放资源
package com.IO;


import java.io.*;

public class operationFlow {
    public static void main(String[] args) throws IOException {
      //1.创建源
        File src = new  File("/Users/huangfl/repos/IdeaWorkfroce/BaseGrammer/src/com/abcde.txt");
      //2.选择流
        InputStream is = new FileInputStream(src);
      //3.操作
        char data1 =(char)is.read();
        char data2 =(char)is.read();
        char data3 =(char)is.read();
        int data4 = is.read();
        System.out.println(data1+"--"+data2+"--"+data3+"--"+data4);
      //3.操作
      int temp;
      while( (temp=is.read)!=1 ){
        System.out.println((char)temp);
      }
    	//释放资源
      is.close();
    }
}

当read()返回结果为-1的时候表示这个已经结束,并且这个元素不在范围内;

文件字节输出流

package com.IO;

import java.io.*;

class OutputDemo{
    public static void main(String[] args) throws IOException {
        //1.create
        //2.select
        //3.modify
        //4.close
        File src = new File("wallen.txt");
        OutputStream os = new FileOutputStream(src,true);
      //true 表示叠加,false表示重写
        String msg = "wallen is textsds";
        byte[] datas = msg.getBytes();  //字符==>字节 编码
        os.write(datas,0,datas.length);
        os.flush(); //reset
        os.close();
    }
}

通过文件的输入输出流实现文本的复制

package com.IO;

import java.io.*;

public class Copy {
    public static void main(String[] args) throws IOException {
        //通过文件的输入输出流实现对文本的复制操作
        File src = new File("dest.txt"); //源头
        File dest = new File("wallen.txt"); //目的地
        InputStream is = new FileInputStream(src);
        OutputStream os = new FileOutputStream(dest,true);

        //modify
        byte[] flush = new byte[1024];
        int len = -1;
        while ((len=is.read(flush))!=-1){
            os.write(flush,0,len);
        }
        os.flush();
        os.close();
        is.close();
    }
}

FileReader && FileWriter

  • FileReader 通过字符的方式读取文件,仅仅适合字符文件
  • FileWriter: 通过直接的方式写出或者追加到数据中,仅仅适合字符文件
posted @ 2020-05-14 17:30  feelonewong  阅读(190)  评论(0)    收藏  举报