Как открыть файл в java программе

— А начнем мы с потоков для ввода/вывода файлов. Но обо всем по порядку.

Для чтений и записи файлов есть два класса: 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru