输入输出(二)
读写二进制数据
DataInput和DataOutput接口
DataOutput接口有以二进制格式写数组、字符、boolean值和字符串的方法。
而为了读回数据,可以使用DataInput接口中定义的以下方法:
DataInputStream实现了DataInput接口,为了从文件中读入二进制数据,可以将DataInputStream与某个字节源组合,例如FileInputStream:
DataInputStream in = new DataInputStream(
new FileInputStream("file"));
与此类似,想要写出二进制数据,你可以使用实现了DataOutput接口的DataOutputStream类:
DataOutputStream in = new DataOutputStream(
new FileOutputStream("file"));
随机访问文件
RandomAccessFile类可以在一个文件中通过一个类似指针的东西(.seek()方法)来定位到某个位置,来访问它,普通的流只能通过.read()方法一个一个挨着读。
.seek()//接受一个long类型的整数,它的值位于0到文件按照字节来度量的长度之间。
.getFilePointer()//返回文件指针的当前位置。
.length()//返回当前文件按照字节来度量的长度。
对象输入输出流与序列化
保存和加载序列化对象
我们可以用ObjectOutputStream/ObjectInputStream来将对象进行保存或者读出操作。
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("file"));
F f= new F();
oos.writeObject(f);//将对象f写入文件、内存中。
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("file"));
F f1 = (F) ois.readObject();//将对象读回 并且存入f1当中。
这一切的前提是 这个类 实现了SeriaLizable接口。
操作文件
Path
Path表示的是一个目录名序列,其后面还可以跟一个文件名,
路径中的第一个部件可以是根部件,例如/或C:\(取决于操作系统),以根部件开头的是绝对路径。 否则就是相对路径。
例:
Path p1 = Paths.get("a","b","c");
为什么要这样做?
因为假设一段根据Unix系统做出的代码,里面的路径是Unix系统能识别的以/开头的路径,现在要转发到Windows系统中去,那么这串代码是不能够执行的,因为不同的系统中分隔符是不一样的,识别不了,要么一个一个改要么重新写代码,会非常麻烦。
如果用了Paths,Paths.get()方法内不需要有分隔符,只需要将文件挨个写入进去,分隔符会自动根据系统生成并且识别。非常方便。
Paths.get()方法中填写的文件不一定非要真实存在,他只是一串路径。
Path中还有很多实用的方法。
读写文件
Files类:
Java中File类是1.0版本出现的,已经非常老了,但是在java7.0版中将Path类和File类进行了一些类似兼容的操作,使之更加方便操作。
Path path = Paths.get("E:\\file.txt");//这时一个路径
byte[] bytes =Files.readAllBytes(path);//将这个文件转成一个byte字节类型的数组
String content = new String(bytes,Charset.defaultCharset());//将这个字节数组转换为字符串格式 编码是默认的。
如果需要将文件当作行序列读入,可以调用:
List<String> list = Files.readAllLines(path, Charset.defaultCharset());
如果想将一个字符串写出到文件中,可以调用:
String content = "Hello,World!";
Path p1 = Files.write(path, content.getBytes(Charset.defaultCharset()));
如果这个文件已经存在,可以调用方法在后面追加,接着写:
Path p1 = Files.write(path, content.getBytes(Charset.defaultCharset()),StandardOpenOption.APPEND);
注意:如果不加这个方法,原始内容会被覆盖
还可以将一个行的集合写出到文件中去。
Path p1 = Files.write(path,lines);
创建文件和目录
创建一个新的目录:
Path path1 = Files.createDirectory(path);
注意:这里的path路径中是有要求的,除了最后一个部件外,其他部分必须是真实存在的。
如果真的要创建一串目录,那么调用:
Path path1 = Files.createDirectories(path);
创建一个空文件:
Path path1 = Files.createFile(path);
注意:如果文件已经存在,那么就会抛出异常
也可以用Files来创建临时目录。
Path path1 = Files.createTempDirectory(path);
复制移动和删除文件
复制文件:
Path formPath = Paths.get("E:\\Halo.txt");
Path toPath = Paths.get("E:\\Copy.txt");
Path path1 = Files.copy(formPath, toPath);
移动文件(即删除并赋值源文件):
Path move = Files.copy(formPath, toPath);
删除文件:
Path move = Files.delete(formPath);
注意:如果这个文件不存在,那么就会抛出异常
获取文件信息
Path path = Paths.get("E:\\Halo.txt");
System.out.println(Files.exists(path));//查看文件是否存在
System.out.println(Files.isHidden(path));//查看文件是否是隐藏的
System.out.println(Files.isReadable(path));//查看文件是否是可读的
System.out.println(Files.isDirectory(path));//查看文件是否是一个目录
System.out.println(Files.size(path));//查看文件大小
正则表达式
正则表达式用于指定字符串的模式。
下面是一个例子:
Pattern pattern = Pattern.compile("^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$");
Matcher matcher = pattern.matcher("1540630291@qq.com");
if (matcher.matches()){
System.out.println("匹配");
}else{
System.out.println("不匹配");
}
输出结果是:匹配