java 核心技术Ⅱ--章二:输入与输出

输入与输出

把输入/输出流家族中的成员按照他们的使用方法进行划分,可以分为处理字节和字符的两个单独的层次结构。

处理字节:InputStream和OutputStream的体系结构。

处理字符:Reader 和Writer的体系结构。

这里写图片描述

图示:完整的输入流与输出流层次结构图

这里写图片描述

图示: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);

    }
}

猜你喜欢

转载自blog.csdn.net/tjy_521/article/details/80437453