Почему в Codename One я не могу заставить FileInputStream импортировать или компилировать?

Вот мой импорт:

import com.codename1.ui.*;
import com.codename1.ui.util.*;
import com.codename1.ui.plaf.*;
import com.codename1.ui.events.*;
import com.codename1.io.*;
import com.codename1.ui.layouts.*;
import java.io.*;

Я не могу заставить этот код скомпилировать:

InputStream in = new FileInputStream("users.csv");

Вот ошибка:

C:\Users\Isaac\Documents\NetBeansProjects\CodenameOne_TESTING\src\com\fakecompany\testapp\MyApplication.java:119: error: cannot find symbol
    InputStream in = new FileInputStream("users.csv");
  symbol:   class FileInputStream
  location: class MyApplication

Я подумал, что это может быть проблема с импортом, и, конечно же, когда я специально импортировал java.io.FileImputStream, это дало мне дополнительную ошибку:

C:\Users\Isaac\Documents\NetBeansProjects\CodenameOne_TESTING\src\com\fakecompany\testapp\MyApplication.java:13: error: cannot find symbol
import java.io.FileInputStream;
  symbol:   class FileInputStream
  location: package java.io

Что происходит? Есть ли другой способ импорта файлов в Codename One? Дайте мне знать, если этого кода недостаточно, чтобы найти ошибку.

PS: мне нужно реализовать входной поток, чтобы я мог проанализировать файл csv:

    CSVParser parser = new CSVParser();
    String[][] data = parser.parse(in);

person Isaac Beeman    schedule 02.03.2015    source источник


Ответы (2)


Похоже, что Codename One пропустил этот класс — и другие, как я подозреваю.

Судя по документации, я подозреваю, что вы хотите использовать com.codename1.io.FileSystemStorage и его openInputStream метод.

Вы можете посмотреть видео о хранении данных в постоянном хранилище.

person Jon Skeet    schedule 02.03.2015
comment
Как вызвать метод openInputStream? (Я новичок в java и не особо разбираюсь в File IO) - person Isaac Beeman; 02.03.2015
comment
@IsaacBeeman: Если вы начинаете с Java, я бы начал с vanilla Java, а не с чего-то вроде Java, но немного другого. Освойте основы, написав консольные приложения, и тогда вы будете в гораздо лучшем положении, чтобы справляться с более необычными средами. - person Jon Skeet; 02.03.2015
comment
Спасибо за совет, но я делаю это для внутренней оценки компьютерных наук, и мне уже слишком поздно переключать свою программу на JavaFX (или что-то еще). Я полагал, что это будет проблемой, и я был готов бороться, чтобы сделать свое приложение. Все шло хорошо, за исключением тех случаев, когда мне нужно было выяснить, что делает CN1 иначе, чем обычный Java API. Кроме того, спасибо за помощь, я получил свое приложение для чтения и записи в файл. - person Isaac Beeman; 02.03.2015
comment
Джон, я бы сказал, что Codename One в некоторых отношениях проще, чем обычная Java, поскольку API меньше и встроено много API здравого смысла (например, CSVParsing). Текущие API Java, как правило, настолько абстрактны, что новичку они могут показаться пугающими. Я проголосовал за, так как ваш ответ действительно правильный. - person Shai Almog; 02.03.2015
comment
@ShaiAlmog: Хотя в некотором смысле это может быть проще, для ванильной Java доступно на несколько порядков больше примеров, руководств, книг и т. д., чем для Codename One. Любой, кто выполняет поиск в Интернете, чтобы узнать, как выполнить конкретную задачу на Java, подавляюще с большей вероятностью найдет ответ, который работает на ванильной Java, чем на Codename One. Для нового разработчика это довольно недружественный опыт, тогда как у того, кто уже имеет опыт работы с Java, гораздо больше шансов адаптироваться к изменениям, необходимым для Codename One. - person Jon Skeet; 02.03.2015
comment
Ванильная Java, конечно, но большинство образцов ванильной Java будут применяться к Codename One, включая большинство API-интерфейсов ввода-вывода, коллекций и т. д. Не говоря уже о том, что вы можете искать Codename One и вопрос в Google, чтобы найти похожие ответы. Если вы ориентируетесь на мобильные устройства и хотите сделать это на Java, Codename One документирован на порядок лучше, чем что-либо еще, за исключением самого Android SDK. - person Shai Almog; 02.03.2015
comment
@ShaiAlmog: я не предполагал, что OP отошел от Codename One - просто они сначала изучили ванильную Java, прежде чем использовать ее. По моему опыту, разработчики, которые начинают на относительно необычной платформе (по сравнению с ванильной), часто путаются, когда у них возникает ошибка — они не будут знать, связано ли это с их неопытностью в целом, или особенность платформы. Это относится не только к необычным платформам — я бы посоветовал научиться писать простые консольные приложения, прежде чем писать графический интерфейс на любой платформе, просто потому, что гораздо меньше того, что может пойти не так. - person Jon Skeet; 02.03.2015
comment
Нет проблем, просто философский спор ;-) Мне вообще очень нравится обучать новичков практическому подходу. Я думаю, что как только вы запускаете что-то на устройстве, это настолько круто, что заряжает энергией весь процесс обучения. Вот почему мне всегда было трудно обучать старым спецификациям J2EE (1,1 дня), вам приходилось преодолевать так много обручей, чтобы достичь чего-то привлекательного/полезного. Я думаю, что простая старая Java проблематична в этом смысле, лучшее, что вы можете сделать, это Swing/JavaFX, которые фактически мертвы и устарели. - person Shai Almog; 02.03.2015
comment
@ShaiAlmog: По моему опыту, в результате кто-то может очень быстро столкнуться с проблемами, а затем у них возникают проблемы с диагностикой проблем, потому что у них нет прочного заземления. Я видел это сотни раз за эти годы. Хотя может быть более захватывающим делать что-то с причудливой графикой и т. д. с самого начала, это гораздо больше, чем обычное консольное приложение, где вы можете видеть все код в маленьком пространстве и попытайтесь понять его целиком. Никаких тем для беспокойства и т. д. - person Jon Skeet; 02.03.2015
comment
В целом согласен, но предпочитаю немного азарта, риска ;-) - person Shai Almog; 03.03.2015

Ответ Джона правильный, но частичный. Вопрос в том, где на самом деле хранится файл CSV...

Если файл находится в папке src (часть вашей банки), используйте Display.getInstance().getResourceAsStream(getClass(), "/filename");.

Если вы загрузили его, то, скорее всего, вы загрузили его в хранилище, а не обязательно в файловую систему (немного разные вещи в мобильных устройствах). Оба имеют довольно подробные API для открытия/записи, а класс Util имеет хороший API для загрузки. Имейте в виду, что вы не можете просто «поместить» файл на устройство, как на компьютер, файловая система совершенно другая.

Кстати, в Codename One есть встроенный класс CSVParser, который может вам пригодиться.

person Shai Almog    schedule 02.03.2015