2016-03-27 9 views
7

Jestem trochę zdezorientowany na temat FileWriter i FileOutputStream. Jak widzę source code of FileWriter istnieją tylko 4 konstruktory i każdy konstruktor wywołuje konstruktor FileOutputStream.FileWriter vs FileOutputStream w Javie

public FileWriter(String fileName) throws IOException { 
     super(new FileOutputStream(fileName)); 
} 
public FileWriter(String fileName, boolean append) throws IOException { 
     super(new FileOutputStream(fileName, append)); 
} 
public FileWriter(File file) throws IOException { 
     super(new FileOutputStream(file)); 
} 
public FileWriter(File file, boolean append) throws IOException { 
     super(new FileOutputStream(file, append)); 
} 
public FileWriter(FileDescriptor fd) { 
     super(new FileOutputStream(fd)); 
} 

Po wyszukaniu różnicy między nimi znalazłem mentioned here.

FileOutputStream jest przeznaczona do zapisywania strumieni surowców takich jak bajtów danych obrazu. Aby zapisać strumienie znaków, należy rozważyć użycie FileWriter .

W jaki sposób FileWriter może coś zmienić? Nawet nadal wywołuje konstruktor FileOutputStream bez żadnych zmian.

+0

Różnica polega na metodzie 'write()'. – Tunaki

+0

@Tunaki gdzie jest metoda odczytu w FileWriter? a cytat, o którym wspomniałem, mówi o pisaniu strumieni, które nie są czytane. czy możesz wyjaśnić, proszę? –

+0

Erf Miałem na myśli metodę zapisu, był zdezorientowany ... – Tunaki

Odpowiedz

11

FileWriter to Writer. Chodzi o pisanie tekstu - i zdarza się, że zapisuje go do pliku. Czyni to poprzez odwołanie się do FileOutputStream, który jest tworzony w konstruktorze FileWriter i przekazywany do konstruktora nadklasy.

FileOutputStream to OutputStream. Chodzi o pisanie danych binarnych. Jeśli chcesz napisać do niego tekst, potrzebujesz czegoś, aby przekonwertować ten tekst na dane binarne - i to jest dokładnie to, co robi FileWriter. Osobiście wolę używać FileOutputStream zapakowanego w OutputStreamWriterprzeze mnie, aby umożliwić mi określenie kodowania znaków (jako FileWriter zawsze używa domyślnego kodowania platformy, denerwująco).

Zasadniczo myśleć FileWriter to prosty sposób pozwalając Ci napisać:

Writer writer = new FileWriter("test.txt"); 

zamiast

Writer writer = new OutputStreamWriter(new FileOutputStream("test.txt")); 

wyjątkiem bym normalnie zalecamy użycie przeciążenie konstruktora OutputStreamWriter że akceptuje Charset.

+0

Ale jestem zdezorientowany, że jest tylko 4 konstruktorów, gdzie jest różnica? a każdy konstruktor wywołuje konstruktor FileOutputStream. –

+0

@LetDoit: Nie, nie ma "tylko czterech konstruktorów" - istnieje również wiele innych metod, dziedziczonych po 'OutputStreamWriter'. Tak, każdy konstruktor wywołuje konstruktor 'FileOutputStream', ponieważ każdy' FileWriter' ma odwołanie do 'FileOutputStream'. Ale to nie znaczy, że 'FileWriter' i' FileOutputStream' są tym samym. –

+0

to różnica w JVM? Ponieważ oczekiwałem też różnicy w kodowaniu. –

1

A FileOutputStream bezpośrednio zapisuje bajty. A FileWriter enkapsuluje FileOutputStream (tworząc go w konstruktorze FileWriter jak w pytaniu) i zapewnia wygodne metody pisania znaków i łańcuchów.

Powiązane problemy