小白学习Java开发的第十三天

以下内容为之前的补充以及后续的扩展

常用类

方法重写

/**
 * 
 *   对于一个方法而言: 区分方法 通过方法名找方法  通过参数列表来确定方法
 *   方法重写:
 *      发生继承关系、实现关系  父类不满足子类的需求  子类重写父类中的方法
 *   
 *   什么情况下会发生重写?
 *      1:发生继承
 *      2:方法名同名
 *      3:参数列表要一模一样  (顺序 个数 类型)
 *      4:子类的返回值类型<=父类的返回值类型(引用)  基本类型一模一样
 *      5:子类的修饰符>=父类的修饰符  (父类中的修饰符不能是private)
 *      6:子类抛出的异常<=父类抛出的异常  (理解:可以认为任意一个方法都会对外抛出运行时异常)
 *      参一反小修大异小
 */   
public class Test01 {
    public static void main(String[] args) {
        
    }
}
class F{
    F fun(F s) {
        System.out.println(1/0);
        return null;
    }
}
class S extends F{
    public S fun(F s)throws NullPointerException{
        return null;
    }
}

Scanner

/*
 *  学习使用Scanner
 *      hasNextXXX   获取扫描到的数据是否是XXX类型
 *      nextXXX      获取下一个扫描到的内容转为XXX类型(转换过程中有可能存在问题)
 */
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        if(sc.hasNextInt()) {
            System.out.println(sc.nextInt());
        }
        if(sc.hasNext()) {
            System.out.println(sc.next());
        }
        
        //重新创建Scanner对象 指定文件为输入源
        Scanner input = new Scanner("");
        System.out.println(input.next());
    }
}

Objects

/*
 * isNull:判定对象是否为null
 * toString:输出对象的
 * requireNonNull 判定对象是否为null 如果是null则抛出空指针异常不是null就打印相应的值
 */
public class Test01 {
    public static void main(String[] args) {
        String str = null;
        //System.out.println(str.toString());
        
        if(!Objects.isNull(str)) {
            System.out.println(str.toString());
        }
        
        System.out.println(Objects.toString(str));
        
        foo(str);
    }

    private static void foo(String str) {
        System.out.println(Objects.requireNonNull(str));
    }
}

字符串

String

String的构建

/**
 *   String:
 *        字符串: 一组字符序列    (不可变的串)
 *      创建String对象:
 *          new String();
 *          new String("abc");
 *          "love";
 *          new String(buf,2,2);//通过字节数组创建
 *      
 *   StringBuffer
 *   StringBuilder(jdk1.5之后才有的)
 * @author wawjy
 *
 */
public class Test01 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //String构造器
        String str1 = new String();//new一个对象
        System.out.println(str1);
        
        //通过双引号直接创建String对象
        String str2 = "liuhang";
        System.out.println(str2);//通过字符串常量直接给String对象赋值
        
        //比较str1和str2
        String str3="";
        System.out.println(str1==str3);
        
        //按照字节数组创建字符串对象
        byte[] b = new byte[] {65,67,64,98};
        String str4 = new String(b);
        System.out.println("通过字节数组创建字符串"+str4);
        str4 = new String(b,2,2);//截取索引为2开始的2个长度的字符串
        System.out.println("通过字节数组创建字符串"+str4);
        
        str4 = new String(b,2,2,"UTF-8");
        System.out.println("通过字节数组创建字符串"+str4);
    
        
        //按照字符数组创建字符数组
        char[] c = new char[] {'刘','杭','最','大','气','了'};
        str4 = new String(c);
        System.out.println("通过字符数组创建字符串"+str4);
        str4 = new String(c,0,2);//截取索引为0开始的2个长度的字符串
        System.out.println("通过字符数组创建字符串"+str4);
        
        //按照代码点创建字符串数组
        int[] i = new int[] {88,89,100,99};
        str4 = new String(i,0,3);//截取索引为0开始的3个长度的字符串
        System.out.println("通过代码点创建字符串"+str4);
        
        //按照字符串对象创建字符串对象
        String str5 = new String("asdasd");
        System.out.println("通过字符串对象创建字符串"+str5);
    }
}

String的常见方法

public class Test02 {
    public static void main(String[] args) {
        
        //创建一个String对象
        String str = "ilivezhangke";
        //charAt(int index)
        char ch1 = str.charAt(0);
        System.out.println("返回当前索引位置上的指定字符:"+ch1);
        
        //charPointAt(int index)
        int num = str.codePointAt(0);
        System.out.println("返回当前指定索引位置上元素的代码点:"+num);
        
        //compareTo(String)
        String cStr = "ilovebasketball";
        num = str.compareTo(cStr);
        System.out.println("比较两个字符串的大小:"+num);
        
        //compareToIgnoreCase(String)
        cStr = "ILOVEYOUVERYMUCH";
        num = str.compareToIgnoreCase(cStr);
        System.out.println("比较两个字符串的大小(忽略大小写):"+num);
        
        //concat(String)
        cStr = "shuaiqi";
        str = str.concat(cStr);
        System.out.println("拼接之后的结果是:"+str);
        
        //copeValueOf(char[])
        char[] ch2 = new char[] {'i','l','o','v','e'};
        str = String.copyValueOf(ch2);
        System.out.println("创建新的字符串:"+str);
        
        str = String.copyValueOf(ch2, 0, 2);//从索引0开始截取两个长度的字符串
        System.out.println("创建新的字符串:"+str);
        
        str = "adi.aavi";
        boolean flag = str.endsWith(".aavi");
        System.out.println("str是否是.aavi格式"+flag);
        
        //getBytes
        byte[] buf = str.getBytes();
        System.out.println("获取字符串的字节数组:"+Arrays.toString(buf));
        
        
        //indexOf  返回负数代表未找到
        str = "heihe.i.avi";
        int index = str.indexOf(".");
        System.out.println(".在string中第一次出现的位置是:"+index);
        
        
        index = str.indexOf(101);
        System.out.println("e在string中第一次出现的位置是:"+index);
        
        index = str.indexOf(".",5);
        System.out.println(".在string中第五个索引位置开始计算,第一次出现的位置是:"+index);
        
        index = str.lastIndexOf(".");
        System.out.println(".在string中最后一次出现的位置是:"+index);
        
        //isEmpty()
        System.out.println("查看数组是否为null:"+str.isEmpty());
        
        //replace  代替
        str = "asdsdkj";
        str = str.replace("a","c");
        System.out.println("替换后的结果为:"+str);
        
        //splite:  切割
        str = "login?uname=zs&pwd=zs";
        String[] strs = str.split("\\?");//以”?“为分割线进行分割
        for(String string:strs) {
            System.out.println(string);
        }
        
        System.out.println("====");
        String parms = strs[1];
        strs = parms.split("&");
        for(String str1 : strs) {
            String[] ss = str1.split("=");
            System.out.println(ss[1]);
        }
        
        
        //subString
        str = "login?uname=zs&pwd=zs";
        str = str.substring(4);//从4索引开始截取到最后
        System.out.println("截取字符串:"+str);
        str = str.substring(1, 3);//从索引1开始到索引3但是不包括3为止
        System.out.println("截取字符串:"+str);
        
        //大小写转换
        str = "login?uname=zs&pwd=zs";
        str = str.toUpperCase();
        System.out.println("转为大写为:"+str);
        str = str.toLowerCase();
        System.out.println("转为小写为:"+str);
        
        
        //通过静态方法创建String对象
        String str1 = String.valueOf(123);
        System.out.println(str1);
        
        //对象转字符串其实就是调用当前对象的toString方法
        User u = new User(10);
        String str2 = String.valueOf(u);
        System.out.println(str2);
    }
}
class User{
    @Override
    public String toString() {
        return "User [age=" + age + "]";
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private int age;

    public User(int i) {
        super();
        // TODO Auto-generated constructor stub
    }
    
}

String面试题

//由于String不可变 所以经过方法不会发生改变 
public class Test03 { 
    public static void main(String[] args) { 
        String str = "123"; 
        System.out.println(str);
        change(str);
        System.out.println(str);
    }
    public static void change(String str) {
        str = "234"; 
    } 
}
//intern 获取到的是当前String对象 的地址
public class Test01 {
    public static void main(String[] args) {
        String str1 = "cat";
        String str2 = "cat";
        String str3 = new String("cat");
        
        System.out.println(str1==str2);
        System.out.println(str1==str3);
        
        String str4 = str1.intern();
        System.out.println(str1==str4);
        System.out.println(str2==str4);
        System.out.println(str3==str4);
    }
}

/*
 * 
 *  1: new  堆开空间
 *  2: "zhangsan"  常量池
 *  3:+号拼接:
 *      左右两边操作数如果是字面值  则直接拼接之后再常量池开空间
 *      如果左右两边操作数是变量 则通过常量值重新分配空间 存储变量地址 
 */
public class Test02 {
    public static void main(String[] args) {
        String s1 = "Cat";
        String s2 = "Dog";
        final String s3 = s1+s2;
        String s4 = "CatDog";
        String s5 = "Cat"+"Dog";
        System.out.println(s3==s4);
        System.out.println(s5==s4);
    }
}

Stringbuffer

/**
 *  StringBuffer :
 *          之所以能够可变的原因,底层就是一个字符数组,动态数组。
 *          调用关系画出来。         
 *  StringBuilder    1.5之后
 */
public class Test04 {
    public static void main(String[] args) {
        //创建StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //默认容量为16
        System.out.println("通过空构造器创建的StringBuffer的容量为16");
        
        //添加元素
        sb.append(true);
        sb.append(false).append("232").append("asd");//链式编程
        System.out.println(sb);
        System.out.println("当前sb对象的字符串长度为:"+sb.length());
        
        //添加元素
        sb.insert(1, "asa");
        System.out.println(sb);
    }
}

StringBuilder

/**
 *   StringBuilder和StringBuffer 都继承了AbstractStringBuilder
 *   
 *   StringBuffer效率低于StringBuilder
 *   StringBuffer安全性要高于StringBuilder
 *      一般情况下使用StringBuilder  
 
 *   jdk9之后  String中存储数据通过byte数组存储 + 变量
 *   jdk中对于String存储时的内容消耗极大降低
 */
public class Test05 {
    public static void main(String[] args) {
        //StringBuilder
        StringBuilder sb = new StringBuilder();//构建16个长度的字符数组
        //添加元素
        sb.append("sd");
        sb.insert(0, "21312");
        System.out.println(sb);
    }
}

性能比较

第一种用例:拼接相同的字符串数量固定
public class StringConcat {
​    public static void main(String[] args) {
​        plus();
​        concat();
​        stringBuffer();
​        stringBuilder();
​    }

​    public static void plus(){
​        String initial = "";
​        long start = System.currentTimeMillis();
​        for(int i = 0; i < 100000; i++){
​            initial = initial + "a";
​        }
​        long end = System.currentTimeMillis();
​        System.out.println("plus:" + (end - start));
​    }

​    public static void stringBuilder(){
​        StringBuilder initial = new StringBuilder("");
​        long start = System.currentTimeMillis();
​        for(int i = 0; i < 100000; i++){
​            initial = initial.append("b");
​        }
​        long end = System.currentTimeMillis();
​        System.out.println("StringBuilder:" + (end - start));

​    }

​    public static void stringBuffer(){
​        StringBuffer initial = new StringBuffer("");
​        long start = System.currentTimeMillis();
​        for(int i = 0; i < 100000; i++){
​            initial = initial.append("c");
​        }
​        long end = System.currentTimeMillis();
​        System.out.println("StringBuffer:" + (end - start));
​    }
​    public static void concat(){
​        String initial = "";
​        long start = System.currentTimeMillis();
​        for(int i = 0; i < 100000; i++){
​            initial = initial.concat("d");
​        }
​        long end = System.currentTimeMillis();
​        System.out.println("concat:" + (end - start));
​    }
}
结果:
plus:5328
concat:2220
StringBuffer:12
StringBuilder:0
当拼接相同字符串时性能由好到差为:StringBuilder,StringBuffer,concat,“+”
第二种用例:拼接不同的字符串但是数量相同
public class StringConcat {
    public static void main(String[] args) {
        plus();
        concat();
        stringBuffer();
        stringBuilder();
    }

    public static void plus() {
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String a = "a";
            a = a + String.valueOf(i);
        }
        Long end = System.currentTimeMillis();
        System.out.println("double plus:" + (end - start));
    }

    public static void stringBuilder() {
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            StringBuilder b = new StringBuilder("b");
            b.append(String.valueOf(i));
        }
        Long end = System.currentTimeMillis();
        System.out.println("double StringBuilder:" + (end - start));
    }

    public static void stringBuffer() {

        Long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            StringBuffer c = new StringBuffer("c");
            c.append(String.valueOf(i));
        }
        Long end = System.currentTimeMillis();
        System.out.println("double StringBuffer:" + (end - start));
    }

    public static void concat() {
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String d = "d";
            d = d.concat(String.valueOf(i));
        }
        Long end = System.currentTimeMillis();
        System.out.println("double concat:" + (end - start));
    }
}
结果:
double plus:72
double concat:23
double StringBuffer:32
double StringBuilder:26
当拼接不相同字符串且数量相同时性能由好到差为:concat,StringBuilder,StringBuffer,“+”

包装类

Integer

/*
 *   包装类:
 *      8大基本数据类型  ->  8个包装类 
 *      byte->Byte
 *      short->Short
 *      char ->Character
 *      int  ->Integer
 *      long ->Long
 *      float->Float
 *      double->Double
 *      boolean->Boolean
 *   
 *   jdk12 Integer中的所有构造器都过时 通过valueOf方法获取int对应的Integer对象
 *   
 *   String->int  Integer.parseInt();// 可能报异常
 *   int ->String    String.valueOf()
 *   
 *   
 */
public class Test01 {
    public static void main(String[] args) {

        // 静态成员变量
        System.out.println("BYTES:" + Integer.BYTES);
        System.out.println("MAXVALUE:" + Integer.MAX_VALUE);
        System.out.println("MINVALUE:" + Integer.MIN_VALUE);
        System.out.println("SIZE" + Integer.SIZE);
        System.out.println("CLASS:" + Integer.TYPE);

        // 构造器
        Integer i1 = new Integer(12);
        System.out.println(i1);

        Integer i2 = new Integer("123");// 可能出现数字格式化异常
        System.out.println(i2);

        System.out.println(Integer.max(12, 12));

        // parseInt(String)字符串转换为int
        System.out.println("字符串转换为int" + Integer.parseInt("212"));
        // 将一个对应进制的数转换为十进制
        System.out.println("字符串转换为int" + Integer.parseInt("1100", 2));
        // 将当前数值在计算机中存储的补码进行翻转得到的十进制的数
        System.out.println("" + Integer.reverse(Integer.MAX_VALUE));

        System.out.println("2进制:" + Integer.toBinaryString(12));
        System.out.println("8进制:" + Integer.toOctalString(12));

        // 获取Integer对象
        Integer i3 = Integer.valueOf(12);
        System.out.println(i3);

        Integer i4 = Integer.valueOf("12");
        System.out.println(i4);
        System.out.println(Integer.class);
        System.out.println(Integer.decode("12"));
    }
}

/**
 * 
 * @author wawjy
 *  jdk1.5之后支持自动拆装箱,本质上就是调用了 
 *          装箱:Integer.valueOf()
 *          拆箱:对象.intValue()
 *  
 *   自动装箱时,首先会判定当前的值是否在缓冲区中[-128,127],如果在该区间中,直接从缓冲区中获取对应的Integer对象
 *      反之会重新创建一个新的Integer对象
 */
public class Test02 {
    public static void main(String[] args) {
        Integer i1 = 123;//jdk1.5之后支持自动装箱 Integer.valueOf(123)
        int num = i1;//jdk1.5之后支持自动拆箱 i1.intValue()
        
        Integer i2 = 98;
        Integer i3 = 98;
        System.out.println(i2==i3);
        
        i2 = 128;
        i3= 128;
        System.out.println(i2==i3);
    }
}

Boolean

/*
 *    字面值创建Boolean对象时 只能指定true和false 并且创建的对象也是对应的true和false
 *    字符串创建Boolean对象是 只要字符是true/false 无所谓大小写 得到对应的Boolean对象就是与之对应的true和false
 *    其它所有字符串赋值都是false
 * 
 */
public class Test03 {
    public static void main(String[] args) {
        //创建Boolean对象
        Boolean b1 = new Boolean("true");
        System.out.println(b1);
        
        b1 = new Boolean("false");
        System.out.println(b1);
        
        b1 = new Boolean("2");
        System.out.println(b1);
        
        b1 = new Boolean("TRue");
        System.out.println(b1);
        
        b1 = new Boolean("HJa");
        System.out.println(b1);
        
        b1 = new Boolean("FALSE");
        System.out.println(b1);
    }
}

Date

/* 
 *   和时间有关的类
 *          Date:
 *              空构造器对象创建出的是当前系统时间对象
 */
public class Test01 {
    public static void main(String[] args) {
        
        
        //创建Date对象
        Date d = new Date();
        System.out.println(d);//空构造器对象创建出的是当前系统时间对象
        
        //通过带参构造器创建对象
        Date d1 = new Date(3600);//参数代表毫秒数
        System.out.println(d1);//此时间为1970年加上系统设置的时区再加上参数
        
        System.out.println(d.after(d1));
        System.out.println(d.before(d1));
        
        //获取毫秒数
        Long dateTime = System.currentTimeMillis();
        System.out.println(dateTime);
        
    }
}

SimpleDateFormat

ublic class Test02 {
    public static void main(String[] args) throws Exception {
        //创建对象
        File f = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv File");
        
        System.out.println("查看是否可执行:"+f.canExecute());
        System.out.println("查看是否可写:"+f.canWrite());
        System.out.println("查看是否可读:"+f.canRead());
        System.out.println(f.delete());
        
        File ff = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files");
        //比较的path
        System.out.println(ff.compareTo(f));
        //获取路径
        System.out.println(f.getPath());
        //获取路径是否存在
        System.out.println(f.exists());
        //获取绝对路径
        System.out.println(f.getAbsolutePath());
        //创建文件,确保路径是否存在
        System.out.println(f.createNewFile());
        //
        System.out.println(ff.equals(f));
        System.out.println("是否是绝对路径:"+f.isAbsolute());
        //获取绝对路劲
        System.out.println("获取绝对路径:"+f.getAbsolutePath());
        System.out.println("获取文件名称:"+f.getName());// 获取文件名称
        System.out.println("获取父级目录:"+f.getParent());
        System.out.println("获取相对路径(项目根目录):"+f.getPath());
        f = new File("c:\\");
        System.out.println("获取剩余大小:"+f.getFreeSpace());
        System.out.println("获取总共大小:"+f.getTotalSpace());
        System.out.println("获取可用大小:"+f.getUsableSpace());
        System.out.println("是否是绝对路径:"+f.isAbsolute());
        
        //获取最后一次修改的时间
        long l = f.lastModified();
        /*
         * Date d = new Date(l); SimpleDateFormat sd = new
         * SimpleDateFormat("yyyy/MM/dd hh:mm"); String str = sd.format(d);
         * System.out.println(str);
         */
        System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new Date(l)));
        //获取里面的字节数
        System.out.println(f.length());
        
        f = new File("c:\\");
        //获取c盘下的文件目录
        String[] strs = f.list();
        for(String str:strs) {
            System.out.println(str);
        }
        
        System.out.println("========");
        
        //获取c盘下的文件以及字节数
        File[] fs = f.listFiles();
        for(File fff : fs) {
            System.out.println(fff.getName()+"==="+fff.length());
        }
        download();
        
    }
    public static void download() throws Exception {
        File d = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files");
        //在指定文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
        File temp = File.createTempFile("asdsad", ".avi",d);
        TimeUnit.SECONDS.sleep(2);
        temp.deleteOnExit();
    }
}

Calender

创建方式

public class Test01 {
    public static void main(String[] args) {
        //创建对象
        Calendar c = Calendar.getInstance();
        
        System.out.println(c);
        
        Date d = new Date(1564032018853L);
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String str = sd.format(d);
        System.out.println(str);
        
        System.out.println("获取当前日历中的天:"+c.get(Calendar.DATE));
        System.out.println("获取当前日历中的天:"+c.get(Calendar.DAY_OF_MONTH));
        System.out.println(c.get(Calendar.DAY_OF_WEEK));//星期从星期天开始 星期天是第一天
        System.out.println(c.get(Calendar.MONTH));
        System.out.println(c.get(Calendar.APRIL));
        System.out.println(c.get(Calendar.AUGUST));
        System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println(c.get(Calendar.ERA));
        System.out.println(c.get(Calendar.HOUR_OF_DAY));
        System.out.println(c.get(Calendar.PM));
        System.out.println(c.get(Calendar.ZONE_OFFSET));
        System.out.println(c.get(Calendar.MONTH));
    }
}

常用方法

public class Test02 {
    public static void main(String[] args) {
        //创建对象
        Calendar c = Calendar.getInstance();
        System.out.println(c);//输出当前时间
        //add累加会增位即:当时间是七月二十五时加13天它会变成八月七号
        c.add(Calendar.DAY_OF_MONTH, 13);
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        System.out.println(c.get(Calendar.MONTH));
        
        c = Calendar.getInstance();
        //roll  不会增位
        c.roll(Calendar.DAY_OF_MONTH, 13);
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        System.out.println(c.get(Calendar.MONTH));
        
        System.out.println("=======");
        
        c = Calendar.getInstance();
        //传入参数如果是当前月份之内的天数则设置位指定的日期,如果传入的是超过了字段值的数则会增位
        c.setLenient(true);
        c.set(Calendar.DAY_OF_MONTH,32);
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        System.out.println(c.get(Calendar.MONTH));
    }
}

编写万年历

public class PrintCalendar {    
    public PrintCalendar(int year,int month,int day) {
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month-1);
        c.set(Calendar.DAY_OF_MONTH, day);
    }

        System.out.println("天\t一\t二\t三\t四\t五\t六");
        //设置当前日期对象的第一天为当前日历对象
        c.set(Calendar.DAY_OF_MONTH, 1);
        //获取当前月份第一天是周几
        int blankCount = c.get(Calendar.DAY_OF_WEEK)-1;
        //打印空格
        for(int i = 0;i<blankCount;i++) {
            System.out.print(" \t");
        }
        
        //准备打印日期
        //获取当前月份中天数的最大值
        int days = c.getActualMaximum(Calendar.DAY_OF_MONTH);
        //循环
        for(int i=1;i<=days;i++) {
            if(day==c.get(Calendar.DAY_OF_MONTH)) {
                System.out.print("*");
            }
            System.out.print(i+"\t");
            
            if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) {
                System.out.println();
            }
            //改变日历
            c.set(Calendar.DAY_OF_MONTH, i+1);
        }
        
    }

File

构造器

*
 *   file:
 *          抽象的路径以及文件
 *          1:创建对象是 无需注意当前路径或者是文件是否存在 都会创建出来
 *          2:和平台无关的路径分隔符
 *              File.pathSeparator路径结束符
 *              File.separator路径分割符
 */
public class Test01 {
    public static void main(String[] args) {
        //创建一个File对象
        File f = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files");
        System.out.println(f);
        
        System.out.println(File.pathSeparator);
        System.out.println(File.pathSeparatorChar);
        System.out.println(File.separator);
        System.out.println(File.separatorChar);
        f = new File("C:"+File.separator+"Users"+File.separatorChar+"wawjy"+File.separatorChar+"Desktop");
        System.out.println(f);
    }
}

常见方法

ublic class Test02 {
    public static void main(String[] args) throws Exception {
        //创建对象
        File f = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv File");
        
        System.out.println("查看是否可执行:"+f.canExecute());
        System.out.println("查看是否可写:"+f.canWrite());
        System.out.println("查看是否可读:"+f.canRead());
        System.out.println(f.delete());
        
        File ff = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files");
        //比较的path
        System.out.println(ff.compareTo(f));
        //获取路径
        System.out.println(f.getPath());
        //获取路径是否存在
        System.out.println(f.exists());
        //获取绝对路径
        System.out.println(f.getAbsolutePath());
        //创建文件,确保路径是否存在
        System.out.println(f.createNewFile());
        //
        System.out.println(ff.equals(f));
        System.out.println("是否是绝对路径:"+f.isAbsolute());
        //获取绝对路劲
        System.out.println("获取绝对路径:"+f.getAbsolutePath());
        System.out.println("获取文件名称:"+f.getName());// 获取文件名称
        System.out.println("获取父级目录:"+f.getParent());
        System.out.println("获取相对路径(项目根目录):"+f.getPath());
        f = new File("c:\\");
        System.out.println("获取剩余大小:"+f.getFreeSpace());
        System.out.println("获取总共大小:"+f.getTotalSpace());
        System.out.println("获取可用大小:"+f.getUsableSpace());
        System.out.println("是否是绝对路径:"+f.isAbsolute());
        
        //获取最后一次修改的时间
        long l = f.lastModified();
        /*
         * Date d = new Date(l); SimpleDateFormat sd = new
         * SimpleDateFormat("yyyy/MM/dd hh:mm"); String str = sd.format(d);
         * System.out.println(str);
         */
        System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new Date(l)));
        //获取里面的字节数
        System.out.println(f.length());
        
        f = new File("c:\\");
        //获取c盘下的文件目录
        String[] strs = f.list();
        for(String str:strs) {
            System.out.println(str);
        }
        
        System.out.println("========");
        
        //获取c盘下的文件以及字节数
        File[] fs = f.listFiles();
        for(File fff : fs) {
            System.out.println(fff.getName()+"==="+fff.length());
        }
        download();
        
    }
    public static void download() throws Exception {
        File d = new File("C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files");
        //在指定文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
        File temp = File.createTempFile("asdsad", ".avi",d);
        TimeUnit.SECONDS.sleep(2);
        temp.deleteOnExit();
    }
}

编写DIR

public class Test04 {
    public static void main(String[] args) {
        //创建file对象
        File file = new File("c:\\");
        //获取当前file中的所有目录对象
        File[] fs = file.listFiles();
        //迭代所有file
        for(File f : fs ) {
            //获取最近修改的时间
            String dateStr = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new Date(f.lastModified()));
            //判断是否是一个目录
            String isDirectory = f.isDirectory()?"<DIR>":"";
            //判断是否是一个文件
            String isFile = f.isFile()?String.valueOf(f.length()):"";
            //获取名字
            String fileName = f.getName();
            //打印
            System.out.println(dateStr+"\t"+isDirectory+"\t"+isFile+"\t"+fileName);
        }
    }
}

mikdir和mikdirs区别

/**
 * mkdir 只能创建一级目录
 * 
 * @author wawjy
 *
 */
public class Test03 {
    public static void main(String[] args) throws IOException {
        File f = new File("myfile");

        // 创建路径
        File filePath = new File("myfile\\a.txt");
        filePath.mkdir();

        // 创建文件

        f.createNewFile();
        f.setReadOnly();

    }
}

IO

为什么需要IO

/*
 *  问题:
 *      1: file类本身只能针对文件或者是目录的元数据(除了内容本身)进行操作 不能对于文件中的内容做任何操作。
 *      2: 截止目前,我们存储数据的手段是很有限以及有问题的?
 *          学习过的存储手段:
 *                  变量   对象     数组---> 存储都是在内存中的--->程序启动之后 数据存在 程序销毁之后  数据丢失
 *          但是在后期真个编码、项目的过程中:
 *                  我们对于数据一定要持久的存储起来 方便后期使用以及更新
 *      3: 无法将数据持久化存储起来。
 *          解决办法: 通过学习IO流的知识 将数据写入到文件中去  或者读取文件中的数据信息
 *                 文件时存储在磁盘上的,电脑关机之后,主要文件保存,那么开机之后数据还在。
 *  IO:         
 *      IO: input output 输入输出  
 *      学习流的时候时候 流是有方向的  输入输出说的是针对谁的呢?
 */

IO流的分类

IO流的分类:独立的分类 而是相互
 *          1:按照输出的数据类型不同:
 *              字节流    输出/输入时  按照字节输出/输入
 *              字符流    输出/输入时  按照字符输出/输入
 *          2:按照流的方向
 *              输入流
 *              输出流
 *          3:按照处理功能
 *              节点流
 *              处理流

InputStream

FileInputStream

读取单个字符
/*
 *   读取数据:
 *      字节流:InputStream 是所有字节流的父类
 *      输入 :
 *      子类:
 *          FileInputStream: 文件字节输入流   数据源在文件中  读取按照字节读取  流的方向是输入
 */
public class Test02 {
    public static void main(String[] args) throws IOException {
        //创建对象
        InputStream is = new FileInputStream(new File("C:\\Users\\HangBaTua\\Desktop\\aa.txt"));
        //读取数据
        int bit = is.read();
        //输出数据
        System.out.println(bit);
        //读取数据
        int bit1 = is.read();
        //输出数据
        System.out.println(bit1);
        //读取数据
        int bit2 = is.read();
        //输出数据
        System.out.println(bit2);
        //读取数据
        int bit3 = is.read();
        //输出数据
        System.out.println(bit3);
        //关闭资源
        is.close();
    }
}
循环读取
/*
 *  每次读取数据时 只能读一个字节,在通过read方法读取时如果
 *  读取到了文件末尾,返回-1
 *  
 *  循环读取
 *    FileInputStream 创建要保证文件存在
 * 
 */
public class Test03 {
    public static void main(String[] args) throws IOException {
        //创建对象
        InputStream is = new FileInputStream(new File("C:\\Users\\HangBaTua\\Desktop\\aa.txt"));
        //读取数据
        int num = 0;
        while((num = is.read())!=-1) {
            //分析数据
            System.out.println(num);
        }
        //关闭资源
        is.close();
    }
}

读取多个字节

/*
 * 
 *    一次性读取一个字节数组
 * 
 */
public class Test04 {
    public static void main(String[] args) throws IOException {
        //声明对象
        InputStream is = new FileInputStream(new File("C:\\Users\\HangBaTua\\Desktop\\aa.txt"));
        //读取数据源
        //声明一个字节数组
        byte[] b = new byte[1024];
        int len = is.read(b);
        
        //分析数据
        String msg = new String(b, 0, len);
        System.out.println(msg);
        //关闭资源
        is.close();
    }
}

处理异常

public class Test05 {
    public static void main(String[] args){
        //声明对象
        InputStream is = null;
        try {
            is = new FileInputStream(new File("C:\\Users\\HangBaTua\\Desktop\\aa.txt"));
            //读取数据
            byte[] b = new byte[1024];
            int len = is.read(b);
            //分析数据
            String msg = new String(b, 0, len);
            System.out.println(msg);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //关闭资源
        try {
            is.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

OutputStream

FileOutputStream

写出一个字符

/*
 *  字节输出流:
 *      所有字节输出流的父类都是OutputStrean
 *      
 *      子类:FileOutputStrean  输出的目的地是文件  输出流  输出的类型是字节
 *  
 *  输出时 如果文件不存在会创建该文件 但是不会创建目录
 * 
 */
public class Test06 {
    public static void main(String[] args) throws IOException {
        //创建对象
        OutputStream os = new FileOutputStream(new File("aa.txt"));
        //声明写出数据
        int num = 97;
        //写出数据
        os.write(num);
        //关闭资源
        os.close();
    }
}

写出多个字符

/**
 *  创建FileOutputStream对象时   第二个参数boolean值 
 *  说明是否在当前文件后追加内容
 *      默认情况是false 不追加 
 *              true是追加
 * 
 * @author wawjy
 *
 */
public class Test07 {
    public static void main(String[] args) throws IOException {
        //声明对象
        OutputStream os =  new FileOutputStream(new File("aaa.sa"));
        //声明写出的数据
        String msg = "ilovezhangke";
        //写出数据
        os.write(msg.getBytes(), 0, 10);
        //关闭资源
        os.close();
    }
}

编写复制粘贴

public class Test08 {
    public static void main(String[] args) throws IOException {
        CtrlCV();
    }

    public static void CtrlCV() throws IOException {

        // 1,声明复制和粘贴的文件对象
        String srcFile = "C:\\Users\\HangBaTua\\AppData\\Roaming\\feiq\\Recv Files\\io流分类.png";
        String destFile = "111.png";

        // 2,声明对象
        InputStream is = new FileInputStream(srcFile);
        OutputStream os = new FileOutputStream(destFile);

        // 3,读取文件
        int len = 0;
        while ((len = is.read()) != -1) {
            // 4,写出
            os.write(len);
        }
        // 5,关闭资源
        os.close();
        is.close();
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352