• 文件(1)--File


    File简介


    Java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。

    创建File对象

    File file=new File(String  pathname);

    如:在F盘里的java文件夹下的OracleSQLInit.sql文件

    new File("F:"+File.separator+"java"+File.separator+"OracleSQLInit.sql");

    File.separator 常量,用于解决操作系统间目录分隔符之间的差异。

    window   F:javaOracleSQLInit.sql

    linux     /java/OracleSQLInit.sql

    new File("."+File.separator+"file.txt");

    路径中的"."代表当前目录,这里指的就是当前项目的根目录了.

    File的方法


    查看文件或目录属性

    1. String getName()  获取文件或目录的名字

    2. long length()  获取文件的大小 以字节为单位

    3. long lastModified()  获取文件的最后修改时间  毫秒值

    4. String getPath()  获取当前文件或目录的路径,以字符串形式返回

    5. boolean exists()  判断当前File对象描述的文件或目录是否存在

    6. boolean isFile()  判断当前File对象描述的是否为一个文件

    7. boolean isDirectory()  判断当前File对象描述的是否为一个目录

    8. boolean canRead()  判断当前文件是否可读

    9. boolean canWrite()  判断当前文件是否可写

    10. String getAbsolutePath()  获取文件或目录的绝对路径

    11. String getCononicalPath()  获取操作系统标准的绝对路径,需要捕获异常

    新建文件或目录

    1. boolean mkdir()  创建File描述的目录。

    2. boolean mkdirs()   创建目录,同时创建所有不存在的上级目录(父目录)

    3. boolean createNewFile() 创建File描述的文件(空文件)

    在创建多级目录时,应选取使用mkdirs()方法。若在多级目录下创建文件,应先确保该文件所处的目录存在后,在创建文件。

    删除文件或目录

    boolean delete()  删除文件或目录,删除目录时要注意,要确保该目录下没有任何子项才可以成功删除目录。

    查看目录内容

    1. String[] list()  返回当前目录下子项的名字(当前目录下的所有文件名或目录名)

    2. File[] listFiles()  获取当前目录下的所有子项,每一个子项用用一个File对象描述,最终以数组形式返回。

    3. File[] listFiles(FileFilter filter)  重载的listFiles()方法,可以传入一个过滤器,用来返回当前目录下满足过滤器要求的所有子项。

    FileFilter过滤器是一个接口,我们需要实现该接口,并实现其中的一个抽象方法boolean accept(File file)。重写该方法的目的是定义过滤条件,返回true表示给定的file是满足条件的。

    File案例


    mkdir()   mkdirs()    createNewFile()

    public class TestFile {
    
        public static void main(String[] args) throws Exception {
            File dir = new File("." + File.separator + "mydir");
            // 当我们创建该对象后,并不代表他描述的目录一定存在这只是java的一个对象,在内存中存在的。是否在硬盘上存在,要进行判断。
            if(!dir.exists()){
                dir.mkdir();
            }
            // File类重载构造器方法,在已存在的目录下,创建文件test.txt
            File file = new File(dir, "test.txt");
            if(!file.exists()){
                file.createNewFile();
            }
            System.out.println(file.getAbsolutePath());// E:workspacefile.mydir	ext.txt
            System.out.println(file.getCanonicalPath());// E:workspacefilemydir	ext.txt
            System.out.println(file.getPath());// .mydir	ext.txt
    
            // 在当前目录下创建 a/b/c/d
            dir = new File("." + File.separator + "a" + File.separator + "b" + File.separator + "c" + File.separator + "d");
            if(!dir.exists()){
                // 使用mkdir创建目录,必须保证上级目录要存在
                dir.mkdir();
                // mkdirs创建目录,会自动将不存在的上级目录创建出来
                dir.mkdirs();
            }
        }
    }

    删除文件或目录 delete

    public class TestFile {
        public static void main(String[] args) throws Exception {
            // 删除目录,要确保为空目录才可以删除,不是空目录则删除失败返回false,如果是文件可以直接删除
            File dir = new File("." + File.separator + "a");
            boolean delFlag = dir.delete();
            System.out.println("删除结果:" + delFlag);
        }
    }

    list()   listFiles()   listFiles(FileFilter filter)

    输出当前项目跟目录下的所有子项

    public class TestFile {
        public static void main(String[] args) throws Exception {
            File dir = new File(".");
            // 获取所有子项的名字
            String sub_names[] = dir.list();
            for(String sub : sub_names){
                System.out.println(sub);
            }
    
            // 获取所有子项。注意,确保File对象描述的是一个目录,再调用 listFiles()方法。
            File subs[] = dir.listFiles();
            for(File sub : subs){
                if(sub.isFile()){
                    System.out.println("文件:" + sub.getName());
                }
                else if(sub.isDirectory()){
                    System.out.println("目录:" + sub.getName());
                }
            }
    
            // 获取当前项目根目录下的所有文本文件
            File[] files = dir.listFiles(new FileFilter() {
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith("txt");
                }
            });
            for(File file : files){
                System.out.println("txt文件:" + file.getName());
            }
        }
    }

    RandomAccessFile类简介


    RandomAccessFile类用来随机访问文件,可以在任何位置开始读写文件。

    文件模型

    在硬盘上文件时byte by byte存储的,每个byte数据有位置序号,序号类型是long。

    文件数据            data    41   42   43  44    00    00    00   ff 

     --->这个文件由8个byte组成(每个byte由2个16进制组成)

    文件数据位置long  index   0    1    2    3    4     5     6    7

    文件访问指针      pointer  ~

    打开文件

    有两种模式”rw”(读写)、”r”(只读)

    RandomAccessFile  raf = new RandomAccessFile(File  file ,”rw” );//文件存在

    RandomAccessFile  raf = new RandomAccessFile(String  filename ,”rw” );//文件不存在

    如果文件不存在,会先创建文件。打开文件时候默认文件指针在开头pointer=0。

    RandomAccessFile类读写方法


    RandomAccessFile raf=new  RandomAccessFile( filename, rw );

    写文件

    raf.write(int b);将参数b的低8位写出到文件当前位置。如:b=0x12121241  写入的是41,前面121212丢弃掉每次写完自动移动指针到下个位置,准备下次写入。

    读取文件

    int b=raf.read();

    从文件的当前位置开始读取1个byte,将byte填充到int的低8位高24位保持0不变,如果读取到文件末尾返回0xffffffff(32个1)即-1。每读取一个数据,文件指针自动后移。

    关闭文件

    raf.close();文件读写完一定要关闭文件,如果不关闭,可能遇到一些意想不到的错误,根据具体操作平台不同会有不同。在使用过程中,切忌文件读写完成后要关闭文件。

    基于缓存的写方法

    void write(byte[] b) 将b.length个字节从指定字节数组写入到此文件,并从当前文件指针开始。

    void write(byte[] b, int off, int len) 将len个字节从指定字节数组写入到此文件,并从off(下标)处开始

    基于缓存的读方法

    int read( byte[] b ) 一次性读取长度为b.length的byte数据填充到b中,返回值是读取到的byte数量。返回值区间:(0 , b.length]是>0 ,如果返回-1表示读取到文件末尾了

    int read(byte[] b, int off, int len) 从位置off开始,读取len长度,填充到b中

    随机读写的方法

    void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作

    raf.seek(raf.length());//追加到文件的末尾,raf.length(),文件的字节长度

    int skipByte(int n):尝试跳过输入的n个字节以丢弃跳过的字节

    基本类型的读写方法

    读:writeInt  writeLong  writeDouble  writeBoolean  writeChar  writeChars(String)

         底层还是一个byte一个byte写。封装了移位操作。write(int i),写入的是i的低八位

    写:readInt()   readLong()   readDouble()

         底层还是一个byte一个byte读。封装了移位操作 int i=read() ,读到的byte放在i 的低八位

    序列化:将数据转换为n个byte序列的过程----->写

    反序列化:将n个byte序列转换为一个数据的过程---->读

    raf中最最基本的写出方法是write(byte b)

    字符串的读写方法

    char     readChar()

    String   readUTF()

    void    writeChar(char c); 一个字符两个字节,按双字节值将char写入该文件,先写高字节

    void    writeUTF(String  str); 使用UTF-8编码以与机器无关的方式将一个字符串写入该文件。UTF-8编码 将一个英文字符(两个字节)编码时,会将两个字节经过一个算法变成一个字节存入。解码时,再将一个字节解码成2个字节。

    注意:

    RandomAccessFile可以实现读写,与DateInputStream和DateOutputStream功能相似。

    RandomAccessFile实现了DataInput和DataOutput接口,

    DateInputStream实现了DateInput接口,DateOutputStream实现了DataOutput接口。

    RandomAccessFile案例


    public class TestFile {
        public static void main(String[] args) throws Exception {
            write(); // 测试写
            read();// 测试读
        }
    
        public static void write() {
            RandomAccessFile raf = null;
            try{
                // raf=new RandomAccessFile(new File("test"), "rw");//test存在时使用
                raf = new RandomAccessFile("test.txt", "rw");// text.txt不存在使用该构造器,会自动创建该文件
                // 'A'的二进制 0000000 0000000 0000000 1000001
                raf.write('A');// 写入低8位,2个字节,即1000001,字母用低八位就可以表示
                // raf.write('中');//汉字不可以,汉字用低八位表示不了
                raf.writeChar('中');// 直接写入一个字符
    
                byte[] strData = "大家好".getBytes("utf-8");// 要想写字符串,要先将字符串按照某个字符集转换为字节后,再写出
                raf.writeInt(strData.length);// 先把字符串长度写入
                raf.write(strData);
    
                int max = Integer.MAX_VALUE;// 0x 7f ff ff ff
                // 因为每次都是写第八位
                raf.write(max >>> 24);// 写入int的高8位
                raf.write(max >>> 16);
                raf.write(max >>> 8);
                raf.write(max);
    
                // 直接调用writeInt方法
                raf.writeInt(Integer.MIN_VALUE);
                raf.writeDouble(23.45);
                raf.writeBoolean(true);
                raf.writeUTF("测试");// 写入字符串
            }
            catch(Exception e){
    
            }
            finally{
                if(raf != null){
                    try{
                        raf.close();
                    }
                    catch(IOException e){
    
                    }
                }
            }
        }
    
        public static void read() {
            RandomAccessFile raf = null;
            try{
                raf = new RandomAccessFile("test.txt", "rw");
    
                // 注意读取要按照写的顺序读
                char c1 = (char)raf.read();
                System.out.println(c1);// 'A'
                char c2 = raf.readChar();
                System.out.println(c2);// '中'
                // 读取字符串,先读取字符串的长度
                int length = raf.readInt();
                byte[] bytes = new byte[length];
                // for(int i=0;i<10;i++){
                // bytes[i]=(byte) raf.read();
                // }
                raf.read(bytes);
                System.out.println(new String(bytes, "utf-8"));// 大家好
    
                // 读取int类型
                int b1 = raf.read();// 最高8位
                int b2 = raf.read();
                int b3 = raf.read();
                int b4 = raf.read();// 最低8位
                int i1 = b1 << 24 | b2 << 16 | b3 << 8 | b4;
                System.out.println(i1);// Max_Value
                int i2 = raf.readInt();
                System.out.println(i2);
                System.out.println(raf.readDouble());
                System.out.println(raf.readBoolean());
                System.out.println(raf.readUTF());
    
            }
            catch(Exception e){
            }
            finally{
                if(raf != null){
                    try{
                        raf.close();
                    }
                    catch(IOException e){
                    }
                }
            }
        }
    }

    复制文件

    public class TestFile {
        public static void main(String[] args) throws Exception {
            RandomAccessFile src = new RandomAccessFile("E:\test.pptx", "rw");
            RandomAccessFile des = new RandomAccessFile("E:\test复制.pptx", "rw");
            byte[] bytes = new byte[1024 * 10];// 一次读入10k到内存
            double count = 0;// 存储,读到的总子节数
            long sum = src.length();// 要复制的文件的总字节数
            int len = -1;
            while((len = src.read(bytes)) != -1){// len为读到的字节数,等于-1时表示读到末尾
                des.write(bytes, 0, len);
                // 用des.write(bytes)会有风险,最后不满足10k时也读了10k,多读了一些0
                count += len;
                // 显示复制的进度
                DecimalFormat df = new DecimalFormat("#.##");
                double d = Double.parseDouble(df.format(count * 100 / sum));
                System.out.println("进度:" + d + "%");
            }
            src.close();
            des.close();
        }
    }
  • 相关阅读:
    django 使用form组件提交数据之form表单提交
    django from验证组件
    django中间件
    gin中http重复解析body数据失败
    go 常用工具链
    git 提交规范
    go简单实现heap
    Go优雅实现选传参数
    [已解决]protoc-gen-go: unable to determine Go import path for "xxx.proto"
    Go编译工具命令
  • 原文地址:https://www.cnblogs.com/qin-derella/p/6646836.html
Copyright © 2020-2023  润新知