2020年10月

文件是一种特殊的存储结构。 java.io 提供 File 对象来操作文件和目录

  • 根据 文件路径 构造File对象

    • 在windows平台使用\作为路径分隔符,在Java字符串中需要用\表示一个。linux平台使用/作为路径分隔符
    • 绝对路径、相对路径
      . 表示当前目录,.. 表示上级目录
相对路径:
//假设当前目录是 c:\Docs
File f1 = new File("sub\\javac")    绝对路径是c:\Docs\sub\javac
File f2 = new File(".\\sub\\javac")     绝对路径是c:\Docs\sub\javac
File f3 =  new File("..\\sub\\javac")    绝对路径是c:\sub\javac
绝对路径
public class IO {
    public static void main(String[] args) {
        File file = new File("/Users/ireneliu/Desktop/network-rmi");
        System.out.println(file);
    }
}
//输出
/Users/ireneliu/Desktop/network-rmi
  • getPath()返回构造方法传入的路径, getAbsolutePath()返回绝对路径, getCanonicalPath()返回规范路径
public class IO {
    public static void main(String[] args) {
        File file = new File("..");
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        try {
            System.out.println(file.getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//输出
..
/Users/ireneliu/Desktop/thread-multi/..
/Users/ireneliu/Desktop
  • File.separator() 得到当前平台的系统分隔符
public class IO {
    public static void main(String[] args) {
        System.out.println(File.separator);
    }
}
//输出
/
  • File对象既可以代表文件,也可以代表目录。在构造对象时,即使传入的文件、目录不存在也没有关系,在此时不进行磁盘操作,只有在调用对象的方法时,才会有磁盘操作。

    • isFile()判断是否是一个已存在的文件
    • isDirectory()判断时候是一个已存在的目录
public class IO {
    public static void main(String[] args) {
        File file = new File("/Users/ireneliu/Desktop/thread-multi");
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());

    }
}
//输出
false
true
  • 判断文件的权限和大小

    • boolean canRead() 是否可读
    • boolean canWrite() 是否可写
    • boolean canExecute() 是否可执行(对于目录来说,是否可执行表示能否列出它包含的文件和子目录)
    • long length() 文件字节大小 此方法需要注意,在对文件进行操作前,可先判断文件大小是否为空,避免在出现空文件的异常
  • 创建文件/创建临时文件、删除文件/删除临时文件
创建文件、删除文件
File file = new File("..");
file.createNewFile();
file.delete();

创建临时文件、删除临时文件
public class IO {
    public static void main(String[] args) {
        try {
            File file1 = File.createTempFile("irene-", ".doc");
            file1.deleteOnExit();  //JVM退出时,自动删除临时文件
            System.out.println(file1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
输出
/var/folders/99/j5sp4mgx68l_bvhbxx7q0nqm0000gn/T/irene-5560752089868481670.doc

irene-是临时文件的前缀
.doc是临时文件的后缀
file1.deleteOnExit() 必须在try里面,因为file1的作用范围相当于是一个局部变量,否则就超出其作用范围了。

RMI支持存储于不同地址空间(不同Jvm)的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。提供服务的一端被称为服务端,使用服务的为客户端。

  • 实现RMI的一个前提是 服务端和客户端实现同一个接口,此接口必须满足以下两点:

    • 继承自 java.rmi.Remote
    • 接口内的每个方法声明抛出 throws RemoteException

    一个最简单的RMI例子:服务器会提供一个WorldClock服务,允许客户端获取指定时区的时间

public interface WorldClock extends Remote {
    LocalDateTime getLocalDateTime(String zoneId) throws RemoteException;
}
  • 服务端分为两部分,一部分是服务的实现,一部分是将服务以RMI的形式暴露在网络上

    • 服务的实现
public class WorldClockService implements WorldClock{
    @Override
    public LocalDateTime getLocalDateTime(String zoneId) throws RemoteException {
        return LocalDateTime.now(ZoneId.of(zoneId)).withNano(0);
    }
}
  • 将服务以RMI的形式暴露在网络上
public class Server{
    public static void main(String[] args) throws RemoteException {
        WorldClock worldClock = new WorldClockService();
        WorldClock skeleton =  (WorldClock)UnicastRemoteObject.exportObject(worldClock, 0);
        Registry registry = LocateRegistry.createRegistry(1009);
        registry.rebind(WorldClock.class.getSimpleName(), skeleton);
    }
}
  • 客户端调用服务
public class Client{
    public static void main(String[] args) throws RemoteException, NotBoundException {
        Registry registry = LocateRegistry.getRegistry("localhost", 1009);
        WorldClock worldClock = (WorldClock) registry.lookup(WorldClock.class.getSimpleName());
        LocalDateTime now = worldClock.getLocalDateTime("Asia/Shanghai");
        System.out.println(now);
    }
}

正则表达式

  • 一个字符串就是一个简单的正则表达式,例如 Hello World 正则表达式匹配“hello world”字符串
  • . 匹配任意的一个字符
  • s+ 可以匹配多个空格
  • ^ 定义了以什么开始
  • $ 以什么结束
  • \d+ 匹配一个或者多个数字
  • ? 设置括号内的选项是可选的
  • \. 匹配*.*
  • * 零次或多次匹配前面的字符或子表达式。例如,zo 匹配"z"和"zoo"。 等效于 {0,}。
  • + 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
  • {n} 正好匹配n次
  • {n,} 至少匹配2次
  • {n,m} 匹配至少n次,至多m次

java.util.regex主要包括3个类:

  • Pattern类
  • Matcher类
  • PatternSyntaxException
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
import java.util.regex.*;
 
class RegexExample1{
   public static void main(String args[]){
      String content = "I am noob " +
        "from runoob.com.";
 
      String pattern = ".*runoob.*";
 
      boolean isMatch = Pattern.matches(pattern, content);
      System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
   }
}

输出:
字符串中是否包含了 'runoob' 子字符串? true