今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

guava IO 的使用

Guava io是一对java io的扩展和工具类,方便开发者更好的,更方便的使用io读写。一下是Guava io 的类

guava io

 

使用Sink类,分为ByteSink和CharSink, sink即是数据的接收者,在io中代表数据写入文件,可以很方便的将字节或字符写入文件


    public File useByteSink() throws IOException {
        File file = new File("byte-sink.txt");
        ByteSink byteSink = Files.asByteSink(file);
        byteSink.write("guava".getBytes(StandardCharsets.UTF_8));
        return file;
    }

    public File useCharSink() throws IOException {
        File file = new File("char-sink.txt");
        CharSink byteSink = Files.asCharSink(file,StandardCharsets.UTF_8);
        byteSink.write("first line");
        byteSink.writeLines(Stream.of("two line,three line,four line,five line"),",");
        return file;
    }

 

使用Streams,分别是ByteStreams和CharStreams 提供对InputStream和OutputStream的操作方法,CharStreams读取所有行并且可以对每行做处理,同时也可以使用skip方法跳过一些内容


    @Test
    public OutputStream useByteStreams() throws IOException {
        InputStream inputStream = new FileInputStream(useByteSink());
        OutputStream outputStream = new FileOutputStream("byte-streams.txt");

        byte[] byteArray = ByteStreams.toByteArray(inputStream);
        assertThat(new String(byteArray)).isEqualTo("guava");
        //使用copy方法
        ByteStreams.copy(inputStream,outputStream);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byteArrayOutputStream.write(byteArray);
        return byteArrayOutputStream;

    }

    @Test
    public void useCharStreams() throws IOException {
        InputStream inputStream = new FileInputStream(useByteSink());
        OutputStream outputStream = new FileOutputStream("char-streams.txt");
        List<String> strings = CharStreams.readLines(new InputStreamReader(inputStream));
        assertThat(strings.size()).isEqualTo(1);
        StringReader stringReader = new StringReader("zlennon");
        CharStreams.skipFully(stringReader,2);
        char[] chars = new char[5];
        stringReader.read(chars);
        assertThat(chars[0]).isEqualTo('e');
        String world = CharStreams.readLines(new FileReader("lines.txt"), new LineProcessor<>() {

            StringBuilder sb = new StringBuilder();
            @Override
            public boolean processLine(String line) throws IOException {
                if (line.equals("dddd")){
                    sb.append(line);
                    return false;
                }
                return true;
            }

            @Override
            public String getResult() {
                return sb.toString();
            }
        });
        assertThat(world).isEqualTo("dddd");

    }

 

Source 即是IO的源头,可以使用wrap构造Source,也可以使用工具类Files构造


    @Test
    public void useByteSource() throws IOException {

        ByteSource bytes = ByteSource.wrap(new String("byte-").getBytes());
        ByteSource source = ByteSource.wrap(new String("source").getBytes());
        ByteSource concat = ByteSource.concat(bytes,source);
        assertThat(new String(concat.read())).isEqualTo("byte-source");
    }

    @Test
    public void useCharSource() throws IOException {
        CharSource bytes = CharSource.wrap(new String("char-"));
        CharSource source = CharSource.wrap(new String("source"));
        CharSource concat = CharSource.concat(bytes,source);
        assertThat(new String(concat.read())).isEqualTo("char-source");
    }

 

Files类是一个工具类,有很多好用的方法,如获取文件扩展名这些,变量目录,写文件等。

    @Test
    public void useFiles() throws IOException {
        ByteSink byteSink = Files.asByteSink(useByteSink());
        CharSink charSink = Files.asCharSink(useByteSink(), Charset.defaultCharset(),FileWriteMode.APPEND);
        Iterable<File> files = Files.fileTraverser().breadthFirst(new File("D:\\logs\\"));
        assertThat(IterableUtils.size(files)).isEqualTo(3);
        files.forEach(file->{
            if(!Files.isDirectory().test(file)) {

                String fileExtension = Files.getFileExtension(file.getName());
                String nameWithoutExtension = Files.getNameWithoutExtension(file.getAbsolutePath());
                assertThat(fileExtension).isEqualTo("log");
                try {
                    Files.copy(file, new File("new-" + file.getName()));
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        ByteSource byteSource = Files.asByteSource(useByteSink());
        Files.write("Files".getBytes(),new File("files.txt"));

    }

 

CountingStream 可以用来统计读取字的长度


    @Test
    public void useCountingStream() throws IOException {
        CountingInputStream cis = new CountingInputStream(new FileInputStream(new File("byte-sink.txt")));
        cis.read(new byte[1024],0,5);
        assertThat(cis.getCount()).isEqualTo(5);

        CountingOutputStream cos = new CountingOutputStream(new BufferedOutputStream(useByteStreams()));
        cos.write(new byte[1024],0,5);
        assertThat(cos.getCount()).isEqualTo(5);
    }

 

使用Reader读取文件


    @Test
    public void useReader() throws IOException {
        LineReader lineReader =new LineReader( Files.newReader(new File("lines.txt"),Charset.defaultCharset()));
        String line = lineReader.readLine();
        assertThat(line).isEqualTo("aaaa");
    }

 

总结:

对于IO的操作,我们该尽可能的使用三方库,不仅便捷,还可以减少我们自己操作IO的导致的问题。 具体代码见Guava

 

分享到:

专栏

类型标签

网站访问总量