I want to read a word file in java
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hwpf.*;
import org.apache.poi.hwpf.extractor.*;
import org.apache.poi.hwpf.usermodel.HeaderStories;
import java.io.*;
public class ReadDocFileFromJava {
public static void main(String[] args) {
/**This is the document that you want to read using Java.**/
String fileName = "C:\Path to file\Test.doc";
/**Method call to read the document (demonstrate some useage of POI)**/
readMyDocument(fileName);
}
public static void readMyDocument(String fileName){
POIFSFileSystem fs = null;
try {
fs = new POIFSFileSystem(new FileInputStream(fileName));
HWPFDocument doc = new HWPFDocument(fs);
/** Read the content **/
readParagraphs(doc);
int pageNumber=1;
/** We will try reading the header for page 1**/
readHeader(doc, pageNumber);
/** Let's try reading the footer for page 1**/
readFooter(doc, pageNumber);
/** Read the document summary**/
readDocumentSummary(doc);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void readParagraphs(HWPFDocument doc) throws Exception{
WordExtractor we = new WordExtractor(doc);
/**Get the total number of paragraphs**/
String[] paragraphs = we.getParagraphText();
System.out.println("Total Paragraphs: "+paragraphs.length);
for (int i = 0; i < paragraphs.length; i++) {
System.out.println("Length of paragraph "+(i +1)+": "+ paragraphs[i].length());
System.out.println(paragraphs[i].toString());
}
}
public static void readHeader(HWPFDocument doc, int pageNumber){
HeaderStories headerStore = new HeaderStories( doc);
String header = headerStore.getHeader(pageNumber);
System.out.println("Header Is: "+header);
}
public static void readFooter(HWPFDocument doc, int pageNumber){
HeaderStories headerStore = new HeaderStories( doc);
String footer = headerStore.getFooter(pageNumber);
System.out.println("Footer Is: "+footer);
}
public static void readDocumentSummary(HWPFDocument doc) {
DocumentSummaryInformation summaryInfo=doc.getDocumentSummaryInformation();
String category = summaryInfo.getCategory();
String company = summaryInfo.getCompany();
int lineCount=summaryInfo.getLineCount();
int sectionCount=summaryInfo.getSectionCount();
int slideCount=summaryInfo.getSlideCount();
enter code here
System.out.println("---------------------------");
System.out.println("Category: "+category);
System.out.println("Company: "+company);
System.out.println("Line Count: "+lineCount);
System.out.println("Section Count: "+sectionCount);
System.out.println("Slide Count: "+slideCount);
}
}
http://sanjaal.com/java/tag/java-and-docx-format/
I want to read a doc or docx file in Java
Эта статья является продолжением знакомства с возможностями библиотеки Apache POI. В прошлой статье мы научились создавать новые Word документы на Java, а сегодня рассмотрим простой пример считывания данных с файлов в формате docx.
Считывание Word документа с помощью Apache POI
Давайте рассмотрим краткие теоретические сведения по работе с библиотекой, колонтитулами и параграфами. Считанный в память docx документ представляет собой экземпляр класса XWPFDocument
, который мы будем разбирать на составляющие. Для этого нам понадобятся специальные классы:
- Отдельные классы
XWPFHeader
иXWPFFooter
— для работы (считывания/создания) верхнего и нижнего колонтитулов. Доступ к ним можно получить через специальный класс-поставщикXWPFHeaderFooterPolicy
. - Класс
XWPFParagraph
— для работы с параграфами. - Класс
XWPFWordExtractor
— для парсинга содержимого всей страницы docx документа
Apache POI содержит множество других полезных классов для работы с таблицами и медиа объектами внутри Word документа, но в этой ознакомительной статье мы ограничимся лишь с разбором колонтитулов и парсингом текстовой информации.
Пример чтения документа Word в формате docx с помощью Apache POI
Теперь добавим в проект библиотеку Apache POI для работы с Word именно в docx формате. Я использую maven, поэтому просто добавлю в проект еще одну зависимость
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi—ooxml</artifactId> <version>3.11</version> </dependency> |
Если вы используете gradle или хотите вручную добавить библиотеку в проект, то найти ее можно здесь.
Парсить/считывать я буду docx документ, полученный в предыдущей статье — Создание Word файла. Вы можете использовать свой файл. Содержимое моего документа следующее:
Теперь напишем простой класс для считывания данных из колонтитулов и параграфов документа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package ua.com.prologistic.excel; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFFooter; import org.apache.poi.xwpf.usermodel.XWPFHeader; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import java.io.FileInputStream; import java.util.List; public class WordReader { public static void main(String[] args) { try (FileInputStream fileInputStream = new FileInputStream(«F:/Apache POI Word Test.docx»)) { // открываем файл и считываем его содержимое в объект XWPFDocument XWPFDocument docxFile = new XWPFDocument(OPCPackage.open(fileInputStream)); XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(docxFile); // считываем верхний колонтитул (херед документа) XWPFHeader docHeader = headerFooterPolicy.getDefaultHeader(); System.out.println(docHeader.getText()); // печатаем содержимое всех параграфов документа в консоль List<XWPFParagraph> paragraphs = docxFile.getParagraphs(); for (XWPFParagraph p : paragraphs) { System.out.println(p.getText()); } // считываем нижний колонтитул (футер документа) XWPFFooter docFooter = headerFooterPolicy.getDefaultFooter(); System.out.println(docFooter.getText()); /*System.out.println(«_____________________________________»); // печатаем все содержимое Word файла XWPFWordExtractor extractor = new XWPFWordExtractor(docxFile); System.out.println(extractor.getText());*/ } catch (Exception ex) { ex.printStackTrace(); } } } |
Запустим и смотрим в консоль:
Верхний колонтитул — создано с помощью Apache POI на Java :) Prologistic.com.ua — новые статьи по Java и Android каждую неделю. Подписывайтесь! Просто нижний колонтитул |
Начинающие Java программисты, обратите внимание, что мы использовали конструкцию try-with-resources — особенность Java 7. Подробнее читайте в специальном разделе Особенности Java 7.
Другой способ считать содержимое Word файла
Приведенный выше пример сначала парсит отдельные части документа, а потом печатает в консоль их содержимое. А как быть, если мы просто хотим посмотреть все содержимое файла сразу? Для этого в Apache POI есть специальный класс XWPFWordExtractor, с помощью которого мы в 2 строчки сделаем то, что нам нужно.
Просто раскомментируйте код в листинге выше и еще раз запустите проект. В консоле просто продублируется вывод на экран.
Подробнее о библиотеке Apache POI читайте здесь, а также посмотрите пример чтения Excel файла, а также создания Excel (xls) документа все помощью Apache POI.
Подписывайтесь на новые статьи по Java и Android.
Чтение и запись текстовых файлов
Последнее обновление: 26.04.2018
Хотя с помощью ранее рассмотренных классов можно записывать текст в файлы, однако они предназначены прежде всего дл работы с бинарными
потоками данных, и их возможностей для полноценной работы с текстовыми файлами недостаточно. И для этой цели служат совсем другие классы, которые являются наследниками абстрактных классов Reader
и Writer
.
Запись файлов. Класс FileWriter
Класс FileWriter является производным от класса Writer. Он используется для записи текстовых файлов.
Чтобы создать объект FileWriter, можно использовать один из следующих конструкторов:
FileWriter(File file) FileWriter(File file, boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, boolean append)
Так, в конструктор передается либо путь к файлу в виде строки, либо объект File, который ссылается на конкретный текстовый файл. Параметр append
указывает, должны ли данные дозаписываться в конец файла (если параметр равен true), либо файл должен перезаписываться.
Запишем в файл какой-нибудь текст:
import java.io.*; public class Program { public static void main(String[] args) { try(FileWriter writer = new FileWriter("notes3.txt", false)) { // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('n'); writer.append('E'); writer.flush(); } catch(IOException ex){ System.out.println(ex.getMessage()); } } }
В конструкторе использовался параметр append
со значением false — то есть файл будет перезаписываться. Затем с помощью методов, определенных в базовом
классе Writer производится запись данных.
Чтение файлов. Класс FileReader
Класс FileReader наследуется от абстрактного класса Reader и предоставляет функциональность для чтения текстовых файлов.
Для создания объекта FileReader мы можем использовать один из его конструкторов:
FileReader(String fileName) FileReader(File file) FileReader(FileDescriptor fd)
А используя методы, определенные в базом классе Reader, произвести чтение файла:
import java.io.*; public class Program { public static void main(String[] args) { try(FileReader reader = new FileReader("notes3.txt")) { // читаем посимвольно int c; while((c=reader.read())!=-1){ System.out.print((char)c); } } catch(IOException ex){ System.out.println(ex.getMessage()); } } }
Также мы можем считывать в промежуточный буфер из массива символов:
import java.io.*; import java.util.Arrays; public class Program { public static void main(String[] args) { try(FileReader reader = new FileReader("notes3.txt")) { char[] buf = new char[256]; int c; while((c = reader.read(buf))>0){ if(c < 256){ buf = Arrays.copyOf(buf, c); } System.out.print(buf); } } catch(IOException ex){ System.out.println(ex.getMessage()); } } }
В данном случае считываем последовательно символы из файла в массив из 256 символов, пока не дойдем до конца файла в этом случае метод read возвратит число -1.
Поскольку считанная порция файла может быть меньше 256 символов (например, в файле всего 73 символа), и если количество считанных данных меньше размера буфера (256),
то выполняем копирование массива с помощью метода Arrays.copy. То есть фактически обрезаем массив buf, оставляя в нем только те символы, которые считаны из файла.
Автор оригинала: Nikita Masand.
В этой статье мы научимся читать и писать Microsoft Word с помощью библиотеки POI Apache .
Темы
- Apache POI – HWPF и XWPF
- Зависимости POI Apache
- Создайте документ word
- Работа с абзацами, шрифтами и страницей перерывы
- Верхний и нижний колонтитулы документа
- Добавить изображение
- Создайте таблицу
- Прочитайте и проанализируйте документ, абзац и таблицу
- Обновить документ
P.S Протестировано с Apache POI 4.1.2 и Java 8
1. Apache POI – HWPF и XWPF
Apache POI предоставляет API Java для работы с документами Microsoft. Мы рассмотрим варианты использования, включающие абзацы, шрифты, верхние и нижние колонтитулы, таблицы, изображения, запись, чтение, анализ и обновление документа. Прежде чем изучить варианты использования, давайте рассмотрим основные концепции, связанные с библиотекой POI Apache.
1.1 HWPF (ужасный формат текстового процессора) Эти API-интерфейсы предназначены для более старых форматов файлов Word 6 и Word 95, .doc
документы.
1.2 XWPF (формат текстового процессора XML) Эти API предназначены для новых документов Word 2007, .docx
.
Документ XWPFDocument | Он предоставляет API-интерфейсы высокого уровня для создания / редактирования файлов .docx word |
xwpfпараграф | Он используется для работы с абзацами |
XWPFRun | Он определяет область текста с общим набором свойств. Он также используется для редактирования свойств шрифта |
XWPFTable | Он используется для описания содержимого компонента таблицы, присутствующего в файле word |
XWPFTableRow | Он определяет строки, присутствующие в компоненте таблицы |
Xwpfвордэкстрактор | Он используется для извлечения текста из файла word |
P.S Эта статья будет посвящена последним XWPF API-интерфейсы, работа с .docx документы.
Нам нужен только poi-ooxml
для работы с Microsoft word.
org.apache.poi poi-ooxml 4.1.2
3. Создайте документ word
В этом примере показано, как создать файл Microsoft Word .docx
. Мы используем XWPFParagraph
для создания абзацев и XWPFRun
для создания текста.
package com.mkyong.poi.word; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.FileOutputStream; import java.io.IOException; public class CreateDocumentSimple { public static void main(String[] args) throws IOException { String fileName = "c:\test\hello.docx"; try (XWPFDocument doc = new XWPFDocument()) { // create a paragraph XWPFParagraph p1 = doc.createParagraph(); p1.setAlignment(ParagraphAlignment.CENTER); // set font XWPFRun r1 = p1.createRun(); r1.setBold(true); r1.setItalic(true); r1.setFontSize(22); r1.setFontFamily("New Roman"); r1.setText("I am first paragraph."); // save it to .docx file try (FileOutputStream out = new FileOutputStream(fileName)) { doc.write(out); } } } }
Выход
4. Работа с абзацами, шрифтами и разрывы страниц
Мы можем использовать XWPFRun
для настройки свойств стиля шрифта. Он содержит методы изменения свойств шрифта, таких как цвет, размер шрифта, курсив, жирный шрифт, заглавные буквы, тиснение и многое другое.
Мы создаем четыре абзаца и устанавливаем различные свойства шрифта, разрывы строк и разрывы страниц для каждого из них.
package com.mkyong.poi.word; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.FileOutputStream; import java.io.IOException; public class WorkingParagraphFonts { public static void main(String[] args) throws IOException { try (XWPFDocument doc = new XWPFDocument()) { XWPFParagraph p1 = doc.createParagraph(); p1.setAlignment(ParagraphAlignment.CENTER); // Set Text to Bold and font size to 22 for first paragraph XWPFRun r1 = p1.createRun(); r1.setBold(true); r1.setItalic(true); r1.setFontSize(22); r1.setText("I am first paragraph. My Text is bold, italic, Courier and capitalized"); r1.setFontFamily("Courier"); XWPFParagraph p2 = doc.createParagraph(); //Set color for second paragraph XWPFRun r2 = p2.createRun(); r2.setText("I am second paragraph. My Text is Red in color and is embossed"); r2.setColor("ff0000"); r2.setEmbossed(true); XWPFParagraph p3 = doc.createParagraph(); //Set strike for third paragraph and capitalization XWPFRun r3 = p3.createRun(); r3.setStrikeThrough(true); r3.setCapitalized(true); r3.setText("I am third paragraph. My Text is strike through and is capitalized"); XWPFParagraph p4 = doc.createParagraph(); p4.setWordWrapped(true); p4.setPageBreak(true); // new page break p4.setIndentationFirstLine(600); XWPFRun r4 = p4.createRun(); r4.setFontSize(40); r4.setItalic(true); //r4.setTextPosition(100); r4.setText("Line 1"); r4.addBreak(); r4.setText("Line 2"); r4.addBreak(); r4.setText("Line 3"); // save the docs try (FileOutputStream out = new FileOutputStream("c:\test\simple.docx")) { doc.write(out); } } } }
Рисунок: Страница 1
Рисунок: Страница 2
5. Верхний и нижний колонтитулы документа
В этом примере создается верхний и нижний колонтитулы документа для всех страниц.
Рисунок: Страница 1
Рисунок: Страница 2
6. Добавить изображение
В этом примере в документ добавляется изображение.
7. Создайте таблицу
В этом примере мы рассмотрим, как мы можем вставить таблицу в файл документа Word. Мы будем использовать компонент XWPFTable
для создания и инициализации элемента таблицы.
В этом примере вставляется таблица, содержащая 3 строки и 3 столбца.
P.S Предупреждение для OpenOffice 4.1.7, API-интерфейсы таблиц неправильно отформатировали таблицу.
8. Прочитайте и проанализируйте документ, абзац и таблицу.
В этом примере будет показано, как мы можем использовать POI Apache для извлечения и считывания текста из документов.
8.1 Мы можем извлечь весь текст из документа с помощью XWPFWordExtractor
. Файл simple.docx
генерируется из примера 4. Работа с абзацами, шрифтами и разрывами страниц .
Вывод
8.2 В этом примере мы используем doc.getparagraphs()
для списка абзацев документа. Как только мы получим список, мы сможем повторить отдельные элементы абзаца и получить текст.
8.3 Файл table.docx
генерируется из примера 7. Создайте таблицу . Нам нужно получить список всех элементов в файле, а затем выполнить итерацию по нему, чтобы проверить наличие компонента ТАБЛИЦА
. Как только мы найдем компонент ТАБЛИЦА
, мы можем выполнить итерацию по нему, чтобы извлечь строки таблицы, и, наконец, выполнить итерацию по строкам, чтобы извлечь значения таблицы.
Вывод
9 . Обновить документ
В этом примере мы будем использовать предварительно заполненный файл шаблона template.docx
. Файл шаблона содержит следующий текст Привет ${имя}, Поздравляю, вы учитесь чему-то новому!
. И мы заменим строку ${имя}
предопределенным вводом и создадим новый файл output.docx
с обновленным содержимым.
Рисунок: c:testtemplate.docx
Вывод
Рисунок: c:testoutput.docx
Дальнейшее чтение Для получения дополнительных примеров, пожалуйста, обратитесь к этому официальному Примеры Apache POI XWPF
Скачать исходный код
$ клон git https://github.com/mkyong/apache-poi-examples/
$ cd word
Ссылки
- Microsoft Word
- Apache POI – Java API для обработки файлов Microsoft Word
- Примеры XWPF Apache POI
| Идентификатор текущей записи загружено через JS |/автор комментарии
Оригинал: “https://mkyong.com/java/java-read-and-write-microsoft-word-with-apache-poi/”
Управление текстовыми файлами — это навык, который хорошо послужит вам в вашей карьере программиста. В этом разделе вы узнаете, как создать, открыть и прочитать текстовый файл Java.
Под текстовым файлом мы имеем в виду файл с текстом — все просто! Вы можете создать текстовый файл в таких программах, как Блокнот на компьютере с Windows, TextEdit на Mac, Gedit в среде Linux/Gnome.
Первое, что мы сделаем, это откроем текстовый файл и прочитаем его содержимое.
Как прочитать текстовый файл
Для этой цели начните новый проект. Назовите пакет openandread, а класс ReadFile. Добавьте оператор импорта чуть ниже названия пакета и перед именем класса:
import java.io.IOException;
Ваше окно с кодом будет выглядеть так:
package openandread; import java.io.IOException; public class ReadFile { public static void main(String[] args) throws IOException { } }
Чтобы Java-программа работала корректно с нашими текстовыми файлами, добавьте следующее к методу main (текст на синем фоне):
public static void main(String[] args) throws IOException { }
Мы говорим Java, что метод main вызовет ошибку IOException, и что ее необходимо устранить. Позже мы добавим блок try … catch, чтобы отобразить соответствующее сообщение об ошибке для пользователя.
Чтобы открыть текстовый файл, давайте создадим новый класс. Итак выберите File > New File в меню NetBeans вверху. Создайте новый файл Java Class и дайте ему имя FileData. Когда ваш новый класс будет создан, добавьте следующие три оператора импорта:
import java.io.IOException; import java.io.FileReader; import java.io.BufferedReader;
Ваш новый класс должен выглядеть следующим образом:
(Все три импорта подчеркнуты желтым цветом, потому что мы еще ничего с ними не сделали. Это функция NetBeans.)
Для того, чтобы прочитать текстовый файл Java, мы создадим новый объект из этого класса. Добавьте следующий конструктор в свой код вместе с приватным полем String с именем path_to_file:
public class FileData { private String path_to_file; public FileData (String path) { path_to_file = path; } }
То, что мы здесь делаем, это передаем в метод имя переменной, содержащей путь к текстовому файлу, который будем читать, а затем присваиваем этой переменной новое имя, которое будем использовать в дальнейшем в нашем методе.
Теперь нам нужно создать метод, который возвращает все строки кода из текстового файла. Они будут храниться в массиве. Добавьте следующее объявление метода, который откроет файл:
Не переживайте из-за красного подчеркивания: оно исчезнет, как только мы добавим код. NetBeans добавляет подчеркивание, потому что у нас нет оператора return.
Обратите внимание, что метод настроен на возврат массива String:
public String[]
Массив будет содержать все строки из текстового файла.
Также обратите внимание, что мы добавили в конец заголовка метода throws IOException. Каждый метод, который работает над чтением текстовых файлов в Java, нуждается в подобном методе. Throw в переводе с английского означает «выбросить». Java выбросит ошибки, которые мы сможем увидеть в нашем методе main.
Для того, что прочитать символы из текстового файла используется FileReader. Он читает байты из текстового файла, а каждый байт является отдельным символом.
Вы можете читать целые строки текста, а не отдельные символы. Для этого нужно передать то, что находится в FileReader классу BufferedReader. BufferedReader имеет удобный метод, называемый ReadLine. Как следует из названия, он используется для чтения целых строк, а не отдельных символов. А вот BufferedReader сохраняет символы в памяти (в буфере), чтобы ими было легче манипулировать.
Давайте установим FileReader и BufferedReader:
public String[] OpenAndRead() throws IOException { FileReader x = new FileReader(path_to_file); BufferedReader varRead = new BufferedReader(x); }
Здесь мы создаем два новых объекта: первый — это объект FileReader, который мы назвали x; второй — это объект BufferedReader с именем varRead.
FileReader открывает и считывает файл, исходя из пути к нему. Эту информацию мы сохраняем в переменной path_to_file. А дальше мы можем использовать ее.
В BufferedReader передается объект FileReader (в круглых скобках). Все символы файла затем сохранятся в памяти в ожидании манипуляции. Они сохранятся в переменной varRead.
Прежде чем мы сможем прочитать текст из нашего текстового файла, нам нужно настроить массив. Каждая позиция в массиве может содержать одну полную строку текста. Поэтому добавьте следующее в свой код:
int num = 3; String[] lines = new String[num];
Сейчас мы установили количество строк в текстовом файле равным 3. Очевидно, что текстовые файлы могут содержать любое количество строк, и мы обычно не знаем, сколько их. Поэтому вскоре мы это изменим. Мы напишем отдельный метод, который получает количество строк в текстовом файле.
Дальше мы устанавливаем массив строк. Количество позиций в массиве (его размер) устанавливается равным количеству строк. Мы поместили эту переменную в квадратные скобки.
Чтобы поместить все строки текста из файла в каждую позицию в массиве, нам нужен цикл. Цикл получит каждую строку текста и поместит их в массив. Добавьте следующее в код:
int i; for (i = 0; i < num; i++) { lines[i] = varRead.readLine(); }
Ваше окно с кодом должно выглядеть так:
public String[] OpenAndRead() throws IOException { FileReader x = new FileReader(path_to_file); BufferedReader varRead = new BufferedReader(x); int num = 3; String[] lines = new String[num]; int i; for (i = 0; i < num; i++) { lines[i] = varRead.readLine(); } }
Цикл for идет от 0 до меньше, чем количества строк. (Помните, позиции массива начинаются с 0. Три строки будут сохранены в позициях 0, 1 и 2.)
Здесь мы обращаемся к строкам текста и сохраняем их в массив:
lines[i] = varRead.readLine();
После знака равенства мы имеем это:
varRead.readLine();
Объект varRead, который мы установили, читает все символы из текстового файла, которые находятся в памяти (в буфере). Мы можем использовать метод readLine, чтобы прочитать полную строку текстового файла из буфера. После того, как строка прочитана, мы сохраняем ее в позиции массива:
lines[i]
Переменная с именем i будет увеличиваться каждый раз согласно условиям цикла, проходя через весь массив, хранящий наш текст.
Осталось добавить в метод следующее:
varRead.close(); return lines;
Метод close очищает временный буфер памяти с именем varRead. Возвращаемая строка возвращает весь массив. Обратите внимание, что для этого массива квадратные скобки не требуются.
Когда вы закончите написание кода этого метода, все эти уродливые подчеркивания должны исчезнуть. Ваш метод должен выглядеть следующим образом:
public String[] OpenAndRead() throws IOException { FileReader x = new FileReader(path_to_file); BufferedReader varRead = new BufferedReader(x); int num = 3; String[] lines = new String[num]; int i; for (i = 0; i < num; i++) { lines[i] = varRead.readLine(); } varRead.close(); return lines; }
Однако все еще существует проблема количества строк. Мы указали жесткое 3. Нам нужно прочитать весь текстовый файл и посчитать, сколько в нем строк. Поэтому добавьте следующий метод в класс FileData:
int numStrings() throws IOException { FileReader text = new FileReader(path_to_file); BufferedReader y = new BufferedReader(text); String one; int num = 0; while ((one = y.readLine()) != null) { num++; } y.close(); return num; }
Новый метод называется numStrings и настроен на возврат целочисленного значения. Это количество строк в текстовом файле. Обратите внимание, что этот метод в заголовке также имеет IOException.
В этом коде устанавливается другой FileReader и другой BufferedReader. Чтобы поставить в цикл наш текст, мы написали:
while ((one = y.readLine()) != null) { num++; }
Цикл while выглядит немного грязно. Но он просто говорит «прочитайте каждую строку текста и остановитесь, когда не будет достигнуто нулевое значение». (Если Java прочитала весь текстовый файл, и больше не осталось строк, вернется значение null.) В фигурных скобках мы увеличиваем счетчик с именем num.
В конце кода мы очищаем буфер памяти с именем y и возвращаем количество строк.
Чтобы вызвать этот новый метод в действие, измените методе OpenAndRead это:
int num = 3;
На это:
int num = numStrings();
Таким образом, вместо жесткого указания количества строк, мы можем вызвать наш новый метод и получить количество строк в любом текстовом файле.
Хорошо, пришло время запустить новый класс и посмотреть, открывает ли он текстовый файл и сможет ли он прочитать его.
Вернитесь к классу ReadFile, классу с методом main. Установите строковую переменную для хранения имени текстового файла:
package openandread; import java.io.IOException; public class ReadFile { public static void main(String[] args) throws IOException { String new_path = "D:/test.txt"; } }
На этом этапе вам нужно создать текстовый файл где-нибудь на компьютере. Мы создали его в блокноте на компьютере с Windows:
Имя текстового файла — test.txt. Создайте аналогичный у себя. Обратите внимание, куда вы его сохраняете, чтоб указать правильный путь к нему:
String new_path = "D:/test.txt";
Если бы мы создали папку с именем MyFiles для хранения этого файла, путь был бы «D: /MyFiles/test.txt». Измените путь к файлу, если это необходимо.
Следующее, что нужно сделать, — это создать новый объект из нашего класса FileData. Затем мы сможем вызвать метод, который откроет и прочитает наш текстовый файл в Java. Мы сделаем это в блоке try … catch.
Добавьте следующий код под переменной String:
try { FileData new_file = new ReadFile(new_path); String[] aryStrings = new_file.OpenAndRead(); } catch (IOException a) { System.out.println(a.getMessage()); }
Не забудьте все фигурные скобки для блока try … catch. Вам нужна одна пара для части try и другая — для части catch. Для пробной части у нас есть это:
FileData new_file = new ReadFile(new_path); String[] aryStrings = new_file.OpenAndRead();
Первая строка устанавливает новый объект FileData с именем new_file. В круглых скобках FileData мы добавили переменную new_path. Этого достаточно, чтобы передать конструктору путь к файлу, который ему нужен.
Вторая строка кода устанавливает массив String с именем aryStrings. После знака равенства мы вызвали метод OpenAndRead нашего класса FileData. Если он успешно открывает текстовый файл, то массив текстовых строк будет передан новому массиву aryStrings.
Однако, если что-то пойдет не так, появится ошибка, которую мы поместили в части catch блока try … catch:
catch (IOException a) { System.out.println(a.getMessage()); }
После слова catch в круглых скобках у нас есть это:
IOException a
Для этого исключения мы устанавливаем переменную с именем a, которая имеет тип IOException. У объекта IOException есть собственные методы, которые вы можете использовать. Одним из таких методов является getMessage. Это даст пользователю некоторую информацию о том, что пошло не так.
Прежде чем мы увидим пример сообщения об ошибке, давайте пройдемся по всем строкам текстового файла, распечатав каждую. Добавьте следующий код цикла в try блока try … catch:
int i; for (i = 0; i < aryStrings.length; i++) { System.out.println(aryStrings[i]); }
Ваше окно с кодом должно теперь выглядеть так:
package openandread; import java.io.IOException; public class ReadFile { public static void main(String[] args) throws IOException { String new_path = "D:/test.txt"; try { FileData new_file = new FileData(new_path); String[] aryStrings = new_file.OpenAndRead(); int i; for (i = 0; i < aryStrings.length; i++) { System.out.println(aryStrings[i]); } } catch (IOException a) { System.out.println(a.getMessage()); } } }
Когда программа будет запущена, в окне «Вывод» будет напечатано следующее:
Как видите, с помощью Java мы прочитали каждую строку из нашего текстового файла.
Чтобы проверить часть кода, проверяющую ошибки, измените имя вашего текстового файла на тот, который, как вы знаете, не был создан. Затем запустите этот код. В окне «Вывод» ниже вы можете видеть, что наш текстовый файл был изменен на test2, и его не удалось найти:
При желании вы можете добавить собственное сообщение об ошибке в блок catch:
catch (IOException e) { System.out.println("Извини, друг, не могу это сделать!"); }
Как прочитать текстовый файл с русскими буквами в Java
Если вас интересует, как прочитать текстовый файл на русском языке, то:
- Нужно добавить еще несколько import:
import java.io.InputStreamReader; import java.io.Reader; import java.io.FileInputStream;
- В методе numStrings замените строку:
FileReader text = new FileReader(path_to_file);
На эту:
Reader text = new InputStreamReader(new FileInputStream(path_to_file), "Cp1251");
- В методе OpenAndRead замените строку:
FileReader x = new FileReader(path_to_file);
На эту:
Reader x = new InputStreamReader(new FileInputStream(path_to_file), "Cp1251");
Cp1251 – это кодировка, в которой выполнен текстовый файл. Мы конвертируем символы кириллицы с помощью InputStreamReader и FileInputStream.
Окно «Вывод» будет следующим:
В следующем уроке вы узнаете, как сделать запись в уже существующий текстовый файл или создать новый, используя код Java.