Guava io是一对java io的扩展和工具类,方便开发者更好的,更方便的使用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