输入与输出
把输入/输出流家族中的成员按照他们的使用方法进行划分,可以分为处理字节和字符的两个单独的层次结构。
处理字节:InputStream和OutputStream的体系结构。
处理字符:Reader 和Writer的体系结构。
关于输入流与输出流的用法请点击此链接。
ZIP文档的读取
zip文档以压缩格式存储了一个或多个文件,每个zip文档都有一个头,包含诸如每个文件名字和所使用的压缩方法等信息。在java中,可以使用ZipInputStream来读入ZIP文档。你可能需要浏览文档中每个单独的项,getNetEntry方法就可以返回一个描述这些项的ZipEntry类型的对象。向ZipInputStream的getInputStream方法传递该项可以获取用于获取该项的输入流。然后调用closeEntry来读入下一项。
测试zip目录结构:
public class ZipIOLearn {
public static void main(String[] args) throws IOException {
//创建输入流
ZipInputStream zin = new ZipInputStream(new FileInputStream("doc/清算分析.zip"),Charset.forName("GBK"));
ZipEntry entry;
//获得zip文档中每个文档的信息头
while((entry = zin.getNextEntry()) != null){
System.out.println("name:"+entry.getName()+"\t size:"+entry.getSize()+"\t modifyTM:"+entry.getLastModifiedTime());
}
zin.closeEntry();
zin.close();
//创建空文件
Path path = Files.createFile(Paths.get("doc/test.txt"));
//创建输出流
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream("doc/清算分析2.zip"),Charset.forName("GBK"));
ZipEntry ze = new ZipEntry(path.toFile().getPath());
//向zip包中添加文件
zout.putNextEntry(ze);
zout.closeEntry();
zout.close();
}
}
结果:
name:清算分析/ size:0 modifyTM:2018-03-27T02:01:24Z
name:清算分析/1、快乐的我.txt size:898 modifyTM:2017-11-30T03:26:52Z
name:清算分析/2、快乐的你.txt size:10293 modifyTM:2017-12-13T02:32:24Z
name:清算分析/3、快乐的它.txt size:3170 modifyTM:2017-12-19T08:53:16Z
name:清算分析/4、学习java.txt size:1985 modifyTM:2018-04-08T07:14:48Z
name:清算分析/5、输入与输出.txt size:1527 modifyTM:2018-03-12T03:21:56Z
name:清算分析/6、流库的介绍.txt size:3652 modifyTM:2018-03-27T01:04:46Z
name:清算分析/7、代理技术.txt size:210 modifyTM:2018-03-27T01:58:16Z
name:清算分析/8、反射怎么玩.txt size:4577 modifyTM:2018-03-27T08:26:06Z
doc目录下已生成最新的test.txt文件与清算分析2.zip ZIP包。
操作文件
Path表示的是一个目录名序列,气候还可以跟着一个文件名
//得到目录为“/home/harry”,程序会根据操作系统选择分隔符
Path absolute = Paths.get("/home","harry");
//得到目录为当前项目下的“\myprog\conf\user.properties”
Path relative = Paths.get("myprog","conf","user.properties");
//创建absolute的兄弟目录/home/temp
Path temp = absolute.resolveSibling("temp");
//获得父目录 "/home"
Path parent = absolute.getParent();
//获得根目录 "/"
Path root = absolute.getRoot();
Files类可以使得普通文件操作变得快捷。
public class FilesTest {
public static void main(String[] args) throws IOException {
//取读文件的所有内容
byte[] bytes = Files.readAllBytes(Paths.get("doc", "快乐的我.txt"));
String contents = new String(bytes,Charset.forName("GBK"));
System.out.println(contents);
System.out.println();
//将文件当做行序列读入
List<String> lines = Files.readAllLines(Paths.get("doc", "快乐的我.txt"), Charset.forName("GBK"));
for(String str:lines){
System.out.println(str);
}
System.out.println();
//向文件中写入数据
Files.write(Paths.get("doc", "test.txt"), "我是添加的一行!".getBytes(Charset.forName("GBK")));
//向文件中追加一条数据
Files.write(Paths.get("doc", "test.txt"), "我是追加的一行!".getBytes(Charset.forName("GBK")),StandardOpenOption.APPEND);
//以上方法适合处理中等长度的文件,处理大文件最好使用流
InputStream in = Files.newInputStream(Paths.get("doc", "快乐的我.txt"));
OutputStream out = Files.newOutputStream(Paths.get("doc", "快乐的我.txt"));
Reader reader = Files.newBufferedReader(Paths.get("doc", "快乐的我.txt"),Charset.forName("GBK"));
Writer writer = Files.newBufferedWriter(Paths.get("doc", "快乐的我.txt"), Charset.forName("GBK"));
//创建新目录 不管中间目录有没有都会创建成功
Files.createDirectories(Paths.get("doc", "test","tjy.txt"));
//创建新文件
Files.createDirectories(Paths.get("doc", "test","tjy2.txt"));
//创建临时文件:doc/test/tjy+19位数字+.txt
Path newFile = Files.createTempFile(Paths.get("doc", "test"), "tjy", ".txt");
//创建临时文件或目录 文件结构:当前项目/tjy+19位数字+.txt
Path newFile2 = Files.createTempFile( "tjy", ".txt");
//复制、移动、删除文件、获取文件信息等功能请看PI文档,关于文件的操作使用Files大都可以的。
//Files.list方法会返回一个可以读取目录中各个项的Stream<Path>对象,但是它不包含子目录
Stream<Path> pathStream = Files.list(Paths.get("doc"));
pathStream.forEach(System.out::println);
//Files.walk方法会返回一个可以读取目录中各个项的Stream<Path>对象,包含子目录
Stream<Path> pathStreamW = Files.walk(Paths.get("doc"));
pathStreamW.forEach(System.out::println);
}
}