— А начнем мы с потоков для ввода/вывода файлов. Но обо всем по порядку.
Для чтений и записи файлов есть два класса: FileInputStream и FileOutputStream . Как ты уже, наверное, догадался, FileInputStream позволяет последовательно читать из файла байты, а FileOutputStream – записывать в файл байты. Вот какие методы есть у этих классов:
FileInputStream(String fileName);
int read();
int available();
void close();
Давай ради интереса посчитаем сумму всех байт в файле на диске. Вот как будет выглядеть этот код:
Подсчет суммы всех байт файла на диске
public static void main(String[] args) throws Exception < //создаем объект FileInputStream, привязанный к файлу «c:/data.txt». FileInputStream inputStream = new FileInputStream(«c:/data.txt»); long sum = 0; while (inputStream.available() > 0) //пока остались непрочитанные байты < int data = inputStream.read(); //прочитать очередной байт sum += data; //добавить его к общей сумме > inputStream.
close(); // закрываем поток System.out.println(sum); //выводим сумму на экран. >
Уроки Java для профессионалов | #4 — Запись и чтение данных из файлов (Java io)
— Мы уже раньше что-то подобное разбирали. А как устроен FileOutputStream?
FileOutputStream (String fileName);
— это конструктор. Позволяет указать имя файла на диске, в который созданный объект будет писать данные.
void write(int data);
— метод записывает очередной байт, обрезая переменную data до одного байта.
void flush();
— часто данные для записи сначала собираются в большие блоки в памяти, а потом только пишутся на диск.
Команда flush требует немедленно записать всю несохраненную информацию на диск.
void close();
— метод «закрывает» поток, вызывается после окончания работы с потоком.
Объект выполняет служебные операции, связанные с закрытием файла на диске и т.д.
В поток больше нельзя писать данные, flush при этом вызывается автоматически.
— Да, тут фактически только один метод для записи – write, который записывает только один байт за раз. Но благодаря ему можно записать в файл сколько угодно информации.
Программирование – это процесс разбиения одной большой и сложной задачи на много маленьких. Тут происходит практически тот же процесс: чтение и запись больших данных маленькими порциями – по кусочкам – по одному байту.
Вот как можно скопировать файл на диске, пользуясь этими классами:
Копируем файл на диске
public static void main(String[] args) throws Exception < //Создаем поток-чтения-байт-из-файла FileInputStream inputStream = new FileInputStream(«c:/data.txt»); // Создаем поток-записи-байт-в-файл FileOutputStream outputStream = new FileOutputStream(«c:/result.txt»); while (inputStream.available() > 0) //пока есть еще непрочитанные байты < int data = inputStream.read(); // прочитать очередной байт в переменную data outputStream.write(data); // и записать его во второй поток > inputStream.close(); //закрываем оба потока. Они больше не нужны. outputStream.close(); >
— Спасибо, Риша. Наконец-то понял, как на самом деле работает этот код.
Не запускается файл Java (.jar) в Windows | Как запустить .jar? | Решение проблемы
Комментарии (291)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сергей Уровень 18
15 мая 2023
Давно мучает вопрос оптимизации: зачем определять переменную в цикле? Будет ли оптимальнее определить ее перед циклом?
ssssssergeenkov Уровень 30
11 апреля 2023
Gans Electro Уровень 37
17 марта 2023
https://stackoverflow.com/questions/5155226/fileinputstream-vs-filereader Чтобы полностью понять это, вам нужно понять, что такое поток символов и байтов, поэтому давайте быстро взглянем на это— Потоки байтов Поток байтов обращается к файлу байт за байтом. Программы Java используют потоки байтов для ввода и вывода 8-битных байтов. Он подходит для любого типа файлов, однако не совсем подходит для текстовых файлов.
Например, если файл использует кодировку unicode и символ представлен двумя байтами, поток байтов будет обрабатывать их отдельно, и вам нужно будет выполнить преобразование самостоятельно. Байт-ориентированные потоки не используют никакой схемы кодирования, в то время как символьно-ориентированные потоки используют схему кодирования символов (UNICODE).
Все классы потока байтов происходят от InputStream и OutputStream . Поток символов Символьный поток будет считывать файл посимвольно. Символьный поток — это концепция более высокого уровня, чем поток байтов . Поток символов — это, по сути, поток байтов, который был обернут логикой, позволяющей ему выводить символы из определенной кодировки . Это означает, что потоку символов необходимо присвоить кодировку файла для правильной работы. Поток символов может поддерживать все типы наборов символов ASCII, Unicode, UTF-8, UTF-16 и т.д. Все классы символьного потока происходят от Reader и Writer. Если вы попытаетесь прочитать из .txtфайла, который был записан в кодировке Uni-8, которая по умолчанию используется в java, то чтение файла с помощью классов Reader и InputStream даст одинаковый результат.Так как здесь каждый байт представляет один символ. Я создал несколько методов, которые помогут вам понять разницу между этими двумя терминами —
FileInputStream reads byte by byte и FileReader reads char by char.
Пожалуйста, наберитесь терпения и читайте дальше, чтобы понять это.
Алексей Щукин Уровень 26
10 ноября 2022
Если у кого-то возник вопрос, как у меня, можно ли измерить размер файла (в байтах) приведённым в статье кодом, ответ — нет. Ниже код из статьи, о которой идёт речь:
public static void main(String[] args) throws Exception < //создаем объект FileInputStream, привязанный к файлу «c:/data.txt». FileInputStream inputStream = new FileInputStream(«c:/data.txt»); long sum = 0; while (inputStream.available() >0) //пока остались непрочитанные байты < int data = inputStream.read(); //прочитать очередной байт sum += data; //добавить его к общей сумме >inputStream.close(); // закрываем поток System.out.println(sum); //выводим сумму на экран. >
Метод read() возвращает код символа таблицы ASCII, следовательно эта программа суммирует не количество байт, а значения кодов из таблицы. Поэтому, когда я проверил результаты программы с данными операционной системы о размере одного и того же файла, естественно они не совпали. Чтобы получить реальный размер файла в байтах, достаточно использовать метод available(), например:
import java.io.FileInputStream; import java.io.IOException; public class FileSize < public static void main(String[] args) throws IOException < FileInputStream inputStream = new FileInputStream(«C:\1.png»); long bytes = inputStream.available(); // Получаем размер в байтах inputStream.close(); long kB = bytes / 1024; // Получаем размер в килобайтах long mB = kB / 1024; // Получаем размер в мегабайтах System.out.println(bytes + » bytes»); System.out.println(kB + » Kb»); System.out.println(mB + » Mb»); >>
Источник: javarush.com
Как открыть файл в 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, оставляя в нем только те символы, которые считаны из файла.
Источник: metanit.com
Как открыть файл или папку из java-приложения?
Каким образом можно открыть файл или папку, как будто мы открываем его через стандартный файловый браузер / Finder / и т.д.
Отслеживать
1,473 10 10 серебряных знаков 16 16 бронзовых знаков
задан 24 янв 2011 в 20:07
8,647 17 17 золотых знаков 73 73 серебряных знака 180 180 бронзовых знаков
Сформулируйте, пожалуйста, точнее. Не вполне понятно, чего надо сделать-то…
24 янв 2011 в 20:10
Могу предложить варианты: а) Вам нужен диалог открытия файла? б) Вы хотите сэмулировать двойноё щелчёк по файлу в оболочке? Т.е. чтоыб он открылся так, будто юзер по нему дважды щёлкнул?
24 янв 2011 в 20:13
Например: у нас есть картинка и к ней в ОС привязан стандартный Windows Picture and Fax Viewer. Нужно из java-приложения запустить этот самый Viewer с открытой в нем картинкой. 🙂
24 янв 2011 в 20:14
Да, понятно. Вам нужен аналог ShellExecute.
24 янв 2011 в 20:15
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Стоит обратить внимание на Desktop API. Вот статья, подробно описывающая его.
Desktop desktop = null; if (Desktop.isDesktopSupported())
try < desktop.open(new File(fileName)); >catch (IOException ioe)
Отслеживать
9,295 6 6 золотых знаков 23 23 серебряных знака 57 57 бронзовых знаков
ответ дан 24 янв 2011 в 20:21
1,473 10 10 серебряных знаков 16 16 бронзовых знаков
- java
- desktop
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник: ru.stackoverflow.com