Почему fileinputstream не читает excel
I am trying to read data from an excel file, i am using the following code :
but i am getting the compilation error as The constructor XSSFWorkbook(FileInputStream) is undefined.
Your help would be highly appreciated.
File src = new File("T:\\SeleniuminputFiles\\input.xlsx"); InputStream fis = new FileInputStream(src); works perfectly fine
Hi the issue is with line 14 as per screenshot.. The problem is with XSSFWorkbook wb = new XSSFWorkbook(fis);
4 Answers 4
Try using FileInputStream :
Hi Rahul, I tried your code but getting the same issue. It is not allowing any argument to pass (Check attached screenshot) Workbook workbook = new XSSFWorkbook(inputStream); Sheet firstSheet = workbook.getSheetAt(0);
hi rahul, refering to the screenshot whereas Eclipse give me the only solution remove argument to match XSSFWorkbook. when i try it XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet1 = wb.getSheetAt(0); this does not resolve the issue.
Try with poi-3.14-beta1 the same code is working properly on machine only version of poi jars is different.
Maybe you are not using the current version. I had the same issue.
Try installing this versions or latest versions.
I faced the same issue. I added the latest poi jar in the build path. The issue is resolved. It has multiple jar files. Add all the jar files in the project. File name: poi-bin-4.0.0-20180907
First of all , If you are having File object then why you need FileInputStream to be passed
Second you cannot pass FileInputStream to XSSFWorkbook, as the constructor can accept the File , String , InputStream , OPCPackage and a blank contructor see this.
Я пытаюсь прочитать данные из файла Excel, я использую следующий код:
но я получаю ошибку компиляции, поскольку конструктор XSSFWorkbook (FileInputStream) не определен.
Ваша помощь будет очень признательна.
File src = new File("T:\\SeleniuminputFiles\\input.xlsx"); InputStream fis = new FileInputStream(src); отлично работает
Привет, проблема связана со строкой 14 согласно снимку экрана .. Проблема связана с XSSFWorkbook wb = new XSSFWorkbook (fis);
@XtremeBaumer FileInputStream - это InputStream, поэтому вы должны иметь возможность передавать его как InputStream.
Попробуйте использовать FileInputStream:
Привет, Рахул, я пробовал ваш код, но возникла та же проблема. Он не позволяет передавать аргументы (см. Прикрепленный снимок экрана) Workbook workbook = new XSSFWorkbook (inputStream); Лист firstSheet = workbook.getSheetAt (0);
привет, рахул, ссылаясь на снимок экрана, тогда как Eclipse предоставил мне единственный аргумент удаления решения, соответствующий XSSFWorkbook. когда я пробую это XSSFWorkbook wb = new XSSFWorkbook (); XSSFSheet sheet1 = wb.getSheetAt (0); это не решает проблему .
Попробуйте с poi-3.14-beta1, тот же код работает правильно на машине, только версия poi jar отличается.
Возможно, вы не используете текущую версию. Я была такая же проблема.
Попробуйте установить эту версию или последние версии.
Я столкнулся с той же проблемой. Я добавил последнюю версию poi jar в путь сборки. Проблема решена. Он имеет несколько файлов jar. Добавьте все файлы jar в проект. Имя файла: poi-bin-4.0.0-20180907
Прежде всего, если вы имеете файл объект , то почему вы должны FileInputStream быть переданы
Во- вторых, вы не можете передать FileInputStream в XSSFWorkbook , так как конструктор может принимать File , String , InputStream , OPCPackage и пустой конструктор .
Поскольку у вас уже есть файловый объект, вы можете попробовать следующий код:
Запись файлов и класс FileOutputStream
Класс FileOutputStream предназначен для записи байтов в файл. Он является производным от класса OutputStream, поэтому наследует всю его функциональность.
Через конструктор класса FileOutputStream задается файл, в который производится запись. Класс поддерживает несколько конструкторов:
Файл задается либо через строковый путь, либо через объект File. Второй параметр - append задает способ записи: eсли он равен true, то данные дозаписываются в конец файла, а при false - файл полностью перезаписывается
Например, запишем в файл строку:
Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Если такого файла нет, то он автоматически создается при записи. Так как здесь записываем строку, то ее надо сначала перевести в массив байтов. И с помощью метода write строка записывается в файл.
Для автоматического закрытия файла и освобождения ресурса объект FileOutputStream создается с помощью конструктции try. catch.
При этом необязательно записывать весь массив байтов. Используя перегрузку метода write() , можно записать и одиночный байт:
Чтение файлов и класс FileInputStream
Для считывания данных из файла предназначен класс FileInputStream , который является наследником класса InputStream и поэтому реализует все его методы.
Для создания объекта FileInputStream мы можем использовать ряд конструкторов. Наиболее используемая версия конструктора в качестве параметра принимает путь к считываемому файлу:
Если файл не может быть открыт, например, по указанному пути такого файла не существует, то генерируется исключение FileNotFoundException .
Считаем данные из ранее записанного файла и выведем на консоль:
В данном случае мы считываем каждый отдельный байт в переменную i:
Когда в потоке больше нет данных для чтения, метод возвращает число -1.
Затем каждый считанный байт конвертируется в объект типа char и выводится на консоль.
Подобным образом можно считать данные в массив байтов и затем производить с ним манипуляции:
Совместим оба класса и выполним чтение из одного и запись в другой файл:
Классы FileInputStream и FileOutputStream предназначены прежде всего для записи двоичных файлов, то есть для записи и чтения байтов. И хотя они также могут использоваться для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
Классы DataOutputStream и DataInputStream позволяют записывать и считывать данные примитивных типов.
Запись данных и DataOutputStream
Класс DataOutputStream представляет поток вывода и предназначен для записи данных примитивных типов, таких, как int, double и т.д. Для записи каждого из примитивных типов предназначен свой метод:
writeBoolean(boolean v) : записывает в поток булевое однобайтовое значение
writeByte(int v) : записывает в поток 1 байт, которые представлен в виде целочисленного значения
writeChar(int v) : записывает 2-байтовое значение char
writeFloat(float v) : записывает в поток 4-байтовое значение float
writeInt(int v) : записывает в поток целочисленное значение int
writeLong(long v) : записывает в поток значение long
writeShort(int v) : записывает в поток значение short
writeUTF(String str) : записывает в поток строку в кодировке UTF-8
Считывание данных и DataInputStream
Класс DataInputStream действует противоположным образом - он считывает из потока данные примитивных типов. Соответственно для каждого примитивного типа определен свой метод для считывания:
boolean readBoolean() : считывает из потока булевое однобайтовое значение
byte readByte() : считывает из потока 1 байт
char readChar() : считывает из потока значение char
float readFloat() : считывает из потока 4-байтовое значение float
int readInt() : считывает из потока целочисленное значение int
long readLong() : считывает из потока значение long
short readShort() : считывает значение short
String readUTF() : считывает из потока строку в кодировке UTF-8
int skipBytes(int n) : пропускает при чтении из потока n байтов
Рассмотрим применение классов на примере:
Здесь мы последовательно записываем в файл данные объекта Person.
Объект DataOutputStream в конструкторе принимает поток вывода: DataOutputStream (OutputStream out) . В данном случае в качестве потока вывода используется объект FileOutputStream , поэтому вывод будет происходить в файл. И с помощью выше рассмотренных методов типа writeUTF() производится запись значений в бинарный файл.
Затем происходит чтение ранее записанных данных. Объект DataInputStream в конструкторе принимает поток для чтения: DataInputStream(InputStream in) . Здесь таким потоком выступает объект FileInputStream
Привет! В сегодняшней лекции продолжим разговор о потоках ввода и вывода в Java, или сокращенно — Java I/O («input-output»). Это не первая лекция на данную тему, и далеко не последняя :) Так уж получилось, что Java как язык предоставляет много возможностей по работе с вводом-выводом. Классов, которые реализуют эту функциональность довольно много, поэтому мы разделили их на несколько лекций, чтобы ты поначалу не запутался :) В прошлых лекциях мы коснулись BufferedReader ’a, а также абстрактных классов InputStream & OutputStream и нескольких наследников. Сегодня рассмотрим 3 новых класса: FileInputStream , FileOutputStream и BufferedInputStream .
Класс FileOutputStream
Главное назначение класса FileOutputStream — запись байтов в файл. Ничего сложного :) FileOutputStream является одной из реализаций абстрактного класса OutputStream . В конструкторе объекты этого класса принимают либо путь к целевому файлу (в который и нужно записать байты), либо объект класса File . Рассмотрим оба примера: При создании объекта File мы указали в конструкторе путь, где он должен будет находиться. Создавать его заранее нет необходимости: если он не существует, программа создаст его сама. Можно обойтись и без создания лишнего объекта, и просто передать строку с адресом: Результат в обоих случаях будет одинаковым. Мы можем открыть наш файл и увидеть там: Однако есть здесь один нюанс. Попробуй запустить код из примера выше несколько раз подряд, а потом загляни в файл, и ответь на вопрос: сколько записанных в него строк ты видишь? Всего одну. Но ведь ты запускал код несколько раз. Однако при этом данные, оказывается, всякий раз перезаписывались, заменяя старые. Что делать, если нас это не устраивает, и требуется последовательная запись? Что если мы хотим записать наше приветствие в файл три раза подряд? Здесь все просто. Поскольку сам язык не может знать, какое именно поведение нам нужно в каждом случае, в конструктор FileOutputStream ты можешь передать дополнительный параметр — boolean append . Если его значение true, данные будут дозаписаны в конец файла. Если false (а по умолчанию это значение и есть false), старые данные будут стерты, а новые записаны. Давай проверим и запустим наш измененный код трижды: Результат в файле: Другое дело! Не забывай об этой особенности при использовании классов ввода-вывода. В свое время и мне приходилось часами сидеть над задачами, чтобы понять, куда деваются из файлов мои старые данные :) Ну и конечно, как и в случае с другими классами I/O, не забываем об освобождении ресурсов через метод close() .
Класс FileInputStream
У класса FileInputStream назначение противоположное — чтение байтов из файла. Так же как FileOutputStream наследует OutputStream , этот класс происходит от абстрактного класса InputStream . Запишем в наш текстовый « test.txt » несколько строк текста: Вот как будет выглядеть реализация чтения данных из файла при помощи FileInputStream : Мы считываем из файла по одному байту, преобразуем считанные байты в символы и выводим их в консоль. А вот и результат в консоли:
Класс BufferedInputStream
Думаю, учитывая знания из прошлых лекций, ты легко сможешь сказать, зачем нужен класс BufferedInputStream и какие преимущества у него есть по сравнению с FileInputStream :) Мы уже встречались с буферизированными потоками, поэтому попробуй предположить (или вспомнить), прежде чем продолжить чтение :) Буферизированные потоки нужны прежде всего для оптимизации ввода-вывода. Обращение к источнику данных, например, чтение из файла, — дорогостоящая в плане производительности операция. И каждый раз обращаться к файлу для чтения по одному байту расточительно. Поэтому BufferedInputStream считывает данные не по одному байту, а блоками и временно хранит их в специальном буфере. Это позволяет нам оптимизировать работу программы за счет того, что мы уменьшаем количество обращений к файлу. Давай посмотрим, как это выглядит: Здесь мы создали объект BufferedInputStream . Он принимает на вход объект InputStream или любого его наследника, так что предыдущий FileInputStream подойдет. В качестве дополнительного параметра он принимает размер буфера в байтах. Теперь благодаря этому данные будут считываться из файла не по одному байту, а по 200! Представь, насколько мы сократили количество обращений к файлу. Для сравнения производительности ты можешь взять какой-нибудь большой текстовый файл размером несколько мегабайт и сравнить, сколько займет его чтение и вывод в консоль в миллисекундах с использованием FileInputStream и BufferedInputStream . Вот оба варианта кода для примера: При чтении файла размером 1,5 Мб на моем компьютере FileInputStream выполнил работу за ~3500 миллисекунд, а вот BufferedInputStream — за ~1700 миллисекунд. Как видишь, буферизированный поток оптимизировал работу программы в 2 раза! :) Мы еще продолжим изучать классы ввода-вывода — до встречи!
Читайте также: