Открытие файла, запись другого файла и печать информации [duplicate]

echo '<p class="paragraph'.$i.'"></p>';
800
задан Palec 15 January 2016 в 14:12
поделиться

10 ответов

ASCII - это файл TEXT, поэтому вы должны использовать Readers для чтения. Java также поддерживает чтение из двоичного файла с помощью InputStreams . Если прочитанные файлы огромны, вы можете использовать BufferedReader поверх FileReader , чтобы улучшить производительность чтения.

Пройдите через в этой статье о том, как использовать Reader

Я также рекомендую вам скачать и прочитать эту замечательную (но бесплатную) книгу под названием Мышление на Java

В Java 7:

new String (Files.readAllBytes (...)) или Files.readAllLines (...)

В Java 8:

Files.lines (..). forEach (...)

471
ответ дан gsamaras 16 August 2018 в 05:22
поделиться
  • 1
    Выбор Reader действительно зависит от того, для чего нужен контент файла. Если файл маленький (ish), и вам все это нужно, он быстрее (сравнивается с нами: 1.8-2x), чтобы просто использовать FileReader и читать все (или, по крайней мере, достаточно большие куски). Если вы обрабатываете его по очереди, переходите к BufferedReader. – Vlad 27 August 2013 в 14:45
  • 2
    Будет ли порядок строк сохранен при использовании «Files.lines (..). ForEach (...)». Я понимаю, что после этой операции заказ будет произвольным. – Daniil Shevelev 14 September 2014 в 19:49
  • 3
    Files.lines(…).forEach(…) не сохраняет порядок строк, а выполняется параллельно, @Dash. Если порядок важен, вы можете использовать Files.lines(…).forEachOrdered(…), который должен сохранить порядок (хотя и не проверял). – Palec 15 February 2015 в 23:45
  • 4
    @Palec это интересно, но можете ли вы процитировать из документов, где говорится, что Files.lines(...).forEach(...) выполняется параллельно? Я думал, что это было только в случае, когда вы явно делаете поток параллельным, используя Files.lines(...).parallel().forEach(...). – Klitos Kyriacou 9 November 2015 в 15:03
  • 5
    Моя оригинальная формулировка не пуленепробиваемая, @KlitosKyriacou. Дело в том, что forEach не гарантирует никакого порядка, и причина проста в распараллеливании. Если порядок должен быть сохранен, используйте forEachOrdered . – Palec 10 November 2015 в 06:48

Самый простой способ - использовать класс Scanner в Java и объект FileReader. Простой пример:

Scanner in = new Scanner(new FileReader("filename.txt"));

Scanner имеет несколько методов для чтения в строках, числах и т. Д. Вы можете найти дополнительную информацию об этом на странице документации Java.

Например, прочитав весь контент в String:

StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
    sb.append(in.next());
}
in.close();
outString = sb.toString();

Также, если вам нужна конкретная кодировка, вы можете использовать это вместо FileReader:

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
124
ответ дан for3st 16 August 2018 в 05:22
поделиться

Мой любимый способ прочитать небольшой файл - использовать BufferedReader и StringBuilder. Это очень просто и точно (хотя и не особенно эффективно, но достаточно для большинства случаев):

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
} finally {
    br.close();
}

Некоторые отметили, что после Java 7 вы должны использовать try-with-

try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}

Когда я читаю строки, подобные этому, я обычно хочу выполнять некоторую обработку строк для каждой строки, поэтому я перехожу к этой реализации. (т. е. автоматическое закрытие):

try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}

/ g5]

Хотя если я хочу просто прочитать файл в String, я всегда использую Apache Commons IO с помощью метода класса IOUtils.toString (). Вы можете посмотреть источник здесь:

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html

FileInputStream inputStream = new FileInputStream("foo.txt");
try {
    String everything = IOUtils.toString(inputStream);
} finally {
    inputStream.close();
}

И еще проще с Java 7:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {     
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}
636
ответ дан gtonic 16 August 2018 в 05:22
поделиться
  • 1
    Я сделал небольшую настройку, чтобы остановить добавление новой строки (\n), если последняя строка будет достигнута. code while (строка! = null) {sb.append (строка); line = br.readLine (); // Добавляем только новую строку, когда curline не является последней строкой. If (line! = Null) {sb.append (& quot;\n & quot;); }} code – Ramon Fincken 16 April 2013 в 12:07
  • 2
    Подобно Apache Common IO IOUtils # toString () является sun.misc.IOUtils # readFully (), который включен в JREs Sun / Oracle. – gb96 5 July 2013 в 01:55
  • 3
    Для производительности всегда вызывайте sb.append ('\n') в предпочтении sb.append (& quot;\n & quot;), поскольку символ добавляется к StringBuilder быстрее, чем строка – gb96 5 July 2013 в 01:58
  • 4
    FileReader может вызывать FileNotFoundException, а BufferedRead может вызывать IOException, поэтому вы должны их поймать. – kamaci 5 March 2014 в 12:23
  • 5
    нет необходимости использовать читателей напрямую, а также нет необходимости в ioutils. В java7 встроены методы для чтения целого файла / всех строк: см. docs.oracle.com/javase/7/docs/api/java/nio/file/… и docs. oracle.com/javase/7/docs/api/java/nio/file/… – kritzikratzi 23 March 2014 в 20:48

Пока я еще не упомянул об этом в других ответах. Но если «Лучшее» означает скорость, то новый Java I / O (NIO) может обеспечить самую быструю предварительную подготовку, но не всегда проще всего выяснить, кто кого-то учит.

http: // download.oracle.com/javase/tutorial/essential/io/file.html

4
ответ дан jzd 16 August 2018 в 05:22
поделиться

Этот код, который я запрограммировал, намного быстрее для очень больших файлов:

public String readDoc(File f) {
    String text = "";
    int read, N = 1024 * 1024;
    char[] buffer = new char[N];

    try {
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);

        while(true) {
            read = br.read(buffer, 0, N);
            text += new String(buffer, 0, read);

            if(read < N) {
                break;
            }
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    return text;
}
-3
ответ дан MikkoP 16 August 2018 в 05:22
поделиться
  • 1
    Гораздо быстрее, я сомневаюсь, если вы используете простое конкатенацию строк вместо StringBuilder ... – PhiLho 28 May 2013 в 14:41
  • 2
    Я думаю, что основной прирост скорости - от чтения в блоках размером 1 МБ (1024 * 1024). Однако вы можете сделать то же самое, передав 1024 * 1024 в качестве второго аргумента в конструктор BufferedReader. – gb96 5 July 2013 в 01:50
  • 3
    Я не верю, что это вообще протестировано. используя += таким образом, вы получаете квадратичную (!) сложность для задачи, которая должна быть линейной сложностью. это начнет сканирование файлов на несколько мб. Чтобы обойти это, вы должны либо сохранить текстовые блоки в списке & lt; string & gt; или использовать вышеупомянутый строковый конструктор. – kritzikratzi 23 March 2014 в 20:55
  • 4
    Гораздо быстрее, чем что? Это, скорее всего, not быстрее, чем добавление к StringBuffer. -1 – user207421 28 August 2014 в 11:02
  • 5
    @ gb96 Я думал о размерах буфера, но подробный эксперимент в этого вопроса дал удивительные результаты в аналогичном контексте: буфер 16 КБ был последовательно и заметно быстрее. – chiastic-security 12 September 2014 в 19:14

Вот простое решение:

String content;

content = new String(Files.readAllBytes(Paths.get("sample.txt")));
60
ответ дан Nery Jr 16 August 2018 в 05:22
поделиться

Методы внутри org.apache.commons.io.FileUtils также могут быть очень удобными, например :

/**
 * Reads the contents of a file line by line to a List
 * of Strings using the default encoding for the VM.
 */
static List readLines(File file)
21
ответ дан Palec 16 August 2018 в 05:22
поделиться

Что вы хотите сделать с текстом? Является ли файл достаточно маленьким, чтобы вписаться в память? Я попытался бы найти самый простой способ обработки файла для ваших нужд. Для этого используется библиотека FileUtils.

for(String line: FileUtils.readLines("my-text-file"))
    System.out.println(line);
17
ответ дан Peter Lawrey 16 August 2018 в 05:22
поделиться

Используйте Java kiss , если речь идет о простоте структуры:

import static kiss.API.*;

class App {
  void run() {
    String line;
    try (Close in = inOpen("file.dat")) {
      while ((line = readLine()) != null) {
        println(line);
      }
    }
  }
}
55
ответ дан Peter Mortensen 16 August 2018 в 05:22
поделиться
  • 1
    Закройте читателя в конце – PhiLho 28 May 2013 в 14:50
  • 2
    или использовать "try-with-resources" try (FileReader reader = new FileReader (файл)) – Hernán Eche 16 January 2014 в 15:04
  • 3
    Я заметил файл.length (), насколько хорошо это работает с файлами utf-16? – Wayne 30 January 2014 в 05:02
  • 4
    Этот метод предполагает, что read () заполняет буфер; что количество символов равно числу байтов; что количество байтов вписывается в память; и количество байтов вписывается в целое число. -1 – user207421 28 August 2014 в 11:01
  • 5
    Очень связанный, уже существующий ответ - это Иисус Рамос. – Palec 2 January 2015 в 09:59
  • 6
    Это не будет работать, если файл пуст. – vitaut 12 August 2015 в 18:57
  • 7
    Правда, должно быть: if(scanner.hasNext()) content = scanner.next(); – David Soroko 13 August 2015 в 21:14
  • 8
    Этот код просто ошибочен. – Stefan Reich 17 September 2015 в 18:56
  • 9
    прекрасно работает. благодаря! – Punter Vicky 2 November 2016 в 00:54
  • 10
    Файл с FileReader: при использовании FileReader файл должен существовать, а разрешения для операционной системы должны разрешать доступ. С помощью файла можно проверить эти разрешения или проверить, является ли файл каталогом. Файл имеет полезные функции: isFile (), isDirectory (), listFiles (), canExecute (), canRead (), canWrite (), exists (), mkdir (), delete (). File.createTempFile () записывает в системный каталог temp по умолчанию. Этот метод вернет объект файла, который можно использовать для открытия объектов FileOutputStream и т. Д. source – ThisClark 22 November 2016 в 16:13
  • 11
    Это не удается для меня на Android 4.4. Только 1024 байта читаются. YMMV. – Roger Keays 24 November 2016 в 11:11
  • 12
    Как указать путь, если папки присутствуют внутри проекта? – Kavipriya 28 March 2017 в 05:43
  • 13
    Как насчет java.nio.file.Files? Теперь мы можем просто использовать readAllLines, readAllBytes и lines. – Claude Martin 1 September 2017 в 15:40
  • 14
    Вы не можете использовать это для «любого файла, который вы хотите». Его можно использовать только для ресурсов, которые были упакованы в файл JAR или WAR. – user207421 4 February 2018 в 09:44

Cactoos дает вам декларативный однострочный шрифт:

new TextOf(new File("a.txt")).asString();
1
ответ дан yegor256 16 August 2018 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: