Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RSS клиент 
V
    Опции темы
Shklyar
Дата 30.8.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Вроде видал в документации даже метод с такой сигнатурой:
SAXParser.parse(String url, SAXHandler handler);


А InputStream может быть прочитан только один раз?
Парсеру пробовал дать InputStream, принимает, но InputStream оказывается пустым (выше есть код этого).
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 30.8.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Гы, действительно, InputStream можно прочесть один раз. Подскажите по теории, почему так?

С последнего поста, с кодом, поменял только HTTPClient class, так:
Код
package rssclient;

import java.net.*;
import java.io.*;

/**
 *
 * @author Oleg
 */
public class HTTPClient {
    private String answer = "";
    private InputStream isAnswer;
    
    public HTTPClient(String url) {
        try {
            URL s = new URL(url);
            URLConnection sc = s.openConnection();
            
            isAnswer = sc.getInputStream();
            
            /*BufferedReader in = new BufferedReader(
                    new InputStreamReader(isAnswer));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                answer += inputLine + "\n";
            in.close();*/
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public String getAnswer() {
        return answer;
    }
    
    public InputStream getISAnswer() {
        return isAnswer;
    }
}


HTTPClient решил оставить в отдельном классе, т.к. это учебная программа и в ней появился новый рассмотренный вопрос. В перспективе, если из этого получиться что-то приличное - оформлю и выложу все в интернете и дам ссылку со своего резюме. Думаю это будет мне плюсом.

Что дальше? БД?
А вообще, то у меня душа лежит реализовать uml диаграмму классов приложения целиком. Вот только я его (приложение), пока, целиком смутно представляю. :(
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 30.8.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



После использования URL.openConnection() его нужно закрывать?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
ivg
Дата 1.9.2008, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Shklyar @  30.8.2008,  17:37 Найти цитируемый пост)
Гы, действительно, InputStream можно прочесть один раз. Подскажите по теории, почему так?

Это довольно таки широко распостранённая абстракция в Java (и не только), представляющая собой доступ к устройствам последовательного ввода данных (сеть, последовательный доступ к файлу, куча различных переферийных последовательных интерфейсов и т. п.)
PM MAIL   Вверх
LSD
Дата 1.9.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Shklyar @  30.8.2008,  17:11 Найти цитируемый пост)
После использования URL.openConnection() его нужно закрывать?

Желательно. 

Но сам URLConnection закрыть нельзя. Надо или приводить к HttpURLConnection или закрыть полученный InputStream.


Цитата(Shklyar @  30.8.2008,  15:37 Найти цитируемый пост)
Что дальше? БД?

БД, GUI как хочешь.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 1.9.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Думал заняться БД, но начал с того, что снова посмотрел форматы RSS (на перспективу хочу RSS 1.0, RSS 2.0, Atom) на предмет того, какие поля будут присутствовать в моем RSSClient-е, а соответственно как будет выглядеть БД. Результат - нужно еще посмотреть. Трудность у меня в том, что мне, как я понимаю необходимо придумать какой-то свой формат, который будет содержать главные (необходимые) и пересекающиеся поля из указанный форматов.
Одновременно наткнулся в интернете на тему проверки файла на обновление перед тем, как качать. Тож нужно посмотреть. Глупо качать то, что уже есть.. Или это делать после того, как будет получена первая программа, которая что-то делает?
И снова мысли о том, как будет выглядеть приложение целиком. Вот появился вопрос: нормально-ли когда основа приложения GUI? Т.е. алгоритм такой: получение итемов новостей с RSS канала -> запись их в БД -> чтение БД -> отображение новостей. Ох эта диаграмма классов. Она сильно отбирает у меня покой.
GUI, наверное, логично делать после БД.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 2.9.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Решил делать БД (в MySQL). Выглядеть она будет так (прочитал недавно статью IBM Ajax RSS-reader. Себя чувствую нормально с БД, но код взял из статьи. Онная, просто, придала уверенности в том, какие поля будут присутствовать):
Код
CREATE TABLE rss_feeds (
        rss_feed_id MEDIUMINT NOT NULL AUTO_INCREMENT,
        url TEXT NOT NULL,
        name TEXT NOT NULL,
        last_update TIMESTAMP,
        PRIMARY KEY ( rss_feed_id )
);

CREATE TABLE rss_articles (
        rss_feed_id MEDIUMINT NOT NULL,
        link TEXT NOT NULL,
        title TEXT NOT NULL,
        description TEXT NOT NULL
);

Интерестно видеть PRIMARY KEY ( rss_feed_id ) в MySQL.
Приведенный код будет чуть изменен, а именно, будет добавлено поле date в rss_articles и поле last_file_size в rss_feeds (для проверки обновлен ли rss).

Еще. Тут появился человек, который будет участвовать в разработке программы. Принимайте.

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 2.9.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Сделал первые наброски работы с БД (по мотивам Студенческого отдела кадров, было дело, когда изучал его  smile ). Смотрим:
Код
-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
-- 
-- Хост: localhost
-- Время создания: Сен 02 2008 г., 19:22
-- Версия сервера: 4.1.16
-- Версия PHP: 5.1.6
-- 
-- БД: `rssclient`
-- 

-- --------------------------------------------------------

-- 
-- Структура таблицы `articles`
-- 

CREATE TABLE `articles` (
  `article_id` mediumint(9) NOT NULL auto_increment,
  `title` text NOT NULL,
  `link` text NOT NULL,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `description` text NOT NULL,
  `is_readed` char(1) NOT NULL default 'F',
  `feed_id` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

-- 
-- Дамп данных таблицы `articles`
-- 

INSERT INTO `articles` VALUES (1, 'Title 1', 'Link 1', '2008-09-02 19:12:52', 'Summary 1', 'F', 0);
INSERT INTO `articles` VALUES (2, 'Title 2', 'Link 2', '2008-09-02 19:12:52', 'Summary 2', 'F', 0);
INSERT INTO `articles` VALUES (3, 'Title 3', 'Link 3', '2008-09-02 19:12:52', 'Summary 3', 'F', 0);
INSERT INTO `articles` VALUES (4, 'Title 4', 'Link 4', '2008-09-02 19:12:52', 'Summary 4', 'F', 0);

-- --------------------------------------------------------

-- 
-- Структура таблицы `feeds`
-- 

CREATE TABLE `feeds` (
  `feed_id` mediumint(9) NOT NULL auto_increment,
  `name` text NOT NULL,
  `url` text NOT NULL,
  `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `last_size` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`feed_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

-- 
-- Дамп данных таблицы `feeds`
-- 

Код
package rssclient;

import java.sql.Connection;
//import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author Oleg
 */
public class JDBC {
    private static Connection con;
    private static JDBC instance;
    
    private JDBC() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost/rssclient";
            con = DriverManager.getConnection(url,"root", "");
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static synchronized JDBC getInstance() {
        if (instance == null) instance = new JDBC();
        return instance;
    }
    
    public void insertNewArticles(InputStream ISAnswer) throws Exception {
        for (Article article : SAXHandler.parse(ISAnswer)) {
            PreparedStatement stmt = con.prepareStatement(
                    "INSERT INTO articles " +
                    //"(title, link, date, description) " +
                    "(title, link, description) " +
                    "VALUES (?, ?, ?)");
            stmt.setString(1, article.getTitle());
            stmt.setString(2, article.getLink());
            //stmt.setString(3, article.getDate());
            stmt.setString(3, article.getSummary());
            
            stmt.execute();
        }
    }
    
    public Collection getAllArticles() throws SQLException {
        Collection articles = new ArrayList();
        
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(
                "SELECT title, link, description FROM articles");
        
        while(rs.next()) {
            Article article = new Article();
            article.setTitle(rs.getString(1));
            article.setLink(rs.getString(2));
            article.setSummary(rs.getString(3));
            articles.add(article);
        }
        rs.close();
        stmt.close();
        
        return articles;
    }
}

В классе Article добавил:
Код
@Override
    public String toString() {
        return title + "\n" + link + "\n" + date + "\n" + summary + "\n";
    }

Ну и Main.java стал таким:
Код
package rssclient;

import java.util.Iterator;

/**
 *
 * @author Oleg
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            HTTPClient httpClient = new HTTPClient("http://rss.net/rss.xml");

            JDBC db = JDBC.getInstance();
            db.insertNewArticles(httpClient.getISAnswer());
            
            httpClient.closeISAnswer();
            
            for(Iterator i = db.getAllArticles().iterator(); i.hasNext();)
                System.out.println(i.next().toString());
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

}

Только возникли проблемы с полем даты. Как я понимаю в RSS стандартного формата нет и это просто String. Как мне его превращать в Date date?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
duk
Дата 2.9.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Посмотри: DateFormat.parse(String s).



Это сообщение отредактировал(а) duk - 2.9.2008, 20:21
PM MAIL   Вверх
Shklyar
Дата 2.9.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(duk @ 2.9.2008,  20:07)
Посмотри: DateFormat.parse(String s).

Сенкс, но:
date = DateFormat.getDateInstance().parse("Tue, 26 Aug 2008 11:24:48 +0000");
дает
java.text.ParseException: Unparseable date: "Tue, 26 Aug 2008 11:24:48 +0000"

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
duk
Дата 2.9.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



static DateFormat    getDateInstance(int style)
          Gets the date formatter with the given formatting style for the default locale.
static DateFormat    getDateInstance(int style, Locale aLocale)
          Gets the date formatter with the given formatting style for the given locale. глянь вот это. 
PM MAIL   Вверх
garbuz
Дата 2.9.2008, 22:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Shklyar, молодец! Слежу за темой с самого ее начала! Давай не останавливайся! smile Если что - спрашивай!
PM MAIL   Вверх
Shklyar
Дата 3.9.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Нашел решение вопроса прасинга даты у родственника DateFormat - SimpleDateFormat

java.lang.Object
  extended by java.text.Format
      extended by java.text.DateFormat
          extended by java.text.SimpleDateFormat

Код
package testdateformatparsestring;

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Locale;
import java.util.Date;

/**
 *
 * @author Oleg
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            Date date = new SimpleDateFormat(
                    "EEE, dd MMM yyyy HH:mm:ss Z", Locale.US).
                    parse("Tue, 26 Aug 2008 12:24:48 +0000");
            System.out.println(date);
        }
        catch(ParseException e) {
            e.printStackTrace();
        }
    }

}

Подскажите: правильно-ли написан паттерн даты и выбрана Locale?
Результат работы - Tue Aug 26 15:24:48 EEST 2008
Что такое EEST, почему происходит сдвиг на 3 часа?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 3.9.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Теперь GUI (дорабатывать нужно все, но это на последующих итерациях, логично?).
И вопрос: в визуальном редакторе (с последующей доработкой, при надобности) или полностью руками?
Мысли такие: в визуальном редакторе быстрее.
А как работают в реальных и больших проектах?
Сам, уже пробовал и так и так (руками - в Eclipse, с визуальным редактором - в NetBeans, счас работаю с NetBeans). Т.е. вариант руками из за того, что это обучение - отбросил.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 3.9.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(Shklyar @  3.9.2008,  18:36 Найти цитируемый пост)
Т.е. вариант руками из за того, что это обучение - отбросил. 

Написание GUI рукми - это не обучение smile Я все же посоветовал бы именно руками. На мой взгляд ГУЙ у RSS ридера не должен быть сложным. Посмотрите в этой ветке прикрепленную тему "Маленькие классы", кто-то выкладывал класс, для работы с GridBaglayout, возможго поможет.

PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.