Почему fileinputstream не читает excel
Из этой статьи вы сможете узнать о записи и чтении данных из Excel файлов в Java (будет рассмотрен как XLS , так и XLSX формат). Мы будем использовать библиотеку Apache POI и сосредоточимся на работе с типами String и Date , работа с последним происходит достаточно хитро. Напомню, что работу с числами мы уже рассмотрели в другой статье.
Библиотеку poi-XX.jar вы можете использовать для всех старых ( xls , doc , ppt ) файлов Microsoft Office, для новых ( xlsx , docx , pptx ) вам понадобится poi-ooxml-XX.jar . Очень важно понимать, что к чему относится, т.к. используемые классы тоже разные — для старых расширений это HSSFWorkbook , а для новых — XSSFWorkbook .
Подготовка: загрузка библиотек и зависимостей
Конечно, существует достаточно много открытых библиотек, которые позволяют работать с Excel файлами в Java, например, JXL, но мы будем использовать имеющую самый обширный API и самую популярную — Apache POI. Чтобы её использовать, вам нужно скачать jar файлы и добавить их через Eclipse вручную, или вы можете предоставить это Maven.
Во втором случае вам нужно просто добавить следующие две зависимости:
Самое удобное в Maven — что он загрузит не только указанные poi.jar и poi-ooxml.jar , но и все jar файлы, которые используются внутри, то есть xmlbeans-2.6.0.jar , stax-api-1.0.1.jar , poi-ooxml-schemas-3.12.jar и commons-codec-1.9.jar .
4–5 декабря, Онлайн, Беcплатно
Запись
В этом примере мы запишем в xls файл следующие данные: в первую ячейку — строку с именем, а во вторую — дату рождения. Вот пошаговая инструкция:
- Создаём объект HSSFWorkBook ;
- Создаём лист, используя на объекте, созданном в предыдущем шаге, createSheet() ;
- Создаём на листе строку, используя createRow() ;
- Создаём в строке ячейку — createCell() ;
- Задаём значение ячейки через setCellValue();
- Записываем workbook в File через FileOutputStream ;
- Закрываем workbook , вызывая close() .
Для записи строк или чисел этого вполне достаточно, но чтобы записать дату, нам понадобится сделать ещё кое-что:
- Создать DateFormat ;
- Создать CellStyle ;
- Записать DateFormat в CellStyle ;
- Записать CellStyle в ячейку;
- Теперь в эту ячейку можно записать объект Date через всё тот же setCellValue ;
- Чтобы дата поместилась в ячейку, нам нужно добавить столбцу свойство автоматически менять размер: sheet.autoSizeColumn(1) .
Всё вместе это будет выглядеть так:
Чтение
Теперь мы считаем из только что созданного файла то, что мы туда записали.
- Для начала создадим HSSFWorkBook , передав в конструктор FileInputStream ;
- Получаем лист, передавая в getSheet() его номер или название;
- Получаем строку, используя getRow() ;
- Получаем ячейку, используя getCell() ;
- Узнаём тип ячейки, используя на ней getCellType() ;
- В зависимости от типа ячейки, читаем её значения, используя getStringCellValue() , getNumericCellValue() или getDateCellValue() ;
- Закрываем workbook используя close() .
Напомню, что дату Excel хранит как числа, т.е. тип ячейки всё равно будет CELL_TYPE_NUMERIC .
Как прочитать файл на Java? Мы можем использовать классы ввода-вывода Java для чтения текстовых и двоичных файлов, таких как изображения, pdf и т.д., Используя BufferedReader, FileInputStream.
Существует множество различных способов чтения файла на Java. В этом уроке мы рассмотрим 5 различных способов чтения файла на Java.
Различные способы чтения файла на Java
5 классов из API ввода-вывода Java для чтения файлов:
- Буферизатор
- Поток ввода файлов
- Файлы
- Сканер
- Случайный файл
Чтение двоичных файлов и текстовых файлов
- Класс FileInputStream считывает данные файла в поток байтов. Поэтому его следует использовать для двоичных файлов, таких как изображения, pdf, мультимедиа, видео и т.д.
- Текстовые файлы основаны на символах. Мы можем использовать классы Reader , а также потоковые классы для их чтения.
- Файлы и классы сканера можно использовать для чтения текстовых файлов, а не двоичных файлов.
Давайте рассмотрим примеры программ для чтения файла на Java.
1. BufferedReader Читает файл
Мы можем использовать BufferedReader для считывания содержимого текстового файла в массив символов .
BufferedReader эффективен для чтения файла, поскольку он буферизует входные данные из указанного файла. Без буферизации каждый вызов методов read() или readLine() будет считывать байты из файла, затем преобразовываться в символы и возвращаться, что будет очень неэффективно.
В приведенной выше программе я печатаю данные файла на консоль. Давайте рассмотрим другой класс утилит для выполнения операций чтения файлов.
- Прочитайте полный файл в виде строки
- Считывайте файл строка за строкой и возвращайте список строк
- Подсчитайте вхождение строки в данный файл.
2. FileInputStream – Считывание двоичных файлов в байты
Мы всегда должны использовать поток для чтения файлов, не основанных на символах, таких как изображения, видео и т.д.
Операция чтения FileInputStream используется с массивом байтов, в то время как операция чтения BufferedReader использует массив символов.
3. Файлы – Чтение файла в список строк
4. Сканер – Считывает текстовый файл в качестве итератора
Мы можем использовать класс сканера для чтения текстового файла. Он работает как итератор
5. RandomAccessFile – Чтение файлов в режиме только для чтения
Класс RandomAccessFile позволяет нам читать файл в разных режимах. Это хороший вариант, если вы хотите убедиться, что в файле не выполняется случайная операция записи.
Это все для чтения файла на Java с использованием различных классов из Java IO API.
Я работаю стажером в Test Automation. Я работаю над созданием кода Junit с Eclipse и запускаю с помощью Eclipse. В этом я возвращаю данные из листа excel, используя функцию FileInputStream.
Необходимо ли закрыть функцию Inputstream? Если это так, пожалуйста, помогите мне с некоторыми кодировками.
Да, вам нужно close входной поток, если вы хотите, чтобы ваши системные ресурсы были отпущены.
Вам либо нужно закрыть(), либо завершить свою программу.
Однако вы можете столкнуться с запутанными проблемами, если вы не закрываете файл как
- Иногда тестирование выполняется отдельно или группа тестов выполняется в одном и том же процессе. (Таким образом, у вас может быть тест, который работает один, но не другой).
- вы не можете переименовать или удалить открытый файл.
Лучше всего всегда закрывать свои ресурсы, которые вы закончили с ними, однако я вижу модульные тесты как скрипты, которые не всегда должны следовать лучшей практике.
Всегда полезно закрыть ресурсы, которые вы используете, НО:
Если вы используете ресурс A в ресурсе B, разумно закрыть B вместо A, если он имеет для этого метод.
В вашем случае вы используете FileInputStream в Workbook , поэтому вам лучше закрыть Workbook и положиться на Workbok , чтобы он закрыл FileInputStream .
В этом конкретном случае на самом деле Workbook закрывается FileInputStream в конце метода getWorkbook() , но он все еще остается хорошая идея close Workbook , чтобы иметь возможность собирать мусор.
Да! вы должны всегда выпускать ресурсы один раз после того, как вы закончите с ними. Java имеет мощный механизм для Garbage Collection (обратите внимание, что это отличается от управления ресурсами/утечек). Итак, сборщик мусора не может определить, что, если вам нужен ресурс в будущем или нет? Невозможность выпуска ресурсов может вызвать такие проблемы, как отказ в обслуживании, низкая производительность.
Как уже было сказано, но еще одна попытка меньше попробовать с ресурсами
Теперь вам не нужно явно вызывать метод fi.close().
Недавно, когда я попытался реорганизовать свой код, мне пришлось переместить создание книги в другой метод, и FileInputStream создается в этом методе. Этот метод создает FileInputStream и возвращает рабочую книгу. Но FileInputStream не отображается из основного метода; так как я могу закрыть свой FileInputStream в конце основного метода? Ответ заключается в том, что вам не нужно закрывать FileInputStream, вместо этого вы просто закрываете книгу, которая внутренне закрывает FileInputStream. Короче говоря, неверно говорить, что вы должны закрыть FileInputStream независимо от того, что.
Basic CompSci 101 сообщит нам, чтобы мы закрывали ресурсы, которые мы открываем, на Java или на любом языке. Так что да, вам нужно закрыть их. Bad juju обязательно произойдет, когда вы этого не сделаете.
Кроме того, вы должны изучить (и иметь склонность) использовать Javadocs. Посмотрите на Javadoc для FileInputStream и Closeable. Ответы есть.
Посмотрите другие вопросы по меткам java inputstream file-io или Задайте вопрос
Класс FileOutputStream
Главное назначение класса FileOutputStream — запись байтов в файл. Ничего сложного :) FileOutputStream является одной из реализаций абстрактного класса OutputStream . В конструкторе объекты этого класса принимают либо путь к целевому файлу (в который и нужно записать байты), либо объект класса File . Рассмотрим оба примера: При создании объекта File мы указали в конструкторе путь, где он должен будет находиться. Создавать его заранее нет необходимости: если он не существует, программа создаст его сама. Можно обойтись и без создания лишнего объекта, и просто передать строку с адресом: Результат в обоих случаях будет одинаковым. Мы можем открыть наш файл и увидеть там: Однако есть здесь один нюанс. Попробуй запустить код из примера выше несколько раз подряд, а потом загляни в файл, и ответь на вопрос: сколько записанных в него строк ты видишь? Всего одну. Но ведь ты запускал код несколько раз. Однако при этом данные, оказывается, всякий раз перезаписывались, заменяя старые. Что делать, если нас это не устраивает, и требуется последовательная запись? Что если мы хотим записать наше приветствие в файл три раза подряд? Здесь все просто. Поскольку сам язык не может знать, какое именно поведение нам нужно в каждом случае, в конструктор FileOutputStream ты можешь передать дополнительный параметр — boolean append . Если его значение true, данные будут дозаписаны в конец файла. Если false (а по умолчанию это значение и есть false), старые данные будут стерты, а новые записаны. Давай проверим и запустим наш измененный код трижды: Результат в файле: Другое дело! Не забывай об этой особенности при использовании классов ввода-вывода. В свое время и мне приходилось часами сидеть над задачами, чтобы понять, куда деваются из файлов мои старые данные :) Ну и конечно, как и в случае с другими классами I/O, не забываем об освобождении ресурсов через метод close() .
Класс FileInputStream
Класс BufferedInputStream
Думаю, учитывая знания из прошлых лекций, ты легко сможешь сказать, зачем нужен класс BufferedInputStream и какие преимущества у него есть по сравнению с FileInputStream :) Мы уже встречались с буферизированными потоками, поэтому попробуй предположить (или вспомнить), прежде чем продолжить чтение :) Буферизированные потоки нужны прежде всего для оптимизации ввода-вывода. Обращение к источнику данных, например, чтение из файла, — дорогостоящая в плане производительности операция. И каждый раз обращаться к файлу для чтения по одному байту расточительно. Поэтому BufferedInputStream считывает данные не по одному байту, а блоками и временно хранит их в специальном буфере. Это позволяет нам оптимизировать работу программы за счет того, что мы уменьшаем количество обращений к файлу. Давай посмотрим, как это выглядит: Здесь мы создали объект BufferedInputStream . Он принимает на вход объект InputStream или любого его наследника, так что предыдущий FileInputStream подойдет. В качестве дополнительного параметра он принимает размер буфера в байтах. Теперь благодаря этому данные будут считываться из файла не по одному байту, а по 200! Представь, насколько мы сократили количество обращений к файлу. Для сравнения производительности ты можешь взять какой-нибудь большой текстовый файл размером несколько мегабайт и сравнить, сколько займет его чтение и вывод в консоль в миллисекундах с использованием FileInputStream и BufferedInputStream . Вот оба варианта кода для примера: При чтении файла размером 1,5 Мб на моем компьютере FileInputStream выполнил работу за
3500 миллисекунд, а вот BufferedInputStream — за
1700 миллисекунд. Как видишь, буферизированный поток оптимизировал работу программы в 2 раза! :) Мы еще продолжим изучать классы ввода-вывода — до встречи!
Я должен написать программу, которая читает файл записи ecg и записывает данные в переменные. Все, что я имею на данный момент является inputstream и bytebuffer . Я знаю из документации, что первые.
То, что я хочу сделать, - это когда я использовал инициализированный bufferedReader который я использовал для чтения строк из файла с помощью readLine() , когда я дошел до конца файла, я хочу испол.
поэтому у меня есть файл для C++, который я читаю. У него есть 3 ints 4 4 16 . Мне любопытно, как я собираюсь все это прочитать в 3 переменных, что у меня есть cars carCapacity people Я создал два .
Таким образом, я пытаюсь загрузить предварительно сохраненный XML файл из внутреннего частного хранилища android и проанализировать его на JDOM-документ. XML идентичен приведенному ниже; <?xml v.
try < System.out.println(f.getAbsoluteFile()); // FileInputStream input = new FileInputStream(f); FileInputStream inp = new FileInputStream("C:\\Users\\Jamal\\Desktop\\Japaneseword1.xls"); Workbook.
Поэтому я пытаюсь скопировать информацию из файла2 в начало файла1. Если кто-то может мне помочь, я бы очень признателен за ваше время, спасибо. BufferedReader reader = new BufferedReader(new Input.
Я понимаю, что мы можем сделать это с помощью ввода и вывода файлов, но зачем нам это делать?
Я пишу программу, которая копирует файлы с одного ПК на другой по сети. Пока эта копия файла продолжается, я показываю прогресс пользователю и сколько файлов было скопировано динамически (сделано в.
import java.net.*; import java.io.*; import javazoom.jl.player.Player; class MP3 < // the javazoom player static Player player; // this is where the audio file is saved static String filename tag-list"> fileoutputstream fileinputstream outputstream append java
Я новичок в C++. Я хочу создать базу данных, в настоящее время я работаю над одной из первых ее функций. Я хочу, чтобы база данных вводила пользователя и извлекала его в файл (который отлично работ.
Я столкнулся с проблемой загрузки HTML файла в панель редактора и его отображения. Код, который я использую: window_pane = new JEditorPane("file:///assets/www/index.html"); Но это только что дало н.
Я работаю на Java, а моя IDE - Intellij. У меня были проблемы с производством, поскольку я не смог удалить файлы, которые были прочитаны (открыты), но не закрыты должным образом, просто потому, что.
В проекте используется maven для построения и его файловая структура следующим образом. fnlp ├── fnlp-app ├── fnlp-core ├── models │ └── seg.m └── tmp └── lucene Теперь я переключил рабочий каталог.
Я немного смущен. Я получил этот блок кода: public void serializeStock()< FTPClient client = new FTPClient(); try< client.connect("ftp.**.***"); client.login("***", "*****"); FileInputStream fin = .
Я создал простую программу Java для чтения данных из файлов свойств FRX. Однако проблема, с которой я столкнулась, заключается в том, что мне нужно только прочитать определенную часть двоичного фай.
У меня проблема со следующим кодом в Android Studio: try < FileInputStream fileInputStream = new FileInputStream(dirPhoto); bitmap = BitmapFactory.decodeStream(fileInputStream); vwImagen.setImageBi.
Моя проблема немного отличается от тех, которые существуют в SO. Я попытаюсь объяснить.. Мой код забирает файл .xls из местоположения ( c:\codereview\ ) и вставляет данные в этот файл. Я использо.
Я только что выпустил приложение для Android, которое анализирует локальный файл и обрабатывает некоторые данные. Несколько дней назад один из моих клиентов сообщил мне об ошибке, каждый раз, когда.
Итак, я делаю игру, и музыка меняется, когда вы находитесь в разных регионах, или если есть перерыв, например, с AI. Поэтому я просто научился делать музыку в моей программе, и теперь я пытаюсь ост.
Я пытаюсь загрузить файл на FTP, но у меня проблема с inputStream. Он возвращает java.lang.NullPointerException. Как загрузить мой файл в inputSteam? Также я не получаю отчетов о проделанной работе.
** Отредактируйте после рассмотрения ответа Tormod и осуществления его рекомендаций. Как указано в заголовке, я пытаюсь напечатать общее количество разных слов после получения имени файла из ввода .
Я хочу получить абсолютный путь к файлу из объекта InputStream. Я приложил одно изображение, где вы можете увидеть InputStrean содержит один путь, который содержит абсолютный путь к файлу.
Я пишу код Java, чтобы помочь мне прочитать и распечатать весь байт-код в файле .class . Я пробовал заниматься серфингом в интернете, но ответы на них не отвечают на мой вопрос. ниже приведен код, .
Я пытаюсь прочитать содержимое файла на французском языке (символ по символу) и проверять значение ascii для выполнения некоторой операции. Все работает отлично, с английским алфавитом, но для симв.
Я пытаюсь практиковать чтение текста из файла в java. Я немного зациклился на том, как я могу прочитать N количество строк, скажем, первые 10 строк в файле, а затем добавить строки в ArrayList . Ск.
Пожалуйста, поймите меня, это мой первый пост. Поэтому я пытаюсь читать данные с листа excel и хранить его в двух string массивах, но массивы остаются пустыми, и я не могу понять, почему. После тог.
Хорошо, поэтому я пишу приложение Java для импорта файла csv, а затем просматриваю результаты и загружаю их в массив. Я импортирую файл правильно, потому что он не через исключение. Мои проблемы в .
В моем приложении Java есть локальный файл под названием "classes" (простой List<String> ) в папке верхнего уровня, называемой "активы". Когда я запускаю код из Eclipse, файл не читается без .
У меня есть флажок, который при проверке сохраняет созданное растровое изображение на внутреннем хранилище, делая это: public void SaveImage(Bitmap default_b) < String root = Environment.getExterna.
Я хотел бы создать глобальный объект FileInputStream и использовать его в течение длительного времени для моего приложения. У меня есть следующий класс, который создает объект FileInputStream objec.
У меня есть файл размером 54 120 байт JSON, который находится на одной линии Я пытаюсь прочитать это в String в приложении для Android, используя: //Method from class FileManager public String read.
У меня есть изображение, закодированное как base64 String, и я хочу передать его в другое действие. Из-за ограничения размера дополнительного в Intent я использовал этот код для его хранения во вре.
Я работаю над домашним заданием для своего класса Java java, и я получаю ошибки, перечисленные ниже. Ниже второй горизонтальной линии находится исходный код. Существует еще один программный файл ja.
В первом методе я создал файл в каталоге Applicatin, и я пытаюсь прочитать его с помощью BufferedReader, но по какой-то причине приложение продолжает генерировать исключение FileNotFound, и я понят.
Я пытаюсь написать побитовый файл в java, но я не знаю, как это сделать, я пытался с FileOutputStream, но проблема в том, что мне нужно указать, какой бит написан в файле в каждый случай (0 или 1).
Я пытался создавать файлы внутри некоторых каталогов, но не смог понять это. Дело в том, чтобы создавать текстовые файлы внутри пакета dir : com.resources.files но моя идея не работает. public bool.
Я пытаюсь создать файл и сохранить данные на нем, а затем я хочу, чтобы иметь возможность читать его, и если его можно извлечь конкретные данные. Итак, вот мой код для создания и открытия файла. pu.
Когда я пытаюсь прочитать криптоватый объект, хранящийся в файле, кажется, кажется, что все работает, и я могу получить сохраненное значение , но в журнале всегда появляется эта ошибка java.io.Stre.
Рубрики
А так же делитесь знаниями, знакомьтесь с новыми утилитами и приложениями, учитесь у всегда готовых помочь ответить на самые сложные вопросы во всех сферах IT и программирования. Станьте гуру и экспертом разработки ПО, получите признание коллег, заработайте репутацию, создайте стартап или приложение которое будет работать на вас!
Читайте также: