Как мне создать файл и записать в него на Java? - PullRequest
1283 голосов
/ 21 мая 2010

Какой самый простой способ создания и записи (текстового) файла в Java?

Ответы [ 30 ]

1620 голосов
/ 22 мая 2010

Обратите внимание, что каждый из приведенных ниже примеров кода может выдавать IOException. Для краткости блоки try / catch / finally были опущены. См. этот учебник для информации об обработке исключений.

Обратите внимание, что каждый из приведенных ниже примеров кода перезапишет файл, если он уже существует

Создание текстового файла:

PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();

Создание двоичного файла:

byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();

Java 7 + пользователи могут использовать класс Files для записи в файлы:

Создание текстового файла:

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);

Создание двоичного файла:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
393 голосов
/ 22 мая 2010

В Java 7 и выше:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream("filename.txt"), "utf-8"))) {
   writer.write("something");
}

Для этого есть полезные утилиты:

Обратите внимание, что вы можете использовать FileWriter, ноон использует кодировку по умолчанию, что часто является плохой идеей - лучше указывать кодировку явно.

Ниже приведен оригинальный ответ до Java 7


Writer writer = null;

try {
    writer = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream("filename.txt"), "utf-8"));
    writer.write("Something");
} catch (IOException ex) {
    // Report
} finally {
   try {writer.close();} catch (Exception ex) {/*ignore*/}
}

См. Также: Чтение, запись и создание файлов (включая NIO2).

125 голосов
/ 22 апреля 2014

Если у вас уже есть контент, который вы хотите записать в файл (а не сгенерированный на лету), дополнение java.nio.file.Files в Java 7 как часть встроенного ввода-вывода обеспечивает самый простой и самый эффективный способ достижения ваших целей.

По сути, создание и запись в файл занимает одну строку, более того один простой вызов метода !

Следующий пример создает и записывает в 6 различных файлов, чтобы продемонстрировать, как его можно использовать:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("1st line", "2nd line");
byte[] data = {1, 2, 3, 4, 5};

try {
    Files.write(Paths.get("file1.bin"), data);
    Files.write(Paths.get("file2.bin"), data,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    Files.write(Paths.get("file3.txt"), "content".getBytes());
    Files.write(Paths.get("file4.txt"), "content".getBytes(utf8));
    Files.write(Paths.get("file5.txt"), lines, utf8);
    Files.write(Paths.get("file6.txt"), lines, utf8,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
    e.printStackTrace();
}
71 голосов
/ 22 мая 2010
public class Program {
    public static void main(String[] args) {
        String text = "Hello world";
        BufferedWriter output = null;
        try {
            File file = new File("example.txt");
            output = new BufferedWriter(new FileWriter(file));
            output.write(text);
        } catch ( IOException e ) {
            e.printStackTrace();
        } finally {
          if ( output != null ) {
            output.close();
          }
        }
    }
}
41 голосов
/ 09 апреля 2013

Вот небольшой пример программы для создания или перезаписи файла. Это длинная версия, поэтому ее легче понять.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class writer {
    public void writing() {
        try {
            //Whatever the file path is.
            File statText = new File("E:/Java/Reference/bin/images/statsTest.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);    
            Writer w = new BufferedWriter(osw);
            w.write("POTATO!!!");
            w.close();
        } catch (IOException e) {
            System.err.println("Problem writing to the file statsTest.txt");
        }
    }

    public static void main(String[]args) {
        writer write = new writer();
        write.writing();
    }
}
32 голосов
/ 19 апреля 2013

Использование:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) {
    writer.write("text to write");
} 
catch (IOException ex) {
    // Handle me
}  

Использование try() автоматически закроет поток. Эта версия короткая, быстрая (буферизованная) и позволяет выбирать кодировку.

Эта функция была введена в Java 7.

31 голосов
/ 19 ноября 2015

Очень простой способ создания и записи в файл на Java:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CreateFiles {

    public static void main(String[] args) {
        try{
            // Create new file
            String content = "This is the content to write into create file";
            String path="D:\\a\\hi.txt";
            File file = new File(path);

            // If file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);

            // Write in file
            bw.write(content);

            // Close connection
            bw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

Ссылка: Пример создания файла в java

18 голосов
/ 10 июня 2014

Здесь мы вводим строку в текстовый файл:

String content = "This is the content to write into a file";
File file = new File("filename.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close(); // Be sure to close BufferedWriter

Мы можем легко создать новый файл и добавить в него содержимое.

15 голосов
/ 22 мая 2010

Если вы хотите получить относительно безболезненный опыт, вы также можете взглянуть на пакет Apache Commons IO , более конкретно FileUtils class .

Никогда не забывайте проверять сторонние библиотеки. Joda-Time для манипулирования датой, Apache Commons Lang StringUtils для обычных строковых операций, что может сделать ваш код более читабельным.

Java - отличный язык, но стандартная библиотека иногда немного низкоуровневая. Мощный, но все же низкий уровень.

13 голосов
/ 13 мая 2015

Поскольку автор не указал, требуется ли им решение для версий Java, которые были EoL'd (как Sun, так и IBM, и это технически наиболее распространенные JVM), и из-за того, что большинство людей, кажется, Ответив на вопрос автора, прежде чем было указано, что это текстовый (недвоичный) файл , я решил предоставить свой ответ.


Прежде всего, Java 6 в целом достиг конца срока службы, и, поскольку автор не указал, что ему нужна устаревшая совместимость, я предполагаю, что это автоматически означает Java 7 или выше (Java 7 еще не EoL'd от IBM). Итак, мы можем взглянуть прямо на учебник по вводу / выводу файла: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

До выпуска Java SE 7 класс java.io.File был механизм, используемый для файлового ввода-вывода, но он имеет несколько недостатков.

  • Многие методы не генерировали исключения, когда они терпели неудачу, так что это было невозможно получить полезное сообщение об ошибке. Например, если файл удаление не удалось, программа получит «удалить ошибку», но не будет знать, если это потому, что файл не существует, пользователь не есть разрешения, или возникла другая проблема.
  • метод переименования не работает согласованно на разных платформах.
  • Реальной поддержки не было для символических ссылок.
  • Требуется дополнительная поддержка метаданных, таких как права доступа к файлу, владелец файла и другие атрибуты безопасности. Доступ к метаданные файла были неэффективными.
  • Многие методы File не масштабируются. Запрос большого списка каталогов через сервер может привести к похмелья. Большие каталоги могут также вызвать проблемы с ресурсами памяти, в результате чего отказ в обслуживании.
  • Не удалось написать надежный код, который может рекурсивно пройтись по дереву файлов и ответить соответственно, если бы были круглые символические ссылки.

Ну что ж, это исключает java.io.File. Если файл не может быть записан / добавлен, вы, возможно, не сможете даже знать, почему.


Мы можем продолжить просмотр учебника: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common

Если у вас есть все строки, вы заранее напишите (добавите) в текстовый файл , рекомендуемый подход: 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...-

Вот пример (упрощенный):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, StandardCharsets.UTF_8);

Другой пример (приложение):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);

Если вы хотите записывать содержимое файла по ходу : 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...-

Упрощенный пример (Java 8 или выше):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file)) {
    writer.append("Zero header: ").append('0').write("\r\n");
    [...]
}

Другой пример (приложение):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
    writer.write("----------");
    [...]
}

Эти методы требуют минимальных усилий со стороны автора и должны быть предпочтительнее всех остальных при записи в [текстовые] файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...