Ik moet herhaaldelijk tekst toevoegen aan een bestaand bestand in Java. Hoe doe ik dat?
Antwoord 1, autoriteit 100%
Doe je dit voor logboekdoeleinden? Zo ja, dan zijn er verschillende bibliotheken hiervoor. Twee van de meest populaire zijn Log4jen Log terug.
Java 7+
Voor een eenmalige taak, de De klasse Bestandenmaakt dit eenvoudig:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Let op: de bovenstaande aanpak genereert een NoSuchFileException
als het bestand nog niet bestaat. Het voegt ook niet automatisch een nieuwe regel toe (wat je vaak wilt bij het toevoegen aan een tekstbestand). Een andere benadering is om zowel de opties CREATE
als APPEND
door te geven, waardoor het bestand eerst wordt gemaakt als het nog niet bestaat:
private void write(final String s) throws IOException {
Files.writeString(
Path.of(System.getProperty("java.io.tmpdir"), "filename.txt"),
s + System.lineSeparator(),
CREATE, APPEND
);
}
Als u echter vele malen naar hetzelfde bestand wilt schrijven, moeten de bovenstaande fragmenten het bestand op de schijf vele malen openen en sluiten, wat een langzame bewerking is. In dit geval is een BufferedWriter
sneller:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Opmerkingen:
- De tweede parameter van de
FileWriter
-constructor geeft aan dat deze aan het bestand moet worden toegevoegd in plaats van een nieuw bestand te schrijven. (Als het bestand niet bestaat, wordt het aangemaakt.) - Het gebruik van een
BufferedWriter
wordt aanbevolen voor een dure schrijver (zoalsFileWriter
). - Het gebruik van een
PrintWriter
geeft u toegang tot deprintln
-syntaxis die u waarschijnlijk gewend bent vanSystem.out
. - Maar de
BufferedWriter
enPrintWriter
wrappers zijn niet strikt noodzakelijk.
Oudere Java
try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Afhandeling van uitzonderingen
Als je een robuuste uitzonderingsbehandeling voor oudere Java nodig hebt, wordt het erg uitgebreid:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
Antwoord 2, autoriteit 21%
Je kunt FileWriter
gebruiken met een vlag ingesteld op true
, om toe te voegen.
try
{
String filename= "MyFile.txt";
FileWriter fw = new FileWriter(filename,true); //the true will append the new data
fw.write("add a line\n");//appends the string to the file
fw.close();
}
catch(IOException ioe)
{
System.err.println("IOException: " + ioe.getMessage());
}
Antwoord 3, autoriteit 9%
Moeten niet alle antwoorden hier met try/catch-blokken de .close()-stukken bevatten in een definitief blok?
Voorbeeld voor gemarkeerd antwoord:
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
out.println("the text");
} catch (IOException e) {
System.err.println(e);
} finally {
if (out != null) {
out.close();
}
}
Vanaf Java 7 kunt u ook een try-with gebruiken -bronnenverklaring. Er is geen definitief blok nodig voor het sluiten van de gedeclareerde bron(nen), omdat het automatisch wordt afgehandeld en ook minder uitgebreid is:
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
out.println("the text");
} catch (IOException e) {
System.err.println(e);
}
Antwoord 4, autoriteit 6%
Apache Commons 2.1 gebruiken:
FileUtils.writeStringToFile(file, "String to append", true);
Antwoord 5, autoriteit 4%
Beetje uitbreiden op Kip’s antwoord,
hier is een eenvoudige Java 7+ methode om een nieuwe regeltoe te voegen aan een bestand, het aan te maken als het nog niet bestaat:
try {
final Path path = Paths.get("path/to/filename.txt");
Files.write(path, Arrays.asList("New line to append"), StandardCharsets.UTF_8,
Files.exists(path) ? StandardOpenOption.APPEND : StandardOpenOption.CREATE);
} catch (final IOException ioe) {
// Add your own exception handling...
}
Verdere opmerkingen:
-
Het bovenstaande gebruikt de
Files.write
overbelasting die regelstekst naar een bestand schrijft (dwz vergelijkbaar met eenprintln
commando). Om gewoon tekst tot het einde te schrijven (dwz vergelijkbaar met eenprint
commando), een alternatiefFiles.write
overbelasting kan worden gebruikt, waarbij een byte-array wordt doorgegeven (bijv."mytext".getBytes(StandardCharsets.UTF_8)
). -
De optie
CREATE
werkt alleen als de opgegeven map al bestaat – als dat niet het geval is, wordt eenNoSuchFileException
gegenereerd. Indien nodig kan de volgende code worden toegevoegd na het instellen vanpath
om de directorystructuur te creëren:Path pathParent = path.getParent(); if (!Files.exists(pathParent)) { Files.createDirectories(pathParent); }
Antwoord 6, autoriteit 3%
Zorg ervoor dat de stream in alle scenario’s goed wordt afgesloten.
Het is een beetje verontrustend hoeveel van deze antwoorden de bestandshandle open laten in geval van een fout. Het antwoord https://stackoverflow.com/a/15053443/2498188is op het geld, maar alleen omdat BufferedWriter()
kan niet gooien. Als dat zou kunnen, zou een uitzondering het object FileWriter
open laten.
Een meer algemene manier om dit te doen waarbij het niet uitmaakt of BufferedWriter()
kan gooien:
PrintWriter out = null;
BufferedWriter bw = null;
FileWriter fw = null;
try{
fw = new FileWriter("outfilename", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
finally{
try{
if( out != null ){
out.close(); // Will close bw and fw too
}
else if( bw != null ){
bw.close(); // Will close fw too
}
else if( fw != null ){
fw.close();
}
else{
// Oh boy did it fail hard! :3
}
}
catch( IOException e ){
// Closing the file writers failed for some obscure reason
}
}
EDIT:
Vanaf Java 7 is de aanbevolen manier om “Probeer middelen” te gebruiken en laat de JVM ermee omgaan:
try( FileWriter fw = new FileWriter("outfilename", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)){
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
Antwoord 7, Autoriteit 2%
In Java-7 kan ook zo’n soort worden gedaan:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
// ———————-
Path filePath = Paths.get("someFile.txt");
if (!Files.exists(filePath)) {
Files.createFile(filePath);
}
Files.write(filePath, "Text to be added".getBytes(), StandardOpenOption.APPEND);
Antwoord 8
Java 7 +
In mijn bescheiden mening sinds ik fan van duidelijke java ben, zou ik iets voorstellen dat het een combinatie is van de bovengenoemde antwoorden. Misschien ben ik te laat voor het feest. Hier is de code:
String sampleText = "test" + System.getProperty("line.separator");
Files.write(Paths.get(filePath), sampleText.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
Als het bestand niet bestaat, maakt het het en als het al bestaat, voegt het de
Sampletext naar het bestaande bestand. Gebruik dit, bespaart u van het toevoegen van onnodige libs aan uw klassenpad.
Antwoord 9
Dit kan in één regel code worden gedaan. Ik hoop dat dit helpt 🙂
Files.write(Paths.get(fileName), msg.getBytes(), StandardOpenOption.APPEND);
Antwoord 10
Ik voeg gewoon een klein detail toe:
new FileWriter("outfilename", true)
2.nd parameter (true) is een functie (of interface) genaamd toevoegbaar(http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html). Het is verantwoordelijk voor het kunnen toevoegen van inhoud aan het einde van een bepaald bestand/stream. Deze interface is geïmplementeerd sinds Java 1.5. Elk object (dwz BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer) met deze interface kan worden gebruikt voor het toevoegen van inhoud
Met andere woorden, je kunt wat inhoud toevoegen aan je gzipped-bestand, of een http-proces
Antwoord 11
Java.nio gebruiken.Bestandensamen met java.nio.file.StandardOpenOption
PrintWriter out = null;
BufferedWriter bufWriter;
try{
bufWriter =
Files.newBufferedWriter(
Paths.get("log.txt"),
Charset.forName("UTF8"),
StandardOpenOption.WRITE,
StandardOpenOption.APPEND,
StandardOpenOption.CREATE);
out = new PrintWriter(bufWriter, true);
}catch(IOException e){
//Oh, no! Failed to create PrintWriter
}
//After successful creation of PrintWriter
out.println("Text to be appended");
//After done writing, remember to close!
out.close();
Hiermee wordt een BufferedWriter
met bestanden, die StandardOpenOption
PARAMETERS en een automatische spoeling PrintWriter
van de resulterende BufferedWriter
. PrintWriter
‘S println()
-methode, kan vervolgens worden opgeroepen om naar het bestand te schrijven.
De StandardOpenOption
Parameters die in deze code worden gebruikt: Opent het bestand om te schrijven, past alleen toe aan het bestand en maakt het bestand als deze niet bestaat.
Paths.get("path here")
Kan worden vervangen door new File("path here").toPath()
.
En Charset.forName("charset name")
kan worden gewijzigd om de gewenste Charset
te ontvangen.
Antwoord 12
monster, met Guave:
File to = new File("C:/test/test.csv");
for (int i = 0; i < 42; i++) {
CharSequence from = "some string" + i + "\n";
Files.append(from, to, Charsets.UTF_8);
}
Antwoord 13
Probeer met bufferfilnewriter.appdry, het werkt met mij.
FileWriter fileWriter;
try {
fileWriter = new FileWriter(file,true);
BufferedWriter bufferFileWriter = new BufferedWriter(fileWriter);
bufferFileWriter.append(obj.toJSONString());
bufferFileWriter.newLine();
bufferFileWriter.close();
} catch (IOException ex) {
Logger.getLogger(JsonTest.class.getName()).log(Level.SEVERE, null, ex);
}
Antwoord 14
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Writer {
public static void main(String args[]){
doWrite("output.txt","Content to be appended to file");
}
public static void doWrite(String filePath,String contentToBeAppended){
try(
FileWriter fw = new FileWriter(filePath, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)
)
{
out.println(contentToBeAppended);
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
}
}
Antwoord 15
String str;
String path = "C:/Users/...the path..../iin.txt"; // you can input also..i created this way :P
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter(path, true));
try
{
while(true)
{
System.out.println("Enter the text : ");
str = br.readLine();
if(str.equalsIgnoreCase("exit"))
break;
else
pw.println(str);
}
}
catch (Exception e)
{
//oh noes!
}
finally
{
pw.close();
}
Dit zal doen waarvoor u voorkomt ..
Antwoord 16
U kunt dit ook proberen:
JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "Writing into file"; //what u would like to append to the file
try
{
RandomAccessFile raf = new RandomAccessFile(write_file, "rw");
long length = raf.length();
//System.out.println(length);
raf.setLength(length + 1); //+ (integer value) for spacing
raf.seek(raf.length());
raf.writeBytes(Content);
raf.close();
}
catch (Exception e) {
//any exception handling method of ur choice
}
Antwoord 17
Het is beter om try-with-resources te gebruiken dan al die pre-java 7 eindelijk zaken
static void appendStringToFile(Path file, String s) throws IOException {
try (BufferedWriter out = Files.newBufferedWriter(file, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
out.append(s);
out.newLine();
}
}
Antwoord 18
Als we Java 7 en hoger gebruiken en ook weten welke inhoud aan het bestand moet worden toegevoegd (bijgevoegd), kunnen we gebruik maken van newBufferedWriter-methode in NIO-pakket.
public static void main(String[] args) {
Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
String text = "\n Welcome to Java 8";
//Writing to the file temp.txt
try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
writer.write(text);
} catch (IOException e) {
e.printStackTrace();
}
}
Er zijn enkele aandachtspunten:
- Het is altijd een goede gewoonte om tekensetcodering te specificeren en daarvoor hebben we constante
StandardCharsets
in de klas. - De code gebruikt de instructie
try-with-resource
waarin bronnen automatisch worden gesloten na de try.
Hoewel OP niet heeft gevraagd, maar voor het geval we willen zoeken naar regels met een specifiek trefwoord, b.v. confidential
we kunnen gebruik maken van stream-API’s in Java:
//Reading from the file the first line which contains word "confidential"
try {
Stream<String> lines = Files.lines(FILE_PATH);
Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
if(containsJava.isPresent()){
System.out.println(containsJava.get());
}
} catch (IOException e) {
e.printStackTrace();
}
Antwoord 19
FileOutputStream fos = new FileOutputStream("File_Name", true);
fos.write(data);
Hiermee kunt u de gegevens in het bestaande bestand toevoegen. Als we
schrijven
FileOutputStream fos = new FileOutputStream("File_Name");
Het overschrijft het bestaande bestand. Dus ga voor de eerste aanpak.
Antwoord 20
FileOutputStream stream = new FileOutputStream(path, true);
try {
stream.write(
string.getBytes("UTF-8") // Choose your encoding.
);
} finally {
stream.close();
}
Vang dan een iOException ergens stroomopwaarts.
Antwoord 21
Maak een functie overal in uw project en bel gewoon die functie waar u het ooit nodig hebt.
Jongens die je moet herinneren dat jullie actieve discussies roepen die je niet asynchroon belt en omdat het waarschijnlijk een goede 5 tot 10 pagina’s zou zijn om het goed te doen.
WAAROM NIET MEER MEER tijd aan uw project uitgeven en vergeet het schrijven van iets dat al is geschreven.
Goed
//Adding a static modifier would make this accessible anywhere in your app
public Logger getLogger()
{
return java.util.logging.Logger.getLogger("MyLogFileName");
}
//call the method anywhere and append what you want to log
//Logger class will take care of putting timestamps for you
//plus the are ansychronously done so more of the
//processing power will go into your application
//from inside a function body in the same class ...{...
getLogger().log(Level.INFO,"the text you want to append");
...}...
/*********log file resides in server root log files********/
drie regels code twee eigenlijk omdat de derde daadwerkelijk tekst toevoegt. 😛
Antwoord 22
Bibliotheek
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
Code
public void append()
{
try
{
String path = "D:/sample.txt";
File file = new File(path);
FileWriter fileWriter = new FileWriter(file,true);
BufferedWriter bufferFileWriter = new BufferedWriter(fileWriter);
fileWriter.append("Sample text in the file to append");
bufferFileWriter.close();
System.out.println("User Registration Completed");
}catch(Exception ex)
{
System.out.println(ex);
}
}
Antwoord 23
Ik zou het apache commons-projectkunnen voorstellen. Dit project biedt al een raamwerk om te doen wat je nodig hebt (d.w.z. flexibel filteren van collecties).
Antwoord 24
Met de volgende methode kunt u tekst aan een bestand toevoegen:
private void appendToFile(String filePath, String text)
{
PrintWriter fileWriter = null;
try
{
fileWriter = new PrintWriter(new BufferedWriter(new FileWriter(
filePath, true)));
fileWriter.println(text);
} catch (IOException ioException)
{
ioException.printStackTrace();
} finally
{
if (fileWriter != null)
{
fileWriter.close();
}
}
}
alternatief met behulp van FileUtils
:
public static void appendToFile(String filePath, String text) throws IOException
{
File file = new File(filePath);
if(!file.exists())
{
file.createNewFile();
}
String fileContents = FileUtils.readFileToString(file);
if(file.length() != 0)
{
fileContents = fileContents.concat(System.lineSeparator());
}
fileContents = fileContents.concat(text);
FileUtils.writeStringToFile(file, fileContents);
}
Het is niet efficiënt, maar werkt prima. Lijnbrekes worden correct afgehandeld en er wordt nog een nieuw bestand gecreëerd als deze nog niet bestond.
Antwoord 25
Deze code zal uw behoefte verguld:
FileWriter fw=new FileWriter("C:\\file.json",true);
fw.write("ssssss");
fw.close();
Antwoord 26
Als u wat tekst wilt toevoegen in specifieke regels U kunt eerst het hele bestand lezen, de tekst toevoegen waar u maar wilt en vervolgens alles wilt overschrijven zoals in de onderstaande code:
public static void addDatatoFile(String data1, String data2){
String fullPath = "/home/user/dir/file.csv";
File dir = new File(fullPath);
List<String> l = new LinkedList<String>();
try (BufferedReader br = new BufferedReader(new FileReader(dir))) {
String line;
int count = 0;
while ((line = br.readLine()) != null) {
if(count == 1){
//add data at the end of second line
line += data1;
}else if(count == 2){
//add other data at the end of third line
line += data2;
}
l.add(line);
count++;
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
createFileFromList(l, dir);
}
public static void createFileFromList(List<String> list, File f){
PrintWriter writer;
try {
writer = new PrintWriter(f, "UTF-8");
for (String d : list) {
writer.println(d.toString());
}
writer.close();
} catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Antwoord 27
Mijn antwoord:
JFileChooser chooser= new JFileChooser();
chooser.showOpenDialog(chooser);
File file = chooser.getSelectedFile();
String Content = "What you want to append to file";
try
{
RandomAccessFile random = new RandomAccessFile(file, "rw");
long length = random.length();
random.setLength(length + 1);
random.seek(random.length());
random.writeBytes(Content);
random.close();
}
catch (Exception exception) {
//exception handling
}
Antwoord 28
/**********************************************************************
* it will write content to a specified file
*
* @param keyString
* @throws IOException
*********************************************************************/
public static void writeToFile(String keyString,String textFilePAth) throws IOException {
// For output to file
File a = new File(textFilePAth);
if (!a.exists()) {
a.createNewFile();
}
FileWriter fw = new FileWriter(a.getAbsoluteFile(), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(keyString);
bw.newLine();
bw.close();
}// end of writeToFile()
Antwoord 29
Voor JDK versie & gt; = 7
U kunt deze eenvoudige methode die de gegeven inhoud aan het opgegeven bestand voegt gebruiken:
void appendToFile(String filePath, String content) {
try (FileWriter fw = new FileWriter(filePath, true)) {
fw.write(content + System.lineSeparator());
} catch (IOException e) {
// TODO handle exception
}
}
We zijn de bouw van een FileWriter object in uitbreidingsmodus.
ANTWOORD 30
U kunt de Follong code gebruiken om de inhoud in het bestand toevoegen:
String fileName="/home/shriram/Desktop/Images/"+"test.txt";
FileWriter fw=new FileWriter(fileName,true);
fw.write("here will be you content to insert or append in file");
fw.close();
FileWriter fw1=new FileWriter(fileName,true);
fw1.write("another content will be here to be append in the same file");
fw1.close();