JavaIO流(一)

JavaIO流

java中的变量、数组、对象、集合它们都是内存中的数据容器,它们记住的数据,在断电,或者程序终止时会丢失,故要使用到文件。

  • 文件是非常重要的存储方式,在计算机硬盘中
  • 即使断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失

Flie

  • File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。
  • 注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。

IO流

  • 用于读写数据的(可以读写文件,或者网络中的数据...)

1.File类

1.创建File类的对象

方法:

  • public File(String pathname) :根据文件路径创建文件对象
  • public File(String parent,String child):根据父路径和子路径名字创建文件对象
  • public File(File parent,String child):根据父路径对应文件对象和子路径名字创建文件对象

注意:

  • File 对象既可以代表文件、也可以代表文件夹
  • File 封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许时不存在的

绝对路径:带盘符的

File f3 = new File("C:\\Users\\17595\\Desktop\\java\\JavaProject\\JavaSE\\basic-grammar\\src\\yehuan.txt");

相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。

new File("模块名 \\src\\yehuan.txt");

代码演示:

package com.IO.File;

import java.io.File;

public class FileTest1 {
    public static void main(String[] args) {
        //1.创建一个Flie对象,指代某个具体的文件
        //路径分隔符(File.separator 可以自适应系统的路径分隔符 --- 跨平台)
        //File f1 = new File("C:\\Users\\17595\\Desktop\\java\\resource\\ab.txt");
        //File f1 = new File("C:/Users/17595/Desktop/java/resource/ab.txt");
        File f1 = new File("C:"+File.separator+"Users"+File.separator+"17595"+File.separator+"Desktop"+File.separator+"java"+File.separator+"resource"+File.separator+"ab.txt");
        System.out.println(f1.length());//文件大小

        //注意:File对象可以指代一个不存在的文件路径
        File f2 = new File("C:/Users/17595/Desktop/java/resource/aaaa.txt");
        System.out.println(f2.length());//0
        System.out.println(f2.exists());//false(判断文件路径是否存在)

        //我现在要定位的文件是在模块中,应该怎么定位呢?
        //绝对路径:带盘符的
        // File f3 = new File("C:\\Users\\17595\\Desktop\\java\\JavaProject\\JavaSE\\basic-grammar\\src\\yehuan.txt");
        //相对路径(重点):不带盘符,默认是直接去工程下寻找文件的
        //new File("模块名 \\src\\yehuan.txt");
        File f3 = new File("basic-grammar\\src\\yehuan.txt");
        System.out.println(f3.length());


    }
}

2.常用方法

判断文件类型、获取文件信息:

  • public boolean exists() : 判断当前文件对象,对应的文件路径是否存在,存在返回true,不存在返回false。
  • public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
  • public boolean isDirectory() : 判断当前文件对象指代的是否为文件夹
  • public String getName(): 获取文件的名称(包含后缀)
  • public long length() : 获取文件大小,返回字节个数
  • public long lastModified() : 获取文件的最后修改时间。
  • public String getPath() : 获取创建文件对象时,使用的路径
  • public String getAbsolutePath() : 获取绝对路径
package com.IO.File;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;

public class FlieTest02 {
    public static void main(String[] args) {
        //1. 创建文件对象,指代某个文件
        File f1 = new File("C:\\Users\\17595\\Desktop\\java\\resource\\ab.txt");
        
        //2.public boolean exists() : 判断当前文件对象,对应的文件路径是否存在,存在返回true,不存在返回false。
        System.out.println(f1.exists());
        
        //3.public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
        System.out.println(f1.isFile());
        
        //4.public boolean isDirectory() : 判断当前文件对象指代的是否为文件夹
        System.out.println(f1.isDirectory());
        
        //5.public String getName(): 获取文件的名称(包含后缀)
        System.out.println(f1.getName());
        
        //6.public long length() : 获取文件大小,返回字节个数
        System.out.println(f1.length());
        
        //7.public long lastModified() : 获取文件的最后修改时间。
        long time = f1.lastModified();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(time));
        
        //8.public String getPath() : 获取创建文件对象时,使用的路径
        System.out.println(f1.getPath());
        
        //9.public String getAbsolutePath() : 获取绝对路径
        System.out.println(f1.getAbsolutePath());
    }
}

创建文件、删除文件:

  • public boolean creatNewFile(): 创建一个新文件(文件内容为空),创建成功返回true,反之。
  • public boolean mkdir() : 用于创建文件夹,注意:只能创建一级文件夹
  • public boolean mkdir() : 用于创建文件夹,注意:可以创建多级文件夹
  • public boolean delete() : 删除文件、或者空文件,注意:不能删除非空文件。

注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站

package com.IO.File;

import java.io.File;
import java.io.IOException;

public class FileTest03 {
    public static void main(String[] args) throws Exception {
        //1.public boolean creatNewFile(): 创建一个新文件(文件内容为空),创建成功返回true,反之。
        File f1 = new File("C:\\Users\\17595\\Desktop\\\\java\\resource\\yehuan.txt");
        System.out.println(f1.createNewFile());//会出现异常,直接抛异常
        
        //2.public boolean mkdir() : 用于创建文件夹,注意:只能创建一级文件夹
        File f2 = new File("C:/Users/17595/Desktop/java/resource/abc");
        System.out.println(f2.mkdir());
        
        //3.public boolean mkdir() : 用于创建文件夹,注意:可以创建多级文件夹
        File f3 = new File("C:/Users/17595/Desktop/java/resource/aaa//bbb/ccc");
        System.out.println(f3.mkdirs());

        //4.public boolean delete() : 删除文件、或者空文件,注意:不能删除非空文件。
        System.out.println(f1.delete());
    }
}

遍历文件夹:

  • public String[] list(): 获取当前目录下所有的“一级文件名称” 到一个字符串数组中去返回
  • public File[] listFiles(): (重点) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)

使用listFiles方法时的注意事项:

  • 当主调是文件,或者路径不存在时,返回null
  • 当主调是空文件夹时,返回一个长度为0的数组
  • 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在Flie数组中返回
  • 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径的路径放在数组中返回,包含隐藏文件
  • 当主调是一个文件夹,但是没有权限访问该文件时,返回null
package com.IO.File;

import java.io.File;

public class FileTest04 {
    public static void main(String[] args) {
        //1. public String[] list(): 获取当前目录下所有的“一级文件名称” 到一个字符串数组中去返回
        File f1 = new File("C:/Users/17595/Desktop/java/resource");
        String[] name = f1.list();
        for (String str : name) {
            System.out.println(str);
        }

        //2. public File[] listFiles(): (重点) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file.getAbsoluteFile());
        }
    }
}

案例:目标:改变某个文件夹下视频的序号,要求从19开始:

package com.IO.File;

import java.io.File;

//目标:改变某个文件夹下视频的序号,要求从19开始
public class Test {
    public static void main(String[] args) {
        File dir = new File("C:/Users/17595/Desktop/java/resource");

        //1.拿到下面全部的视频,一级文件对象
        File[] videos = dir.listFiles();
        //2.一个一个的找
        for (File video : videos) {
            //3.拿到它的名字,改成新名字
            String name = video.getName();
            String index = name.substring(0,name.indexOf("、"));
            String lastName = name.substring(name.indexOf("、"));
            String newName = (Integer.valueOf(index)+18)+lastName;

            //4.正式改名
            video.renameTo(new File(dir,newName));
        }
    }

}

案例2:文件搜索的实现(利用递归)

package com.IO.File;

import java.io.File;
import java.io.IOException;

// 文件搜索的实现
public class Test2 {
    public static void main(String[] args) throws Exception {
        creashFile(new File("D:/"),"QQ.exe");
    }

    /**
     * 去目录下搜索某个文件
     * @param dir 目录
     * @param fileName 要搜索的文件名称
     */
    public static void creashFile(File dir,String fileName) throws Exception {
        //1. 把非法的情况都拦截住
        if(dir==null || !dir.exists() || dir.isFile()){
            return; //代表无法搜索
        }

        //2.dir不是null,存在,一定是目录对象
        File[] files = dir.listFiles();

        //3.判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象
        if(files != null && files.length > 0){
            //4.遍历全部一级文件对象
            for (File f : files) {
                if(f.isFile()){
                    if(f.getName().contains(fileName)){
                        System.out.println("找到了:"+f.getAbsolutePath());
                        //找到后直接启动(runtime类)
                        Runtime rt = Runtime.getRuntime();
                        rt.exec(f.getAbsolutePath());
                    }
                }else {
                    // 是文件夹,继续重复这个过程(递归)
                    creashFile(f,fileName);
                }
            }
        }

    }
}

3.前置知识:字符集

标准的ASCII字符集

  • ASCII:美国信息交换标准代码,包括了英文、符号等
  • 标准ASCII使用1个字节存储一个字符,首位是0,总共可以表示128个字符,对美国人来说是完全够用了

GBK(汉字内码扩展规范,国标)

  • 汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
  • 注意:GBK兼容了ASCII字符集
  • GBK规定:汉字的第一个字节的第一位必须是1

Unicode字符集(统一码,也叫万国码)

  • Unicode是国际组织指定的,可以容纳世界上所有的文字、符号的字符集(UTF-32)

UTF-8

  • 是Unicode字符集的一种编码方案,采用可变长编码方案,共分四个长度区:1个字节、2个字节、3个字节、4个字节
  • 英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节

注意:

  • 字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
  • 英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码

字符集的编码和解码操作

编码:把字符按照指定字符集编码成字节

解码:把字节按照指定字符集解码成字符

package com.IO.codeset;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Test01 {
    public static void main(String[] args) throws Exception {
        //1.编码
        String data = "a我b";
        byte[] bytes = data.getBytes();//默认是按照平台字符集(UTF-8)进行的编码
        System.out.println(Arrays.toString(bytes));

        //按照指定字符集进行编码
        byte[] bytes2 = data.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        //2.解码

        String s1 = new String(bytes); //按照平台默认编码(UTF-8)解码
        System.out.println(s1);

        String s2 = new String(bytes2,"GBK");
        System.out.println(s2);
    }
}
posted @ 2025-02-12 21:36  昼冷夜欢  阅读(36)  评论(0)    收藏  举报