2010-09-27 9 views
7

Czy istnieje sposób osiągnięcia poniższego przy użyciu Guava?Jak to zrobić, używając guawy?

//anything better than using Files.append() in a loop? 
org.apache.commons.io.FileUtils.writeLines(File file, Collection lines, String lineEnding); 

//gives a byte[] that is fed to Files.write(byte[] from, File to) 
org.apache.commons.lang.SerializationUtils.serialize(Serializable obj) 

//get an object from a byte[] 
SerializationUtils.SerializationUtils.deserialize(byte[] from) 

Dzięki.

Odpowiedz

12

Na pierwszy, jedną z opcji byłoby:

Files.write(Joiner.on(lineEnding).join(lines), file, charset); 

nie wiem, że to musi być szybsza niż dołączanie w pętli (i oczywiście wiąże się budowa kolejnego ciąg w oparciu o linie, a także), ale czyta się ładniej.

Dla pozostałych dwóch ... Guava w rzeczywistości nie oferuje niczego konkretnego do serializacji. Powiedział, że jeśli chcesz, możesz zbudować kilka fajnych narzędzi na górze IO wsparcia Guava. Przechodzenie przez półprodukt byte[] wydaje się być marnotrawstwem dla serializacji lub deserializacji obiektów, gdy można pisać/odczytywać obiekty bezpośrednio do/ze strumienia. Metody takie jak te są dość łatwe do napisania:

void serialize(OutputSupplier<? extends OutputStream> outputSupplier, 
       Object object) throws IOException; 

Object deserialize(InputSupplier<? extends InputStream> inputSupplier) 
    throws IOException, ClassNotFoundException;