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