输入输出(二)

读写二进制数据

DataInput和DataOutput接口

DataOutput接口有以二进制格式写数组、字符、boolean值和字符串的方法。

用java输出二进制 java中如何输入二进制数_用java输出二进制


而为了读回数据,可以使用DataInput接口中定义的以下方法:

用java输出二进制 java中如何输入二进制数_二进制数_02


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("不匹配");
}
输出结果是:匹配