oleglomako / Как построчно считывать файл в Java.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| import java . io . BufferedReader ; |
| import java . io . File ; |
| import java . io . FileNotFoundException ; |
| import java . io . FileReader ; |
| import java . io . IOException ; |
| public class ReadFileLineByLine |
| // построчное считывание файла |
| public static void main ( String [] args ) |
| try |
| File file = new File ( «/Users/prologistic/file.txt» ); |
| //создаем объект FileReader для объекта File |
| FileReader fr = new FileReader ( file ); |
| //создаем BufferedReader с существующего FileReader для построчного считывания |
| BufferedReader reader = new BufferedReader ( fr ); |
| // считаем сначала первую строку |
| String line = reader . readLine (); |
| while ( line != null ) |
| System . out . println ( line ); |
| // считываем остальные строки в цикле |
| line = reader . readLine (); |
| > |
| > catch ( FileNotFoundException e ) |
| e . printStackTrace (); |
| > catch ( IOException e ) |
| e . printStackTrace (); |
| > |
| > |
| > |
Как считать строки из файла java
Хотя с помощью ранее рассмотренных классов можно записывать текст в файлы, однако они предназначены прежде всего дл работы с бинарными потоками данных, и их возможностей для полноценной работы с текстовыми файлами недостаточно. И для этой цели служат совсем другие классы, которые являются наследниками абстрактных классов 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, оставляя в нем только те символы, которые считаны из файла.
Чтение больших текстовых файлов построчно в Java
Часто перед программистами, особенно начинающими, встает задача чтения больших текстовых файлов в Java. Например, вы столкнулись с задачей обработки большого текстового файла размером в несколько гигабайт. Цель — прочитать файл построчно. При этом важно решить эту задачу быстро и эффективно.
Пример
Допустим, у вас есть большой текстовый файл, который содержит информацию о пользователях интернет-сервиса. Каждая строка файла — это отдельный пользователь, данные о котором вы хотите загрузить в базу данных.
Решение
В Java для чтения текстовых файлов есть несколько способов, но самым эффективным и быстрым является использование класса BufferedReader .
import java.io.*; public class ReadFile < public static void main(String[] args) < try < File file = new File("path_to_your_file"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line; while((line = br.readLine()) != null)< // обработка строки >br.close(); fr.close(); > catch (IOException e) < e.printStackTrace(); >> >
Объяснение
В приведенном выше примере сначала создается объект File , который представляет собой файл для чтения. Затем этот файл передается в FileReader для чтения данных.
BufferedReader оборачивает FileReader и обеспечивает буферизованное чтение, что значительно ускоряет процесс чтения файла.
В цикле while с помощью метода readLine() происходит построчное чтение файла до тех пор, пока не будут прочитаны все строки (когда readLine() вернет null ).
После завершения чтения файла, важно закрыть BufferedReader и FileReader с помощью метода close() , чтобы освободить ресурсы.
Заключение
Таким образом, с помощью BufferedReader можно быстро и эффективно прочитать большой текстовый файл построчно в Java.
Java. Считать строки из файла
День считать в int переменную, название месяца в String переменную. Никак не могу разобраться как это сделать?
Scanner sc = new Scanner(new File("d:\\1.txt")); while(sc.hasNext()) < int tempDay = sc.nextInt(); String tempMonth = sc.nextLine(); theTree.insert(tempDay,tempMonth);//вставка данных в бинарное дерево >
Отслеживать
69 7 7 бронзовых знаков
задан 22 ноя 2017 в 17:04
Oleksii Petrushynskyi Oleksii Petrushynskyi
151 1 1 золотой знак 1 1 серебряный знак 9 9 бронзовых знаков
А как вы пытались?
22 ноя 2017 в 17:05
На этом форуме принято показывать наработки вместе с вопросом. Для решения вашей задачи советую обратить внимание на Scanner и split()
22 ноя 2017 в 17:07
@pinguin исправился, залил наработку. 🙂
22 ноя 2017 в 17:15
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Scanner sc = new Scanner(new File("d:\\1.txt")); int tempDay; String [] splitted; String tempMonth; while(sc.hasNext()) < splitted = sc.nextLine().split(" "); tempDay = Integer.parseInt(splitted[0]); tempMonth = splitted[1]; theTree.insert(tempDay,tempMonth);//вставка данных в бинарное дерево >
UPD: Проверил у себя чтение из файла – все работает:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class test < public static void main(String[] args) throws FileNotFoundException < Scanner sc = new Scanner(new File("file.txt")); int tempDay; String [] splitted; String tempMonth; while(sc.hasNext())< splitted = sc.nextLine().split(" "); tempDay = Integer.parseInt(splitted[0]); tempMonth = splitted[1]; System.out.println(tempDay + "," + tempMonth); >> >
Отслеживать
ответ дан 22 ноя 2017 в 17:17
1,853 2 2 золотых знака 11 11 серебряных знаков 23 23 бронзовых знака
не считывается.
22 ноя 2017 в 17:24
@OleksiiPetrushynskyi в чем именно проблема? UPD. Исправил, забыл разделитель передать в split()
22 ноя 2017 в 17:27
из клавиатуры отлично читает и выводит, а от с файла не хочет. Не помогу понять почему
22 ноя 2017 в 17:38
@OleksiiPetrushynskyi вообще ничего не выводит?
22 ноя 2017 в 17:43
вообще, если с клавиатуры то выводит, а с файла нет
22 ноя 2017 в 17:46
Если использовать Scanner для большого количества скажем 10^5 уже будет выполняться более 1 секунды. Поэтому для больших данных лучше использовать StreamTokenizer. Вот пример работы.
import java.io.*; public class Example_Read < public static void main(String[] args) throws IOException< StreamTokenizer reader = new StreamTokenizer(new BufferedInputStream(new FileInputStream(new File("input.txt")))); while (reader.nextToken()!= StreamTokenizer.TT_EOF)< int day = (int)reader.nval; reader.nextToken(); String month = reader.sval; System.out.println(day + " " + month); >> >
Отслеживать
ответ дан 23 ноя 2017 в 0:29
- java
- файлы
- строки
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.