Як зберегти рядок у текстовому файлі за допомогою Java?


699

У Java у мене є текст із текстового поля в змінній String під назвою "текст".

Як я можу зберегти вміст змінної "text" у файлі?

Відповіді:


727

Якщо ви просто виводите текст, а не будь-які двійкові дані, буде працювати наступне:

PrintWriter out = new PrintWriter("filename.txt");

Потім напишіть до нього свою String так само, як і в будь-який вихідний потік:

out.println(text);

Вам, як ніколи, знадобиться обробка виключень Обов’язково телефонуйтеout.close() коли закінчите писати.

Якщо ви використовуєте Java 7 або новішу версію, ви можете скористатись оператором " пробний ресурс ", який автоматично закриє ваш, PrintStreamколи ви закінчите з ним (тобто вийдете з блоку) так:

try (PrintWriter out = new PrintWriter("filename.txt")) {
    out.println(text);
}

Вам все одно потрібно буде явно кинути java.io.FileNotFoundExceptionяк раніше.


4
@Justin, ви також можете пройти абсолютний шлях (наприклад, "/tmp/filename.txt") до конструктора FileOutputStream, щоб зберегти файл куди завгодно
Jonik

7
До речі, це може бути спрощено за допомогою конструкторів зручності PrintStream, які були з 1.5. Цього буде достатньо: PrintStream out = new PrintStream ("filename.txt");
Jonik

10
Вам потрібно закрити цей файл, хоча в якийсь момент ...? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
Ви хочете скористатися спробувати {} catch () {} нарешті {}, де нарешті {} ви закриєте файл, якщо він не є нульовим.
Бенас

23
У java8 ви можете спробувати (PrintStream ps = new PrintStream ("ім'я файлу")) {ps.println (out); } це буде вирішувати близько для вас
Антон Чикін

245

AOche Commons IO містить кілька чудових методів для цього, зокрема FileUtils містить наступний метод:

static void writeStringToFile(File file, String data) 

що дозволяє записати текст у файл одним викликом методу:

FileUtils.writeStringToFile(new File("test.txt"), "Hello File");

Ви також можете розглянути можливість кодування для файлу.


10
Лише незначне виправлення, другий фрагмент повинен читати: FileUtils.writeStringToFile (новий файл ("test.txt"), "Привіт файл");
pm_labs

3
Для тих із нас, хто вважає за краще Гуава, він теж може це зробити .
Джонік

10
Тепер функція застаріла, вам слід додати FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
схему

97

Погляньте на API файлу Java

короткий приклад:

try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) {
    out.print(text);
}

@ XP1 Я знаю, це велике вдосконалення. Я використовував для цього Lombok в Java 6: просто зайдіть, @Cleanup new FileOutputStream(...)і ви закінчите.
Jorn

6
Не забудьте зателефонувати out.flush (); потім out.close ();
Алекс Беррт

@AlexByrth чому він повинен?
Андрій Тобілко,

1
Великі файли записуються у фоновому режимі (інший потік) і потрібен час для їх запису. Виклик flush () гарантує, що все було записано у наступному рядку, синхронізуючи операцію. Але це необов’язково , але добра практика, якщо ви обробляєте великі файли, як журнали.
Алекс Беррт

1
Зауважте, що out.close () вже промиває потік, а значить, не потрібно викликати out.flush ().
hjk321

90

У Java 7 ви можете зробити це:

String content = "Hello File!";
String path = "C:/a.txt";
Files.write( Paths.get(path), content.getBytes());

Більше інформації тут: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403


3
Якщо пізніше хтось задумався, кодування було б стандартом платформи.
Haakon Løtveit

5
content.getBytes(StandardCharsets.UTF_8)може використовуватися для явного визначення кодування.
John29

1
Зауважте, що StandardOpenOption.CREATE не є типовим стандартом StandardOpenOption.CREATE та StandardOpenOption.TRUNCATE_EXISTING є типовим. Щоб використовувати типовий параметр, просто видаліть третій параметр.
Tinus Tate

Будь ласка, дивіться коментар Tinus Tate! Який процес редагування цього прикладу? Цікаво, скільки тисяч людей сприйняли цей приклад лише для того, щоб виявити, що вони мають несподівані результати, коли вони перезаписують файл коротшою строкою. Як вказує Tinus, TRUNCATE_EXISTING має вирішальне значення, якщо ви повністю не розумієте та не маєте фактичної причини не бажати усікати існуючий файл під час перезапису коротшим рядком.
jch

1
У java 11 ви можете просто поставити рядок як другий параметр! Ура!
Денніс Глот

78

Просто зробив щось подібне в моєму проекті. Використання FileWriter спростить частину вашої роботи. І тут ви можете знайти приємний підручник .

BufferedWriter writer = null;
try
{
    writer = new BufferedWriter( new FileWriter( yourfilename));
    writer.write( yourstring);

}
catch ( IOException e)
{
}
finally
{
    try
    {
        if ( writer != null)
        writer.close( );
    }
    catch ( IOException e)
    {
    }
}

4
Вилучивши всі спроби / ловити та спростити це, я також можу це зробити в одному рядку, просто виконавши: (новий BufferedWriter (новий FileWriter (ім'я файлу)))). Write (str);
Артем Баргер

6
Отже, покажіть своє просте і приємне рішення. Я був би радий навчитися робити це кращим чином.
Артем Баргер

4
Ігноруйте тролів ... вони завжди критикують, не пропонуючи власного рішення. Дякуємо, що врятували мене від написання власного коду / завантаження додаткової бібліотеки та введення залежності ...
nikib3ro

1
Здається, що .close()не кидає (принаймні, у Java 7?), Чи останній пробірок може бути зайвим?
Кос

16
Поглинання таких винятків ускладнить вам життя, коли винятки дійсно трапляються. По крайней мере, вам слід їх скинути:throw new RuntimeException(e);
Роджер Кієс

65

Використання FileUtils.writeStringToFile()з AOche Commons IO . Не потрібно винаходити саме це колесо.


20
Я більше не могла погодитися. Ці бібліотеки є, тому ми не вводимо тонких помилок у таке просте рішення.
скафман

3
Ні, очевидно, ні. Я не погоджуюся, що ваше рішення може бути не першим, що я б кинув на когось, хто початківець програміст Java. Ви не припускаєте, що ви ніколи такого не писали, чи не так?
duffymo

8
Маю, так, але це ще до того, як я знайшов commons-io. З моменту виявлення цього я ніколи не писав подібних речей вручну, навіть в однокласному проекті. Якби я знав про це з першого дня, я б використовував це з першого дня.
скафман

5
Саме так, але ви досвідчений розробник. Ваша біографія каже, що ваш користувач JBOSS / Spring, але, звичайно, вам би не довелося до жодного в перших зусиллях "Привіт, світ". Я не погоджуюся з правильним використанням бібліотек. Я кажу, що люди, які намагаються вперше спробувати мову, повинні спробувати її пізнати в її нижній частині, навіть якщо це означає робити те, що вони відкинуть пізніше, коли мають досвід і знають краще.
duffymo

2
Я реалізував це без общих відомостей і підкинув менш очевидний виняток. Потім я реалізував це за допомогою commons, і це мені точно сказало, що було не так. Мораль історії: навіщо жити в темні століття, якщо не потрібно?
SilentNot

22

Ви можете використовувати модифікований код нижче, щоб написати свій файл із будь-якого класу чи функції, що обробляє текст. Хоча хтось цікавиться, чому світу потрібен новий текстовий редактор ...

import java.io.*;

public class Main {

    public static void main(String[] args) {

        try {
            String str = "SomeMoreTextIsHere";
            File newTextFile = new File("C:/thetextfile.txt");

            FileWriter fw = new FileWriter(newTextFile);
            fw.write(str);
            fw.close();

        } catch (IOException iox) {
            //do stuff with exception
            iox.printStackTrace();
        }
    }
}

2
Це не закриває файл у разі виключення.
Том Хотін - тайклін

1
@JanusTroelsen: Якщо його відхилено, цитуйте Заяву про використання ресурсів .
trashgod

22

В Java 11java.nio.file.Files клас був продовжений на два нових службових методів , щоб записати рядок в файл. Перший метод (див. Тут JavaDoc ) використовує за замовчуванням схему UTF-8 :

Files.writeString(Path.of("my", "path"), "My String");

А другий метод (див. Тут JavaDoc ) дозволяє вказати індивідуальну діаграму:

Files.writeString(Path.of("my", "path"), "My String", StandardCharset.ISO_8859_1);

Обидва способи мають необов'язковий параметр Varargs для налаштування параметрів обробки файлів (див. Тут JavaDoc ). Наступний приклад створить неіснуючий файл або додасть рядок до вже наявного:

Files.writeString(Path.of("my", "path"), "String to append", StandardOpenOption.CREATE, StandardOpenOption.APPEND);

13

Я вважаю за краще покладатися на бібліотеки, коли це можливо для такого роду операцій. Це робить мене менш ймовірним випадково пропустити важливий крок (як помилка вовчих черепів, зроблених вище). Деякі бібліотеки пропонуються вище, але мій фаворит для подібних речей - Google Guava . У Guava є клас під назвою Files, який чудово працює для цього завдання:

// This is where the file goes.
File destination = new File("file.txt");
// This line isn't needed, but is really useful 
// if you're a beginner and don't know where your file is going to end up.
System.out.println(destination.getAbsolutePath());
try {
    Files.write(text, destination, Charset.forName("UTF-8"));
} catch (IOException e) {
    // Useful error handling here
}

2
Якщо ви використовуєте Guava, також є Charsets.UTF-8.
флоріан

2
@florian: Це Charsets.UTF_8насправді
Тім Бют

Батьківська папка повинна існувати. Приклад: target.mkdirs ().
АлікЕльзін-кілака

2
Files.write (CharSequence from, File to, Charset charset) застаріло в guava 26.0.
Дональд Дак

Сучасна альтернатива Guava застарілому Files.write: Files.asCharSink(file, charset).write(text)
Вадим

12

Використовуйте AOche Commons IO api. Це просто

Використовувати API як

 FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");

Maven залежність

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

12

У разі, якщо вам потрібно створити текстовий файл на основі однієї рядок:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class StringWriteSample {
    public static void main(String[] args) {
        String text = "This is text to be saved in file";

        try {
            Files.write(Paths.get("my-file.txt"), text.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Files.write (шлях, байт []) використовуватиме кодування UTF-8. String.getBytes () використовує кодування платформи за замовчуванням. Тож це потенційне питання. Використовуйте string.getBytes (StandardCharsets.UTF_8)!
rmuller

11

Використовуйте це, це дуже легко читається:

import java.nio.file.Files;
import java.nio.file.Paths;

Files.write(Paths.get(path), lines.getBytes(), StandardOpenOption.WRITE);

Це також копія наявної відповіді. : c
james.garriss

2
вибачте, але я не винайшов java8, я не єдиний, хто використовує цей рядок. але це не копія минулого з інших відповідей на те саме питання
Ран Адлер

10
import java.io.*;

private void stringToFile( String text, String fileName )
 {
 try
 {
    File file = new File( fileName );

    // if file doesnt exists, then create it 
    if ( ! file.exists( ) )
    {
        file.createNewFile( );
    }

    FileWriter fw = new FileWriter( file.getAbsoluteFile( ) );
    BufferedWriter bw = new BufferedWriter( fw );
    bw.write( text );
    bw.close( );
    //System.out.println("Done writing to " + fileName); //For testing 
 }
 catch( IOException e )
 {
 System.out.println("Error: " + e);
 e.printStackTrace( );
 }
} //End method stringToFile

Ви можете вставити цей метод у свої класи. Якщо ви використовуєте цей метод у класі з основним методом, змініть цей клас на статичний, додавши статичне ключове слово. У будь-якому випадку вам потрібно буде імпортувати java.io. *, щоб він працював інакше. Файл, FileWriter і BufferedWriter не будуть розпізнані.


10

Ви можете це зробити:

import java.io.*;
import java.util.*;

class WriteText
{
    public static void main(String[] args)
    {   
        try {
            String text = "Your sample content to save in a text file.";
            BufferedWriter out = new BufferedWriter(new FileWriter("sample.txt"));
            out.write(text);
            out.close();
        }
        catch (IOException e)
        {
            System.out.println("Exception ");       
        }

        return ;
    }
};

10

Використання Java 7:

public static void writeToFile(String text, String targetFilePath) throws IOException
{
    Path targetPath = Paths.get(targetFilePath);
    byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
    Files.write(targetPath, bytes, StandardOpenOption.CREATE);
}

Слово для розумних - це створить новий файл, якщо його немає, але замінить символи існуючого файлу, якщо він є. Якщо нових даних буде менше, це означає, що ви, ймовірно, створили пошкоджений файл. Запитайте мене, як я знаю!
Chris Rae

Гаразд, як ти знаєш?
ojblass

Просто використовуйте Files.write(targetPath, bytes);для того, щоб перезаписати файл. Він буде працювати, як очікувалося.
BullyWiiPlaza

8

Використання org.apache.commons.io.FileUtils:

FileUtils.writeStringToFile(new File("log.txt"), "my string", Charset.defaultCharset());

6

Якщо ви хочете лише натиснути на файл один блок тексту, це буде перезаписано щоразу.

JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
    FileOutputStream stream = null;
    PrintStream out = null;
    try {
        File file = chooser.getSelectedFile();
        stream = new FileOutputStream(file); 
        String text = "Your String goes here";
        out = new PrintStream(stream);
        out.print(text);                  //This will overwrite existing contents

    } catch (Exception ex) {
        //do something
    } finally {
        try {
            if(stream!=null) stream.close();
            if(out!=null) out.close();
        } catch (Exception ex) {
            //do something
        }
    }
}

Цей приклад дозволяє користувачеві вибрати файл за допомогою вибору файлів.


@Eric Leschinski: дякую, що зробив мою відповідь більш професійною (я також припускав, що це саме те, чого хотіла ОП, оскільки це те, що насправді хоче більшість людей, просто
скиньте

2
Після того, як відповіли на початкове запитання, і ОП було задоволено і давно минуло, такі сторінки служать лише корисним артефактом для людей, які приїхали сюди з пошуку Google. Я приземлився на цій сторінці, щоб створити міні-текстове додаток до файлу. Тому добре говорити з усією аудиторією, а не з ОП після того, як ОП продовжиться.
Ерік Лещинський

3

Краще закрити сценарій / вихідний потік остаточно блоком, на всякий випадок, якщо щось трапиться

finally{
   if(writer != null){
     try{
        writer.flush();
        writer.close();
     }
     catch(IOException ioe){
         ioe.printStackTrace();
     }
   }
}

1
ще краще: використовуйте спробу використання ресурсів
Janus Troelsen

Так, @JanusTroelsen має рацію, краще скористайтеся твердженням про використання ресурсів docs.oracle.com/javase/tutorial/essential/exceptions/…

2
private static void generateFile(String stringToWrite, String outputFile) {
try {       
    FileWriter writer = new FileWriter(outputFile);
    writer.append(stringToWrite);
    writer.flush();
    writer.close();
    log.debug("New File is generated ==>"+outputFile);
} catch (Exception exp) {
    log.error("Exception in generateFile ", exp);
}

}


1
Хоча цей фрагмент коду може бути вирішенням, включаючи пояснення, справді допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
Йоган

close () ніколи не може викликатися. Удосконаліть свою відповідь, додавши належне поводження з помилками.
Борис Бродський

0

Я думаю, що найкращим способом є використання Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options):

String text = "content";
Path path = Paths.get("path", "to", "file");
Files.write(path, Arrays.asList(text));

Дивіться javadoc :

Запишіть рядки тексту у файл. Кожен рядок є послідовною символом і записується у файл послідовно з кожним рядком, що закінчується роздільником рядків платформи, як визначено властивістю системи line.separator. Символи кодуються в байти за допомогою вказаної таблиці.

Параметр параметра вказує, як файл створюється або відкривається. Якщо жодних параметрів немає, то цей метод працює так, ніби параметри CREATE, TRUNCATE_EXISTING та WRITE. Іншими словами, він відкриває файл для запису, створюючи файл, якщо його не існує, або спочатку прив'язує існуючий звичайний файл до розміру 0. Метод забезпечує закриття файлу, коли всі рядки записані ( або викидається помилка вводу / виводу або інший виняток виконання). Якщо виникає помилка вводу-виводу, то це може бути зроблено після створення або обрізання файлу, або після того, як у файл будуть записані деякі байти.

Будь ласка, запиши. Я бачу, що люди вже відповіли за допомогою вбудованої Java Files.write, але особливістю у моїй відповіді, яку, схоже, ніхто не згадує, є перевантажена версія методу, яка замість byte[]масиву приймає Iterable CharSequence (тобто String) , тому text.getBytes()не потрібно. , Я думаю, що трохи чистіше.


0

Якщо ви бажаєте зберегти символи повернення каретки з рядка у файл, ось приклад коду:

    jLabel1 = new JLabel("Enter SQL Statements or SQL Commands:");
    orderButton = new JButton("Execute");
    textArea = new JTextArea();
    ...


    // String captured from JTextArea()
    orderButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            // When Execute button is pressed
            String tempQuery = textArea.getText();
            tempQuery = tempQuery.replaceAll("\n", "\r\n");
            try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/tempQuery.sql"))) {
                out.print(tempQuery);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(tempQuery);
        }

    });

-1

Мій шлях заснований на потоці завдяки роботі з усіма версіями Android та потребами джерел, таких як URL / URI, будь-яка пропозиція вітається.

Що стосується, потоки (InputStream та OutputStream) передають двійкові дані, коли розробник піде писати рядок у потік, спочатку повинен перетворити їх у байти або іншими словами кодувати.

public boolean writeStringToFile(File file, String string, Charset charset) {
    if (file == null) return false;
    if (string == null) return false;
    return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}

public boolean writeBytesToFile(File file, byte[] data) {
    if (file == null) return false;
    if (data == null) return false;
    FileOutputStream fos;
    BufferedOutputStream bos;
    try {
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(data, 0, data.length);
        bos.flush();
        bos.close();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return false;
    }
    return true;
}

1
Будь ласка, додайте належну справу з помилками щодо закриття всіх відкритих ресурсів та пропонування винятку
Борис Бродський,

Ви б заперечували поділитися випадками обробки коду, як рекомендували, дякую.
牟家宏

-1

Ви можете використовувати ArrayList, щоб розмістити весь вміст TextArea для зразка, і надіслати як параметр, викликаючи збереження, оскільки автор просто написав рядкові рядки, тоді ми використовуємо "за" рядок за рядком, щоб написати наш ArrayList у підсумку ми будемо вміст TextArea у файлі txt. якщо щось не має сенсу, мені дуже шкода перекладач google і я, хто не розмовляє англійською.

Дивіться Блокнот Windows, він не завжди стрибає рядки, а показує все в одному рядку, використовуйте Wordpad добре.


private void SaveActionPerformed(java.awt.event.ActionEvent evt) {

    String NameFile = Name.getText();
    ArrayList< String > Text = new ArrayList< String >();

    Text.add(TextArea.getText());

    SaveFile(NameFile, Text);
}

public void SaveFile(String name, ArrayList< String> message) {

    path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";

    File file1 = new File(path);

    try {

        if (!file1.exists()) {

            file1.createNewFile();
        }


        File[] files = file1.listFiles();


        FileWriter fw = new FileWriter(file1, true);

        BufferedWriter bw = new BufferedWriter(fw);

        for (int i = 0; i < message.size(); i++) {

            bw.write(message.get(i));
            bw.newLine();
        }

        bw.close();
        fw.close();

        FileReader fr = new FileReader(file1);

        BufferedReader br = new BufferedReader(fr);

        fw = new FileWriter(file1, true);

        bw = new BufferedWriter(fw);

        while (br.ready()) {

            String line = br.readLine();

            System.out.println(line);

            bw.write(line);
            bw.newLine();

        }
        br.close();
        fr.close();

    } catch (IOException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, "Error in" + ex);     
    }   
}

Ви можете залишити купу ресурсів відкритими. Це погана практика, будь ласка, не робіть цього.
Борис Бродський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.