JAVA
输入/输出
(I/O)是计算机程序执行的最常见操作之一:
①创建和删除文件
②从文件或者网络套接字读取,写入文件或者网络套接字
③讲对象序列化(或者保存)到持久性存储中,检索保存的对象
文件系统和路径
一个文件系统可以包含三个类型的对象:文件、目录(也称为文件夹)和符号链接。
位于目录树最上面的目录称为根目录,Linux和UNIX的变体都有一个根目录,而Windows可以用多个根目录
文件系统中的对象可以用路径来唯一识别。
路径可以是绝对的,也可以是相对的:
①绝对路径中具有指向文件系统中对象的所有信息
②相对路径中则没有所需的全部信息
在JAVA中,文件或者目录习惯上是用java.ip.File 对象来表示的,但是 File类有很多的缺陷, JAVA7 在它的 NO2包中带来了更好的替代:java.nio.file.Path 接口
Path 接口的名字非常恰当,它就是表示路径的,可以是一个文件、目录或者是一个符号链接,它也可以表示一个根目录
FileSystem 类 表示文件系统,它是一个抽象类,可以调用FileSystems.getDefault()静态方法来获取当前的文件系统:
FileSystem fileSystem = FileSystems.getDefault();
FileSystem 还有其他的方法。
getSeparator 方法返回 String 的名称分隔符,在Windows中就是\,在UNIX/Linux中就是/:
public abstract java.lang.String getSeparator()
FileSystem 的另一个方法是getRootDirectories,它返回用于迭代根目录的Iterable
public abstract java.lang.Iterable<Path> getRootDirectories()
可以使用FileSystem 的getPath 方法来创建 Path:
public abstract Path getPath(String first,String...more)
getPath 中只有first参数是必须的,more参数是可选的。如果有more参数,要把它放在first参数的后面
java.nio.file.Paths类提供了一个快捷方法,可以通过它的静态get方法创建Path:
Path path1 = path.get("/home/user/images");
Path path2 = path.get("/home","user","images");
Path path3 = path.get("C:\temp");
Path path4 = path.get("C:\","temp");
像/home/user/images 或者 C:\temp 这样的路径我们可以将它分解成不同的部分
前者有三个名称:home、user和images 后者只有一个名称:temp,因为不算根目录
Path中的getNameCount方法返回路径中名称的数量,用getName可以检索到每个名称:
Path getName(int index)
index参数是从0开始的,它的值必须在0和元素数量减1之间,最靠近根目录的第一个元素的索引为0
其他重要的Path方法还有getFileName、getParent和getRoot
Path getFileName() Path getParent() Path getRoot()
文件和目录的处理与操作
java.nio.file.Files是一个非常强大的类,提供了处理文件和目录以及读取文件和写入文件的静态方法
可以用它创建和删除路径、复制文件、检查路径是否存在等,此外 Files还拥有创建流对象的方法
创建和删除文件与目录
使用Files的createFile 方法来创建文件:
public static Path createFile(Path file,
java.nio.file.attribute.FileAttribute<?>...attrs)
attr参数是可选的,如果不需要设置属性那就可以忽略它,例如:
Path newFile = Paths.get("/home/jayden/newFile.txt");
如果不存在父目录,createFile就会抛出一个IOException,如果已经存在由file指定名称为文件、目录或者符号链接,那就会抛出一个FileAlreadyExistsException
用createDirectory方法来创建目录
public static Path createDirectory(Path directory,
java.nio.file.attribute.FileAttribute<?>...attrs)
和createFile一样,createDirectory也可能会抛出一个IOException或者FileAlreadyExistsException
用delete方法来删除文件、目录或者符号链接:
public static void delete(Path path)
如果path是一个目录,那么这个目录必须是空的。如果path是一个符号链接,那么只会删掉链接而不会删掉链接的目标。如果path不存在,则会抛出NoSuchFileException
删除路径时必须检查路径是否存在,可以使用 deleteIfExists:
public static void deleteIfExists(Path path)
如果正在用deleteIfExists 删除目录,这个目录必须是空的,如果不是空的就会抛出DirectoryNotEmptyException
检索目录的对象
可用Files类的newDirectoryStream方法来检索目录中文件、子目录和符号链接,这个方法将返回一个DirectoryStream来迭代目录中所有的对象
newDirectoryStream方法的签名如下:
public static DirectoryStream<Path> newDirectoryStream(Path path)
此方法返回的DirectoryStream使用后必须关闭
复制和移动文件
复制文件和目录有三个copy方法,最易于使用的是:
public static Path copy(Path source, Path target,
CopyOption 是java.nio.file中的一个接口 StandardCopyOption枚举是它的一个实现,
三个复制选项:
ATOMIC_MOVE ,将移动文件作为原子文件系统操作
COPY_ATTRIBUTES,把属性复制给新文件
REPLACE_EXISTING,如果文件存在,替换它
文件的读取和写入
File类提供了读取和写入小型二进制文件和文本文件的方法:readAllBytes和readAllLines 方法
两个write方法重载都有一个可选的OpenOption,第二个方法重载还有一个Charset
OpenOption接口定义了用来打开文件写入的选项
StandardOpenOption枚举实现OpenOption接口并提供下面的值
Append:如果打开文件进行写入,那么要写入的数据将添加到文件的末尾
Create:如果不存在就创建一个新文件
Create_New:如果已经存在,就创建一个新文件并抛出异常
Delete_on_close:关闭时删除文件
Dsync:指示文件内容的更新会同步写入
Read:打开文件进行读取
Sparse:稀疏文件
Truncate_Existing:如果文件打开进行写入,并且文件已经存在,就把文件的长度缩短到0
Write:打开文件进行写入
泛型
所有的Java类都衍生自 java.lang.Object,即所有Java的对象都可以转换成Object
泛型类型也可以接受参数:MyType<typeVar1,typeVar2,...>
例如要声明一个java.util.List:
List<E> myList;
E称为类型变量,即要被类型替换的变量,然后将替换类型变量的值用作参数类型,或者方法的返回类型,或者泛型类型中的方法。
使用类型变量E的泛型类型允许在声明或者实例化泛型类型时传递E。如果E是一个类的话,还可以传递E的子类;如果E是一个接口,还可以传递实现E的类
声明包含泛型的类的格式:
[访问修饰符] class 类名<泛型1,泛型2,…> {
泛型1 泛型成员1;
泛型2 泛型成员2;
//....
}
Linux 系统安全命令 常用的有:passwd 、su 、sudo、 chgrp、 chmod、 newgrp等 设置密码——passwd -d 删除密码 -f:随机产生一组密码,强行解开锁住的账户,必须与参数“-u”同时使用 -k:密码过期后,才能更新 -s:列出密码的相关信息 -u:解开已经上锁的账号,删除加上的“!”号,恢复账号密码 变更用户身份——su 从普通用户变更为root用户 su root 以user1用户身份登录,显示当前工作目录内容后恢复身份 su -c ls user1 以user1用户身份登录,更改工作目录,显示当前工作目录内容后退出 su - -c ls user1 以其他身份执行命令——sudo 使用root用户权限运行命令 sudo ls /root 更改文件或目录的所属群组——chgrp命令 更改install.log的群组 chgrp users install.log 把文件install.log的群组改回原来的名字 chgrp root install.log 改变文件的属组 改变/home/pss/test.txt的属组为pss chgrp -R pss /home/pss/test.txt 改变目录以及其下的所有文件的属组 改变目录/home/pss/mytest以及其下所有文件的属组为pss chgrp -R pss /home/pss/mytets 改变文件或目录的访问权限——chmod 数字类型改变文件权限 chmod 666 test chmod 777 test 符号类型改变文件属性 chmod a=wx test chmod:u=rwx,go=rx test