Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как скачать из сети текстовый файл и сохранить его с правильной кодировкой / 10 сообщений из 10, страница 1 из 1
10.08.2007, 02:01:59
    #34718653
Krundetz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Собственно есть такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
 package  x.URL_Content_Demo;

 import  java.net.*;
 import  java.util.Date;
 import  java.io.*;

 public   class  URL_Content_Demo
{
	 public   static   void  main(String[] args)   throws  Exception
	{
		 int  c;
		String str = "";
		URL hp =  new  URL("http://yandex.ru");
		URLConnection hpCon = hp.openConnection();
		System.out.println("Дата: " +  new  Date(hpCon.getDate()));
		System.out.println("Тип содержимого: " + hpCon.getContentType());
		System.out.println("Срок хранения: " + hpCon.getExpiration());
		System.out.println("Последние изменение: " +  new  Date(hpCon.getLastModified()));
		 int  len = hpCon.getContentLength();
		System.out.println("Content-Length " + len);
		/*if(len > 0)
		{*/
			System.out.println("=== Content ===");
			InputStream input = hpCon.getInputStream();
			//int i = len;
			 while (((c = input.read()) != -  1 ) /*&& (--i > 0)*/)
			{
				str = str + ( char ) c;
			}
			input.close();
			System.out.println(str);
			
			FileWriter fout;
			fout =  new  FileWriter("index.html");
			fout.write(str);
			fout.close();
		/*}
		/*else
		{
			System.out.println("Нет содержимого");
		}*/
	}
}
он работает но работает как то странно. А именно:
1. вместо русских букв получаю знаки вопроса. Подскажите как исправить пожалуйста.
2. почему-то getContentLength() не на всегда работает правильно. с yandex.ru получаю размер файла, а с expert.ru и localhost получаю -1. Подскажите почему?
И ещё есть такой вопрос. В приведенном примере я закоментировал проверку на размер при записи потока, и оставил только проверку на достижение конца потока. Вопрос в том как правильно организовать проверку.
...
Рейтинг: 0 / 0
10.08.2007, 06:30:52
    #34718697
Роман В
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Здесь смотрел?
...
Рейтинг: 0 / 0
10.08.2007, 06:50:19
    #34718704
Krundetz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Спасибо! Уже читаю.
...
Рейтинг: 0 / 0
12.08.2007, 04:55:39
    #34722118
Krundetz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Прочел кучу инфи вот что в итоге получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
URL url1 =  new  URL("http://expert.ru");
URLConnection conn = url1.openConnection();
System.out.println(conn.getContentType());
StringBuffer sbuf =  new  StringBuffer();
 char [] buffer =  new   char [ 64  *  1024 ];
InputStream isr = ((InputStream)conn.getContent());
Reader reader =  new  InputStreamReader(isr, "UTF-8");
 int  b =  0 ;
 while ((b = reader.read(buffer)) > - 1 )
{
       sbuf.append(buffer,  0 , b);
}
System.out.println(sbuf);
FileWriter fout1 =  new  FileWriter("expert.html");
fout1.write( new  String(sbuf));
fout1.close();
Если кто знает где что можно сделать более рационально прошу высказываться.
Ещё интересуют следующие вопросы:
1. Достаточно ли только проверки на конец потока или нет чтобы точно скачать весь документ?
2. Как наверняка узнать в какой кодировке файл чтобы правильно его перевести в текстовый формат? Хотел через getContentType() но на localhost он выдает только что формат текстовый без кодировке, хотя expert.ru выдает ещё и кодировку из чего делаю вывод что ответ зависит от настроек сервера (
...
Рейтинг: 0 / 0
12.08.2007, 10:52:22
    #34722151
chand0s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Krundetz
Как наверняка узнать в какой кодировке файл чтобы правильно его перевести в текстовый формат?
Со 100%-ой точностью - никак. Ты должен либо верить серверу (а он не обязан говорить тебе правду), либо сам определять используемую кодировку (что тоже не дает 100%-ой гарантии).

Как вариант - показывать пользователю этот файл (или его кусок) и список кодировок. Пусть сам решает в какой сохранять.
...
Рейтинг: 0 / 0
12.08.2007, 15:14:32
    #34722271
Хрюхрюшкин.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Krundetz
Как наверняка узнать в какой кодировке файл чтобы правильно его перевести в текстовый формат?
Есть средства вроде Штирлица, которые пытаются с некой долей вероятности угадать используемую кодировку. А это потому, что точно знать её нельзя. До сих пор встречаются сайты, на которых FireFox вместо русских букв сначала кракозяблы показывает, потому что его обманули с форматом, либо вообще не сказали, в какой кодировке текст (Windows-1251, UTF-8, KOI-8r)
...
Рейтинг: 0 / 0
22.08.2007, 05:19:42
    #34743434
Krundetz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
А есть какой нибудь класс который может попытаться угадать кодировку на подобие Штирлица?
...
Рейтинг: 0 / 0
22.08.2007, 11:23:30
    #34744108
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Где-то в инете нашёл пример кода, который какой-то чел написал, как раз для конекта по хттп.
проблем с кодировками нет, всё выдаю юзверу в UTF-8.
вот сам код(оригинал переделал под себя, но 100% рабочий)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
 import  org.apache.log4j.Logger;

 import  javax.servlet.ServletContext;
 import  java.io.InputStream;
 import  java.io.OutputStreamWriter;
 import  java.net.HttpURLConnection;
 import  java.net.InetSocketAddress;
 import  java.net.Proxy;
 import  java.net.URL;
 import  java.util.zip.GZIPInputStream;
 import  java.util.zip.Inflater;
 import  java.util.zip.InflaterInputStream;

 public   class  HTTPWrapper {

     public   static  String strCookies;
     private   static  Logger LOG = Logger.getLogger(HTTPWrapper. class );
     private   static  Proxy proxy =  null ;
     private   static  ServletContext sc;

     public   static   void  initHTTPWrapper(ServletContext sContext) {
        strCookies = "";
        sc = sContext;
         if (sc.getInitParameter("needProxy").equalsIgnoreCase("YES")) {
            proxy =  new  Proxy(
                    Proxy.Type.HTTP,
                     new  InetSocketAddress(
                            sc.getInitParameter("proxyHost"),
                            Integer.parseInt(sc.getInitParameter("proxyPort"))
                    )
            );
        }
    }

     public   static  String Request(String URL, String PostData, String Referer) {
        String method;  if  (PostData != "") method = "POST";  else  method = "GET";
        String strHTML;
         try {
            URL url =  new  URL(URL);
            HttpURLConnection http;
             if (url.getHost().equalsIgnoreCase("localhost") || proxy== null ){
                http = (HttpURLConnection) url. openConnection();
                LOG.debug("Work whith no-proxy");
            }  else  {
                http = (HttpURLConnection) url. openConnection(proxy);
                LOG.debug("Work whith proxy");
            }
            http.setRequestMethod(method);
            http.setRequestProperty("Host", url.getHost());
            http.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3");
            http.setRequestProperty("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
            http.setRequestProperty("Accept-Language", "ru,en-us,en;q=0.5");
            http.setRequestProperty("Accept-Encoding", "gzip,deflate");
            http.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            http.setRequestProperty("Keep-Alive", "300");
            http.setRequestProperty("Connection", "keep-alive");
             if  (Referer != "0")
                http.setRequestProperty("Referer", Referer);
             if  (strCookies != "")
                http.setRequestProperty("Cookie", strCookies);
             if  (method == "POST") {
                http.setDoOutput(true);
                http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                http.setRequestProperty("Content-Length", "" + PostData.length());
                OutputStreamWriter writePost =  new  OutputStreamWriter(http.getOutputStream());
                writePost.write(PostData);
                writePost.flush();
            }
            http.connect();
            String encoding = http.getContentEncoding();
            InputStream receiving =  null ;
             if  (encoding!= null  && encoding.equalsIgnoreCase("gzip"))
                receiving =  new  GZIPInputStream(http.getInputStream());
             else   if  (encoding!= null  && encoding.equalsIgnoreCase("deflate"))
                receiving =  new  InflaterInputStream(http.getInputStream(),  new  Inflater(true));
             else 
                receiving = http.getInputStream();
             int  intReceived;
             byte [] b =  new   byte [ 1 ];
            StringBuffer strBuffer =  new  StringBuffer();
             while ((intReceived = receiving.read(b)) != - 1 ) {
                strBuffer.append( new  String(b));
            }
            receiving.close();
            strHTML = strBuffer.toString();
            strBuffer.delete( 0 , strBuffer.length()); strBuffer.append(strCookies);
             if  (strCookies.length() >  3 ) strBuffer.append("; ");
             for  ( int  i= 0 ;; i++) {
                 if  (http.getHeaderFieldKey(i) ==  null  && http.getHeaderField(i) ==  null ) {
                     break ;
                }  else   if  ("Set-Cookie".equalsIgnoreCase(http.getHeaderFieldKey(i))) {
                    String[] fields = http.getHeaderField(i).split(";\\s*");
                    String[] keyvalue = fields[ 0 ].split("=");
                     if  (strBuffer.indexOf(keyvalue[ 0 ] + "=") == - 1 )
                        strBuffer.append(keyvalue[ 0 ] + "=" + keyvalue[ 1 ] + "; ");
                     else 
                        strBuffer.replace(strBuffer.indexOf(keyvalue[ 0 ]), strBuffer.indexOf(";", strBuffer.indexOf(keyvalue[ 0 ])), keyvalue[ 0 ] + "=" + keyvalue[ 1 ]);
                }
            }
             if  (strBuffer.indexOf("; ", strBuffer.length() -  3 ) != - 1 )
                strBuffer.delete(strBuffer.length() -  2 , strBuffer.length());
            strCookies = strBuffer.toString();
        }  catch  (Exception e) {
             throw   new  RuntimeException("HTTPWrapper : "+e.getMessage());
        }
         return  strHTML;
    }
}
-----
Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже. :)
...
Рейтинг: 0 / 0
22.08.2007, 13:36:49
    #34744730
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
KrundetzА есть какой нибудь класс который может попытаться угадать кодировку на подобие Штирлица?
Вряд ли. А то можно было бы второго Штрилица написать :)
Я просто, считал количество символов, которые входят в диапазон русских букв в кодировке (решал для cp866 и win-1251). Где символов больше, та и кодировка. В штирлице, я думаю, алгоритмы гораздо сложнее и используют не хилый матаппарат.
...
Рейтинг: 0 / 0
30.08.2007, 02:45:42
    #34763252
Krundetz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скачать из сети текстовый файл и сохранить его с правильной кодировкой
Спасибо всем за ответы буду думать.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как скачать из сети текстовый файл и сохранить его с правильной кодировкой / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]