Java学习笔记-09【IO】【下】

Java学习笔记-09【IO】【下】

File类

File类常用方法

方法声明功能描述
File(String pathname)通过指定的一个字符串类型的文件路径创建一个新的File对象
File(String parent,String child)根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名)创建一个File对象
File(File parent,String child)根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象
boolean exists()判断File对象对应的文件或目录是否存在,若存在返回true,否则返回false
boolean delete()删除File对象对应的文件或目录,若成功删除则返回true,否则返回false
boolean createNewFile()当File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false
String getName()返回File对象表示的文件或文件夹的名称
String getPath()返回File对象对应的路径
String getAbsolutePath()返回File对象对应的绝对路径(在UNIX/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径)
String getParent()返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录)
boolean canRead()判断File对象对应的文件或目录是否可读,若可读返回true,否则返回false
boolean canWrite()判断File对象对应的文件或目录是否可写,若可写返回true,否则返回false
boolean isFile()判断File对象对应的是否是文件(不是目录),若是文件返回true,否则返回false
boolean isDirectory()判断File对象对应的是否是目录(不是文件),若是目录返回true,否则返回false
boolean isAbsolute()判断File对象对应的文件或目录是否是绝对路径
long lastModified()返回1970.01.01.00:00:00到文件最后修改时间的毫秒值
long length()返回文件内容的长度
String[] list()列出指定目录的全部内容,只列出名称
File[] listFiles()返回一个包含了File对象所有子文件和子目录的File数组
import java.io.File;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("example.txt");    //创建File文件对象,表示一个文件
        System.out.println("文件名称:"+file.getName()); //获取文件名称
        System.out.println("文件的相对路径:"+file.getPath());//获取文件的相对路径
        System.out.println("文件的绝对路径:"+file.getAbsolutePath());//获取文件的绝对路径
        System.out.println("文件的父路径:"+file.getParent());//获取文件的父路径
        System.out.println(file.canRead()?"文件可读":"文件不可读");//判断文件是否可读
        System.out.println(file.canWrite()?"文件可写":"文件不可写");//判断文件是否可写
        System.out.println(file.isFile()?"是一个文件":"不是一个文件");//判断是否是一个文件
        System.out.println(file.isDirectory()?"是一个目录":"不是一个目录");//判断是否是一个目录
        System.out.println(file.isAbsolute()?"是绝对路径":"不是绝对路径");//判断是否是一个绝对路径
        System.out.println("最后修改时间:"+file.lastModified());//得到文件最后修改时间
        System.out.println("文件大小:"+file.length()+"byte");//获取文件大小
        System.out.println("是否成功删除文件:"+file.delete());//是否成功删除文件
    }
}

运行结果:

文件名称:example.txt
文件的相对路径:example.txt
文件的绝对路径:F:\IntelliJ IDEA-workspace\Test\example.txt
文件的父路径:null
文件可读
文件可写
是一个文件
不是一个目录
不是绝对路径
最后修改时间:1571371868243
文件大小:6byte
是否成功删除文件:true

遍历目录下的文件

import java.io.File;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("f:\\MyBooks");    //创建File对象,表示一个目录
        if(file.isDirectory()){ //判断File对象对应的目录是否存在
            String[] names = file.list();   //获取目录下的所有文件的文件名
            for (String name:names) {   //遍历文件名
                System.out.println(name);
            }
        }
    }
}

运行结果:

程序员的数学 1 数学思维.pdf
程序员的数学 1 数学思维.txt
程序员的数学 2 概率统计.pdf
程序员的数学 2 概率统计.txt
程序员的数学 3 线性代数.pdf
程序员的数学 3 线性代数.txt

如果想得到某种后缀名的文件比如.txt的,File类中提供了一个重载的list(FilenameFilter filter)方法。FilenameFilter是一个接口,被称作文件过滤器,当中定义了一个抽象方法accept(File dir,String name),在调用list()方法时,需要实现文件过滤器,在accept()方法中做出判断。

import java.io.File;
import java.io.FilenameFilter;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("f:\\MyBooks");    //创建File对象,表示一个目录
        //创建过滤器对象
        FilenameFilter filter = new FilenameFilter() {
            //实现accept()方法
            public boolean accept(File dir, String name) {
                File currFile = new File(dir,name);
                //如果文件名以.txt结尾返回true,否则返回false
                if(currFile.isFile()&&name.endsWith(".txt")){
                    return true;
                }else{
                    return false;
                }
            }
        };
        if(file.exists()){//判断File对象对应的目录或文件(这里的对象是目录)是否存在
            String[] lists = file.list(filter);//获得过滤后的所有文件名数组
            for(String name:lists){
                System.out.println(name);
            }
        }
    }
}

运行结果:

程序员的数学 1 数学思维.txt
程序员的数学 2 概率统计.txt
程序员的数学 3 线性代数.txt

如果想得到所有子目录要使用listFiles()方法,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历则需使用递归。

import java.io.File;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
        fileDir(file);
    }
    public static void fileDir(File dir){
        File[] files = dir.listFiles(); //获得表示目录下所有文件的数组
        for(File file:files){   //遍历所有子目录和文件
            if(file.isDirectory())
                fileDir(file);  //如果是目录,递归调用fileDir()
            System.out.println(file.getAbsolutePath()); //输出文件绝对路径
        }
    }
}

运行结果:

f:\新建文件夹\新建文件夹\新建 DOCX 文档.docx
f:\新建文件夹\新建文件夹
f:\新建文件夹\新建文件夹 (2)\新建文件夹
f:\新建文件夹\新建文件夹 (2)\新建文件夹 (2)\新建文本文档.txt
f:\新建文件夹\新建文件夹 (2)\新建文件夹 (2)
f:\新建文件夹\新建文件夹 (2)
f:\新建文件夹\新建文件夹 (3)
f:\新建文件夹\新建文件夹 (4)\新建 PPTX 演示文稿.pptx
f:\新建文件夹\新建文件夹 (4)
f:\新建文件夹\新建文本文档 (2).txt
f:\新建文件夹\新建文本文档.txt

删除文件及目录

import java.io.File;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
        if(file.exists()){
            System.out.println(file.delete());
        }
    }
}

运行结果:

false

可以看到删除失败了,因为该目录下包含了子目录或文件。所以这种情况需要用递归方式将整个目录以及其中的文件全部删除。

import java.io.File;
public class Test{
    public static void main(String[] args) throws Exception{
        File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
        deleteDir(file);
        System.out.println("是否删除成功:"+!file.exists());
    }
    public static void deleteDir(File dir){
        if(dir.exists()){   //判断传入的File对象是否存在
            File[] files = dir.listFiles(); //获得目录下所有文件的数组
            for(File file:files){
                if(file.isDirectory())
                    deleteDir(file);//如果是目录,递归
                else
                    file.delete();//如果是文件,直接删除
            }
            dir.delete();//删除完一个目录里的所有文件后,就删除这个目录
        }
    }
}

运行结果:

是否删除成功:true

RandomAccessFile

在IO包中,提供了一个类RandomAccessFile,它不属于流类,但具有读写文件数据的功能,可以随机地从文件的任意位置开始执行读写数据的操作。

它可以将文件以只读或者读写的方式打开,它的两个构造方法,RandomAccessFile(File file,String mode)【参数file指定被访问的文件,参数mode指定访问文件的模式】和RandomAccessFile(String name,String mode)【参数name指定被访问文件的路径,参数mode指定访问文件的模式】。

参数mode有四个值,最常用的有两个“r”(只读方式打开文件,如过执行写入操作,会抛出IOException异常)和“rw”(读写方式打开文件,如果该文件不存在会自动创建)。

RandomAccessFile定位文件位置的方法

方法声明功能描述
long getFilePointer()返回当前读写指针所处的位置
void seek(long pos)设定读写指针的位置,与文件开头相隔pos个字节数
int skipBytes(int n)使读写指针从当前位置开始,跳过n个字节
void setLength(long newLength)设置此文件的长度

当新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处)。

创建一个文件“time.txt”里面写有“3”。

import java.io.RandomAccessFile;
public class Test{
    public static void main(String[] args) throws Exception{
        RandomAccessFile raf = new RandomAccessFile("time.txt","rw");
        //int times = 0;
        int times = Integer.parseInt(raf.readLine());//第一次读取文件时times为3
        if(times>0){
            //试用一次减少一次
            System.out.println("你还可以试用"+times--+"次!");
            raf.seek(0);    //使记录指针指向文件开头
            raf.writeBytes(times+"");   //将剩余次数再次写入文件
        }else{
            System.out.println("软件试用次数已到");
        }
        raf.close();
    }
}

5次运行结果:

你还可以试用3次!
你还可以试用2次!
你还可以试用1次!
软件试用次数已到
软件试用次数已到

字符编码

字符码表是一种可以方便计算机识别的特定字符集,它是将每个字符和一个唯一的数字对应而形成的一张表。

解码和编码二进制的字节序列和明文的字符序列之间的转换。如果要把字节数组转换为字符串,可以用String类的构造方法String(byte[] bytes,String charsetName),反之可以通过String类的getBytes(String charsetName)方法把字符串按照指定的码表编码成字节数组。

import java.util.Arrays;
public class Test{
    public static void main(String[] args) throws Exception{
        String str = "中国";
        byte[] b1 = str.getBytes(); //利用默认的码表编码
        byte[] b2 = str.getBytes("GBK");    //使用GBK编码
        byte[] b3 = str.getBytes("UTF-8");  //使用UTF-8编码
        System.out.println(Arrays.toString(b1));    //打印字节数组的字符串形式
        System.out.println(Arrays.toString(b2));
        System.out.println(Arrays.toString(b3));
        String result1 = new String(b1);
        String result2 = new String(b2,"GBK");
        String result3 = new String(b3,"UTF-8");
        String result4 = new String(b2,"ISO8859-1");
        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
        System.out.println(result4);
    }
}

运行结果:

[-42, -48, -71, -6]
[-42, -48, -71, -6]
[-28, -72, -83, -27, -101, -67]
中国
中国
中国
???ú

Windows系统默认使用GBK码表,可以看到ISO8859-1对GBK解码时出现四个问号,这是因为编码解码的码表不一致造成的。为此,可以将“中国”GBK编码→ISO8859-1解码→ISO8859-1编码→GBK解码。

public class Test{
    public static void main(String[] args) throws Exception{
        String str = "中国";
        byte[] b = str.getBytes("GBK");
        String temp = new String(b,"ISO8859-1");
        System.out.println(temp);
        byte[] b1 = temp.getBytes("ISO8859-1");
        String result = new String(b1,"GBK");
        System.out.println(result);
    }
}

运行结果:

???ú
中国

:不是每次解码的时候都可以通过逆向思维方式来得到正确结果的。

字符传输,当通过FileReader读取一个编码格式为GBK的文件,并将读取到的数据通过FileWrite写入一个编码格式为UTF-8的文件时,则会出现乱码现象。

转换流,通过构造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamWriter(OutputStream in,String charsetName)创建流对象时,可以将需要读写的数据指定编码格式。

import java.io.*;
public class Test{
    public static void main(String[] args) throws Exception{
        //创建InputStreamReader对象,字节流转换为字符流
        Reader reader = new InputStreamReader(new FileInputStream("1.txt"),"GBK");
        //创建OutputStreamWriter对象
        Writer writer = new OutputStreamWriter(new FileOutputStream("2.txt",true),"UTF-8");
        char[] ch = new char[100];  //定义一个字符数组
        int len;
        len = reader.read(ch);  //将文件的内容读取到字符数组
        String string = new String(ch,0,len);   //使用字符数组创建字符串
        writer.write(string);   //向目标文件写入字符串
        reader.close();
        writer.close();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值