JAVA I/O (一)

一、关于I/O
什么是I/O?
I:Input 输入
O:output 输出
这里的输入、输出是针对于当前的应用程序而言的。
输出:应用程序把数据输出到:"控制台"、“文件”、“网络”、“打印机”……
输入:把数据读取到应用程序中:“键盘”、“网络”……
 
二、关于Java文件
 
2.1 文件的构造
关于表示文件的类:java.io.File
它是文件和目录路径名的抽象表示形式
文件和目录(文件夹)都是有File对象来表示,注意:要表示文件和目录都要使用对应的路径名
如我们要得到磁盘中的文件的对象(如:D:\a.txt)
代码如下:
File file = new File("D:\\a.txt");
对么要表示一个文件夹则代码如下
File file1 = new File("D:\\");
注意: 这里的路径中的分隔符使用了两个\\是由於单个的\会被认为是转义字符来处理,\\则表示转义为一个\
我们看一看File的构造方法
public File(String pathname) {
    if (pathname == null) {
        throw new NullPointerException();
    }
    this.path = fs.normalize(pathname);
    this.prefixLength = fs.prefixLength(this.path);
}
这里看到我们要构造一个File对象的时候转入了一个路径。
 
2.2 文件路径
我们拿到这个文件对像后我们如何获取它的路径呢?
通过对象调用方法getPath,来获得path属性的值(注意:getPath获取的值与构造时传入的值相关,构造时传入的是什么则返回什么)
file.getPath();
注意:获取到的path属性的值中的路径分隔符也只会有一个\
我们写这个路径的分隔符时每次都要记得使用两个\\以便转义,另外还有一种通用的写法就是/
\\与/的区别:
\\:windows操作系统中可识别
/:是一种通用的写法,在其它的系统中(如:linux、网络)都可以识别(建议使用)
还有一种对于分隔符的写法:File f = new File("d:" +File.separator+"a.txt");
注意:这种写法书写上会相对复杂,每一个分隔符处都要使用File.separator进行替换
使用File类中的常量:
public static final char separatorChar = fs.getSeparator();
public static final String separator = "" + separatorChar;
 
路径的分类
在构造时除了上面路径的格式外,还有以下几种形式,如下所示:
    File file1 = new File("../../javaio/1.txt");
    File file2 = new File("/javaio/2.txt");
    File file3 = new File("javaio/3.txt");
    File file4 = new File("D:/1.txt");
创建对象时传入的路径:getPath()
这个时候进行getPath分别获取file1,file2,file3的路径结果如下
    System.out.println("-----------------getPath()---------------------");
    System.out.println("path1 = " + file1.getPath());
    System.out.println("path2 = " + file2.getPath());
    System.out.println("path3 = " + file3.getPath());
    System.out.println("path4 = " + file4.getPath());
这个时候输出的结果如下:
-----------------getPath()---------------------
path1 = ..\..\javaio\1.txt
path2 = \javaio\2.txt
path3 = javaio\3.txt
path4 = D:\1.txt
 
绝对路径,调用getAbsolutePath()方法:
    System.out.println("---------------getAbsolutePath()---------------");
    System.out.println("AbsolutePath1 = " + file1.getAbsolutePath());
    System.out.println("AbsolutePath2 = " + file2.getAbsolutePath());
    System.out.println("AbsolutePath3 = " + file3.getAbsolutePath());
    System.out.println("AbsolutePath4 = " + file4.getAbsolutePath());
这个时候输出的结果如下:
---------------getAbsolutePath()---------------
AbsolutePath1 = D:\IdeaProjects\SEDemo\..\..\javaio\1.txt
AbsolutePath2 = D:\javaio\2.txt
AbsolutePath3 = D:\IdeaProjects\SEDemo\javaio\3.txt
AbsolutePath4 = D:\1.txt
 
我们从上面输出的结果可以看到它把当前应用所在的目录加上去了。
    注意:
        file4由于初始化的时候就已经是一个绝对路径了所以它没有拼上我们当前就用所在的目录
        file2由于我们初始化的时候是/开头表示根目录,那这里的根目录是表示我们应用程序文件所在磁盘的根目录,它是在D盘所以这里显示为D:\javaio\2.txt
 
规范路径,调用getCanonicalPath()方法
    System.out.println("--------------getCanonicalPath()---------------");
    System.out.println("CanonicalPath1 = " + file1.getCanonicalPath());
    System.out.println("CanonicalPath2 = " + file2.getCanonicalPath());
    System.out.println("CanonicalPath3 = " + file3.getCanonicalPath());
    System.out.println("CanonicalPath4 = " + file4.getCanonicalPath());
这个时候输出的结果如下:
--------------getCanonicalPath()---------------
CanonicalPath1 = D:\javaio\1.txt
CanonicalPath2 = D:\javaio\2.txt
CanonicalPath3 = D:\IdeaProjects\SEDemo\javaio\3.txt
CanonicalPath4 = D:\1.txt
从规范路径我们可以看到像..\这样的路径已经没有了,会自动把这个路径所在的位置解析出来
 
2.3 文件名称
需要获取文件名称,可以调用方法:getName(),如下面的代码:
    File file = new File("D:/download/hello.txt");
    System.out.println("文件名:" + file.getName());
这个时候运行输出的结果为:
文件名:hello.txt
注意:文件名称是包含扩展名称的
如果我们想要获取后缀的扩展名称我们需要自己使用String的方法来进行截取操作
    String ext = fileName.substring(fileName.lastIndexOf('.'));
    System.out.println("文件名后缀:" + ext);
运行后的结果如下:
文件名后缀:.txt
另一种方式获取文件的后缀名方法
    String[] splits = fileName.split("\\.");
    System.out.println("文件名后缀:." + splits[splits.length-1]);
运行后的结果如下:
文件名后缀:.txt
 
2.4 文件的大小
调用文件对象的length()方法,可以获取到文件的字节大小
    System.out.println("文件大小(字节):" + file.length());
返回的结果如下:
文件大小(字节):14
关于length()方法跟踪源码如下:
 
public long length() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return 0L;
    }
    return fs.getLength(this);
}

final boolean isInvalid() {
    if (status == null) {
        status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                   : PathStatus.INVALID;
    }
    return status == PathStatus.INVALID;
}

 

注意:
   1.它判断当前的文件对象的path是否有效,如果无效则返回的结果是0,否则会计算文件的大小(当我们new出来一个路径不存在的文件对象,调用length方法时返回的结果为0L)
    2.length方法可以获取文件的大小但是不可以获取目录的大小
 
2.5 文件修改时间
调用lastModified()
    Calendar c = new Calendar.Builder().setInstant(file.lastModified()).build();
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
    System.out.println("最后修改时间:" + sdf.format(c.getTime()).toString());
运行结果如下:
最后修改时间:2020-06-21 18:42:09
注意:lastModified方法返回的是一个毫秒值,需要使用时间相关的类进行格式化操作
 
2.6 获取文件的父目录
调用getParent方法获取,它返回的是上级的目录名称
调用getParentFile方法获取,它返的是上级目录的文件对象
注意:如果只是为了拿到上级目录的名称可以使用getParent方法,如果需要在拿到了上级目录对象后再进行操作则可以使用getParentFile方法
    System.out.println("文件:" + file.getCanonicalPath() + ",它的父目录:" + file.getParent());
运行后结果如下:
文件:D:\download,它的父目录:D:\
 
2.7 获取下一级文件
调用list方法会返回一个String[],存放了下一级文件的名称
调用listFiles方法返回的是一个File[],存放下一级的文件对象
注意:如果只是为了拿到下一级的文件名称则可以使用list方法;如果在拿到下一级的文件后还需要进行后续的操作建议使用listFiles方法
    System.out.println("文件:" + file.getCanonicalPath() + "的下级文件:");
    String[] list = file.list();
    for (String s : list) {
    System.out.println(s);
    }
运行后的结果如下:
文件:D:\download的下级文件:
hello.txt
xie
注意:如果指定的文件不存在可者它本身不是一个目录则会返回null,这个时候我们如上进行遍历会产生空指针异常
 
2.8 文件判断
   1.是否存在文件 file.exists()
   2.判断是否为文件 file.isFile()
  1. 判断是否为目录 file.isDirectory()
  2. (只读、可写、是否隐藏……)
注意:如果我们的file对象对应的文件不存在时上述三个返回的结果都会是false
 
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章