Jaki jest najprostszy sposób na utworzenie i zapisanie pliku (tekstowego) w Javie?
1383
Pamiętaj, że każda z poniższych próbek kodu może wyrzucać IOException
. Dla zwięzłości pominięto try / catch / wreszcie bloki. Zobacz ten samouczek, aby uzyskać informacje na temat obsługi wyjątków.
Zauważ, że każdy z poniższych przykładów kodu zastąpi plik, jeśli już istnieje
Tworzenie pliku tekstowego:
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Tworzenie pliku binarnego:
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Użytkownicy Java 7+ mogą używać tej Files
klasy do zapisywania plików:
Tworzenie pliku tekstowego:
List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Tworzenie pliku binarnego:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
"PrintWriter prints formatted representations of objects to a text-output stream. "
Odpowiedź Bozho jest bardziej poprawna, choć wygląda na kłopotliwą (zawsze można ją zawinąć w jakąś metodę narzędziową).writer.close()
powinien być w końcu w blokuW Javie 7 i nowszych:
Istnieją jednak przydatne narzędzia:
Zauważ też, że możesz użyć a
FileWriter
, ale używa domyślnego kodowania, co często jest złym pomysłem - najlepiej jest jawnie określić kodowanie.Poniżej znajduje się oryginalna odpowiedź wcześniejsza niż Java 7
Zobacz także: Odczytywanie, zapisywanie i tworzenie plików (obejmuje NIO2).
źródło
close()
dowolnego strumienia owiniętego wokół innego spowoduje również zamknięcie wszystkich strumieni wewnętrznych.Jeśli masz już treść, którą chcesz zapisać do pliku (i nie jest generowana w locie),
java.nio.file.Files
dodanie do Java 7 jako części natywnego We / Wy zapewnia najprostszy i najbardziej wydajny sposób na osiągnięcie twoich celów.Zasadniczo tworzenie i zapisywanie do pliku to tylko jedna linia, a ponadto jedno proste wywołanie metody !
Poniższy przykład tworzy i zapisuje w 6 różnych plikach, aby pokazać, jak można go użyć:
źródło
źródło
output.close()
wyrzuca IOExceptionOto mały przykładowy program do tworzenia lub zastępowania pliku. Jest to długa wersja, dzięki czemu można ją łatwiej zrozumieć.
źródło
Bardzo prosty sposób tworzenia i zapisywania plików w Javie:
źródło
File.exists()/createNewFile()
Kod tutaj jest zarówno bezcelowe i marnotrawstwo. System operacyjny musi już robić dokładnie to samo podczasnew FileWriter()
tworzenia. Zmuszasz to wszystko do zrobienia dwa razy.FileWriter
w następujący sposób:new FileWriter(file.getAbsoluteFile(),true)
Posługiwać się:
Za pomocą
try()
spowoduje automatyczne zamknięcie strumienia. Ta wersja jest krótka, szybka (buforowana) i umożliwia wybór kodowania.Ta funkcja została wprowadzona w Javie 7.
źródło
StandardCharsets.UTF_8
zamiast ciągu „utf-8” (Zapobiega to błędom literówek)...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
-java.nio.charset.StandardCharsets
jest wprowadzony w java 7Tutaj wprowadzamy ciąg do pliku tekstowego:
Możemy łatwo stworzyć nowy plik i dodać do niego zawartość.
źródło
Ponieważ autor nie określił, czy wymagają rozwiązania dla wersji Java, które zostały poddane EoL (zarówno przez firmę Sun, jak i IBM, a są to technicznie najbardziej rozpowszechnione maszyny JVM), a także dlatego, że wydaje się, że większość ludzi odpowiedziała na pytanie autora zanim określono, że jest to plik tekstowy (niebinarny) , postanowiłem udzielić odpowiedzi.
Po pierwsze, Java 6 ogólnie osiągnęła koniec życia, a ponieważ autor nie określił, że potrzebuje starszej kompatybilności, domyślam się, że automatycznie oznacza Javę 7 lub nowszą (Java 7 nie jest jeszcze EoL'd przez IBM). Możemy więc spojrzeć bezpośrednio na samouczek we / wy pliku: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html
No cóż, to wyklucza plik java.io.File. Jeśli pliku nie można zapisać / dołączyć, możesz nawet nie wiedzieć, dlaczego.
Możemy nadal patrzeć na samouczek: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common
Jeśli masz wszystkie wiersze, które wcześniej napiszesz (dołączasz) do pliku tekstowego , zalecanym podejściem jest https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-
Oto przykład (uproszczony):
Kolejny przykład (dołącz):
Jeśli chcesz pisać zawartość pliku na bieżąco : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-
Uproszczony przykład (Java 8 lub nowszy):
Kolejny przykład (dołącz):
Metody te wymagają minimalnego wysiłku ze strony autora i powinny być preferowane podczas pisania do plików [tekstowych].
źródło
FileNotFoundException
który jest rzucany, gdy operacja się nie powiedzie.Jeśli chcesz mieć względnie bezbolesne doświadczenie, możesz również spojrzeć na pakiet IO Apache Commons , a dokładniej
FileUtils
klasę .Nigdy nie zapomnij sprawdzić bibliotek innych firm. Joda-Time do manipulacji datami, Apache Commons Lang
StringUtils
do typowych operacji na łańcuchach znaków i takie mogą sprawić, że twój kod będzie bardziej czytelny.Java jest świetnym językiem, ale standardowa biblioteka jest czasem nieco niskiego poziomu. Mocny, ale mimo to na niskim poziomie.
źródło
FileUtils
jeststatic void write(File file, CharSequence data)
. Przykładowe zastosowania:import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
.FileUtils
również mawriteLines
, który ma kilkaCollection
linii.Jeśli z jakiegoś powodu chcesz oddzielić tworzenie i pisanie, odpowiednikiem Java
touch
jestcreateNewFile()
sprawdza istnienie i plik tworzy atomowo. Może to być przydatne, jeśli na przykład chcesz się upewnić, że jesteś twórcą pliku przed jego zapisaniem.źródło
touch
w sensie ogólnym, ale raczej w jego powszechnym wtórnym użyciu, aby utworzyć plik bez zapisywania w nim danych. Udokumentowanym celem dotyku jest aktualizacja sygnatury czasowej pliku. Utworzenie pliku, jeśli nie istnieje, jest naprawdę efektem ubocznym i można go wyłączyć za pomocą przełącznika.exists()/createNewFile()
Sekwencje te są dosłownie stratą czasu i przestrzeni.Oto niektóre z możliwych sposobów utworzenia i napisania pliku w Javie:
Korzystanie z FileOutputStream
Korzystanie z FileWriter
Korzystanie z PrintWriter
Korzystanie z OutputStreamWriter
Aby uzyskać więcej informacji, zapoznaj się z tym samouczkiem na temat odczytywania i zapisywania plików w Javie .
źródło
FileWriter
lubOutputStreamWriter
być zamknięte w bloku finally?Posługiwać się:
źródło
najlepszym sposobem jest użycie Java7: Java 7 wprowadza nowy sposób pracy z systemem plików, wraz z nową klasą narzędzi - Pliki. Za pomocą klasy Files możemy również tworzyć, przenosić, kopiować, usuwać pliki i katalogi; Można go również używać do odczytu i zapisu do pliku.
Pisz w FileChannel Jeśli masz do czynienia z dużymi plikami, FileChannel może być szybszy niż standardowe IO. Poniższy kod zapisuje ciąg do pliku za pomocą FileChannel:
Napisz za pomocą DataOutputStream
Napisz za pomocą FileOutputStream
Zobaczmy teraz, jak możemy wykorzystać FileOutputStream do zapisywania danych binarnych do pliku. Poniższy kod konwertuje String int bajtów i zapisuje bajty do pliku za pomocą FileOutputStream:
Pisz za pomocą PrintWriter możemy użyć PrintWriter do zapisania sformatowanego tekstu w pliku:
Napisz za pomocą BufferedWriter: użyj BufferedWriter, aby napisać ciąg znaków do nowego pliku:
dodaj ciąg do istniejącego pliku:
źródło
Myślę, że to najkrótsza droga:
źródło
Aby utworzyć plik bez zastępowania istniejącego pliku:
źródło
źródło
exists()/createNewFile()
Sekwencje te są dosłownie stratą czasu i przestrzeni.źródło
exists()/createNewFile()
Sekwencje te są dosłownie stratą czasu i przestrzeni.Tylko jedna linia!
path
iline
są ciągami znakówźródło
lines
. Jeśli jestjava.lang.String
, to wywołaniegetBytes()
spowoduje utworzenie bajtów przy użyciu domyślnego kodowania platformy , co w ogólnym przypadku nie jest zbyt dobre.Najprostszy sposób, w jaki mogę znaleźć:
Prawdopodobnie będzie działać tylko dla wersji 1.7+.
źródło
Warto wypróbować Javę 7+:
Wygląda obiecująco ...
źródło
Jeśli korzystamy z Javy 7 i nowszych, a także znamy zawartość do dodania (dołączenia) do pliku, możemy skorzystać z metody newBufferedWriter w pakiecie NIO.
Warto zwrócić uwagę na kilka punktów:
StandardCharsets
.try-with-resource
instrukcji, w której zasoby są automatycznie zamykane po próbie.Chociaż OP nie zapytał, ale na wszelki wypadek chcemy wyszukać wiersze zawierające określone słowo kluczowe, np.
confidential
Możemy użyć interfejsów API strumieni w Javie:źródło
Odczytywanie i zapisywanie plików przy użyciu strumienia wejściowego i wyjściowego:
źródło
Wystarczy dołączyć ten pakiet:
A następnie możesz użyć tego kodu do napisania pliku:
źródło
W Javie 8 używaj plików i ścieżek oraz konstruuj try-with-resources.
źródło
Istnieje kilka prostych sposobów, takich jak:
źródło
bw
jest nieużywany.Możesz nawet utworzyć plik tymczasowy za pomocą właściwości systemowej , która będzie niezależna od używanego systemu operacyjnego.
źródło
Korzystając z biblioteki Guava Google, możemy bardzo łatwo tworzyć i zapisywać pliki.
Przykład tworzy nowy
fruits.txt
plik w katalogu głównym projektu.źródło
Czytanie kolekcji klientom i zapisywanie do pliku za pomocą JFilechooser.
źródło
Istnieje co najmniej kilka sposobów tworzenia pliku i zapisywania w nim:
Małe pliki (1.7)
Możesz użyć jednej z metod zapisu, aby zapisać bajty lub linie do pliku.
Te metody zajmują się większością prac, takich jak otwieranie i zamykanie strumienia, ale nie są przeznaczone do obsługi dużych plików.
Pisanie większego pliku przy użyciu buforowanego strumienia we / wy (1.7)
Te
java.nio.file
nośniki pakietów kanału I / O, która porusza się dane w buforach, z pominięciem niektórych warstw, które może stanowić wąskie gardło strumienia I / O.Takie podejście jest preferencyjne ze względu na jego wydajną wydajność, szczególnie przy wykonywaniu dużej liczby operacji zapisu. Operacje buforowane mają ten efekt, ponieważ nie są wymagane do wywoływania metody zapisu systemu operacyjnego dla każdego pojedynczego bajtu, co zmniejsza kosztowne operacje we / wy.
Używanie NIO API do kopiowania (i tworzenia nowego) pliku za pomocą Outputstream (1.7)
Istnieją również dodatkowe metody, które pozwalają skopiować wszystkie bajty ze strumienia wejściowego do pliku.
FileWriter (tekst) (<1.7)
Zapisuje bezpośrednio do pliku (mniejsza wydajność) i powinien być używany tylko wtedy, gdy liczba zapisów jest mniejsza. Służy do zapisywania danych znakowych w pliku.
FileOutputStream (binarny) (<1.7)
FileOutputStream jest przeznaczony do zapisywania strumieni surowych bajtów, takich jak dane obrazu.
Przy takim podejściu należy rozważyć zapisanie tablicy bajtów zamiast pojedynczego bajtu. Przyspieszenie może być dość znaczące - do 10 x więcej lub więcej. Dlatego zaleca się stosowanie tych
write(byte[])
metod, gdy tylko jest to możliwe.źródło