Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Считать файл из ftp


Автор: Wanderer2019 3.12.2004, 23:26
Здравствуйте еще разок!
Не знает ли кто нибудь можно ли считать содержимое файла на ftp не копируя его на локальный диск? слышал как то можно создать BufferedReader на удаленный файл, но никак не получается!!! S--O--S .... S--O--S ... S--O--S ... S--O--S smile

P.S. Зарегистрировался! smile

Автор: Domestic Cat 4.12.2004, 00:35
Если ты сам не сохранаешь файл, то на диске он не появится. Очевидно для чтения из ftp используется к-л InputStream, и если этот стрим не пишет на диск, то файл собственно и находится в памяти.
Постарайся сформулировать вопрос почетче, проблема в создании стрима или в чем-то еще?

Автор: igon 4.12.2004, 05:33
Во второй ссылке, которую давал DomesticCat в топике, так преждевременно тобой покинутом (вместе с этим вопросом smile), приводятся два примера. Ты, видимо. попытался использовать первый. А для твоих задач - лучше второй, с добавлением BufferedInputStream.

Код

URL url = new URL("ftp://user01:[email protected]/README.txt;type=i");
URLConnection urlc = url.openConnection();
BufferedInputStream bis = new BufferedInputStream(urlc.getInputStream()); // To download


А уж из bis методом read() можешь читать и сохранять куда угодно

Автор: Domestic Cat 4.12.2004, 06:27
Цитата(igon @ 3.12.2004, 20:33)
так преждевременно тобой покинутом (вместе с этим вопросом smile)


Перекинул я, тк. по правилам - один вопрос на одну тему smile

Автор: Wanderer2019 4.12.2004, 14:56
OKay! Предположим имеется некий ftp Сервер на котором в дериктории dir находятся текстовые файлы, иформация в которых меня и интересует. Я знаю имя файла. Коннект к ftp средствами commons net. Вопрос: как считать информацию из этого файла (прямо с ftp, не делая копию на локальном диске)? или это не возможно и объязательно нужно копировать файл на HDD? если у кого есть какие нибудь примеры!!!! Всем спасибо!
Добавлено @ 14:58
да забыл сказать URL не совсем подходит т.к. на ftp стоит проверка подлинности пользователя! или можно и с помощью URLConnection входить по паролю и логину?

Автор: igon 5.12.2004, 04:39
За повторение вопроса - спасибо smile
После моего ответа проблема осталась? smile

Код

user01:pass1234

в
Код

URL url = new URL("ftp://user01:[email protected]/README.txt;type=i");

разве не логин и пароль?

Автор: Wanderer2019 5.12.2004, 15:38
Вариант конечно не плохой. Спасибо! А возможно сделать что либо подобное через FTPClient?

Автор: igon 5.12.2004, 21:29
FTPClient не входит в SDK 1.4, которым я пользуюсь - так что, увы...smile
Посмотри здесь:
http://www.enterprisedt.com/downloads/ftp/doc/com/enterprisedt/net/ftp/FTPClient.html

(после беглого просмотра) Похоже, это подойдет:

Цитата
get
public byte[] get(java.lang.String remoteFile)
          throws java.io.IOException,
                  FTPException
Get data from the FTP server. Transfers in whatever mode we are in. Retrieve as a byte array. Note that we may experience memory limitations as the entire file must be held in memory at one time.

Parameters:
remoteFile - name of remote file in current directory
java.io.IOException
FTPException

Автор: Aver91 24.12.2009, 18:43
Всем добрый вечер, решил задать небольшие вопросы касаемо подключений к ftp здесь, чтобы не плодить одинаковых тем.  
Код

public class FTP implements Runnable{
    Thread t =null;
    static Socket first=null;
    static Socket second =null;
    static DataInputStream reccmd = null;
    static PrintStream setcmd = null;
    static FileOutputStream outf=null;
    static InputStream out=null;
    static String reply=null;
    byte []get;
    FTP(){
        t=new Thread(this,"down");
        System.out.println("запускаем поток");
        t.start();
        }
    public void run() {
        
        try {
            second=new Socket ("IP",20);
            System.out.println("второй сокет подключен"+second.isConnected());
                    out=second.getInputStream();
            out.read(get);
            //запись в файл
            out.close();
            second.close();
        } catch (UnknownHostException e1) {
        
            e1.printStackTrace();
        } catch (IOException e1) {
        
            e1.printStackTrace();
        }
        
}
    
public static void main(String[] args) throws UnknownHostException, IOException
     {first = new Socket("IP",21);
     reccmd = new DataInputStream(first.getInputStream());
     setcmd = new PrintStream(first.getOutputStream());

    //происходит общение с сервером
 try{
      FTP thr=new FTP();
     FTP.t.join(); }
     
catch(InterruptedException e){System.out.println("главный прерван");}
     first.close();
    reccmd.close();
    setcmd.close();
         
     }
}


суть проблемы: я создаю подключение к серверу для общения с помощью first. в таком случае сетевая карта уже занята подключением. как сделать 2ое подключение? есть ли смысл использовать URL?
ЗЫ: в программе нельзя использовать дополнительные модули типа org.apache.commons.net.ftp
работаю в среде eclipse для J2SE


Автор: LSD 25.12.2009, 17:59
Цитата(Aver91 @  24.12.2009,  18:43 Найти цитируемый пост)
ЗЫ: в программе нельзя использовать дополнительные модули типа org.apache.commons.net.ftp

Что-то я в принципе не вижу никаких commons-net.



Цитата(Aver91 @  24.12.2009,  18:43 Найти цитируемый пост)
суть проблемы: я создаю подключение к серверу для общения с помощью first. в таком случае сетевая карта уже занята подключением. как сделать 2ое подключение?

Сетевая карта, может одновременно обслуживать гораздо больше, чем одно подключение. И вообще, почему у тебя второй поток подключается на 20 порт?

Автор: Aver91 25.12.2009, 20:55
Цитата(LSD @ 25.12.2009,  17:59)
Цитата(Aver91 @  24.12.2009,  18:43 Найти цитируемый пост)
ЗЫ: в программе нельзя использовать дополнительные модули типа org.apache.commons.net.ftp

Что-то я в принципе не вижу никаких commons-net.



Цитата(Aver91 @  24.12.2009,  18:43 Найти цитируемый пост)
суть проблемы: я создаю подключение к серверу для общения с помощью first. в таком случае сетевая карта уже занята подключением. как сделать 2ое подключение?

Сетевая карта, может одновременно обслуживать гораздо больше, чем одно подключение. И вообще, почему у тебя второй поток подключается на 20 порт?

ну вот я собственно и не добавил их. написал за тем, чтобы не предлагали ссылки на подобные модули

порт я просто так ему задал. с пассивным режимом я плохо понимаю, поэтому решил делать передачу в активном. на 20 порт сервер дает положительный ответ когда посылаю ему команду PORT

Добавлено через 12 минут и 1 секунду
хотя сейчас я пассивный попробовал и разобрался как порт взять из ответа сервера. но суть проблемы остается. у меня второе подключение не создается

Автор: Egik2 25.12.2009, 21:57

Wanderer2019, ты  sun.net.ftp.FTPClient имел в виду?
Тогда простейший пример кода:
Код

import sun.net.ftp.FtpClient;
import sun.net.TelnetInputStream;

import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 * User: Egik
 * Date: 25.12.2009
 * Time: 21:44:08
 */
public class Main {
    public static void main(String args[]) {
        FtpClient f = null;
        try {
            f = new FtpClient("ftp.yandex.ru");
            f.login("anonymous", "qwerty");
            TelnetInputStream t = f.get("HEADER.txt");
            byte[] b = new byte[200];
            //читаю по 200 байт из файла HEADER.txt
            int readed = t.read(b);
            while(t.read(b) > 0) {
                 System.out.println(new String(b));
            }

        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }
}



Автор: ICEMAN3141592 29.12.2009, 01:15
Привет всем, вопрос туда же... Есть код (отрывочек)
String host = "ftp.yandex.ru";
String user = "anonymous";
String password = "2f9781da46";

System.out.println("Connecting to host " + host);
      m_client = new FtpClient();
      m_client.openServer(host);
      System.out.println("Connecting to host " + host);
      m_client.setConnectTimeout(2000000);
      m_client.login(user, password);
      System.out.println("User " + user + " login OK");
      getFileSize(m_client, "1.jpg");
      System.out.println(m_client.welcomeMsg);
      m_client.cd(sDir);
      System.out.println("Directory: " + sDir);
      m_client.binary();
      System.out.println("Success.");
---------------------------------------------------------------------------------------------------------------------------------------------------
так работает, а вот host = "ftp.filehoster.ru"; user = "user219611"; password = "2f9781da46"; 
то уже нет... пишет, что время подсоединения вышло, но я жчерез проводник захожу и все нормально, хочу скачать файл 1.jpg и не фига... Пожалуйста

Автор: Aver91 2.1.2010, 23:16
вопрос с подключением 2-го сокета решен. возник другой: как лучше информацию из входящего потока в байтовом виде записать в файл? через байтовый массив? и считывать например из потока по 200 байт и писать их в файл?

Автор: LSD 4.1.2010, 12:38
Цитата(Aver91 @  2.1.2010,  23:16 Найти цитируемый пост)
и считывать например из потока по 200 байт и писать их в файл?

Лучше по 4 -16 килобайт.

Автор: Aver91 6.1.2010, 21:10
LSD, спасибо за помощь, решил обойтись без массива и писать напрямую в файл. записывание байтов прерывается, когда файл достигает размера, который выслал сервер командой SIZE. проблема вроде бы как решена

Автор: gochu 27.11.2010, 13:40
Доброго времени суток!
У меня следующая проблема. На ftp-сервере лежит текстовый файл, суть плоская база даный, состоящаю из строк. 
Каждая строка имеет 8 (первых) однохначноиденетифицирующих ее симовлов.
...
00000576 06 140 12 Disboscatore 32 
00002680 06 140 3 Disboscatore 32 
00004285 06 140 26 Disboscatore 32 
00004315 06 100 5 Disboscatore 32 
00004380 06 140 15 Disboscatore 32 
...
Задача: по введенным 8 символам, провести поиск и выведение на екран строки, где этот код и находиться.

Проблема.... telnet не копирует надлежащим образом символы перевода строки на hdd, что, на мой взгяд, есть первым этапом решения задачи.
Вторым, я надеюсь, после решеиня первой, будет поиск по скопированому тестовику строки и ее вывод, 
Код

FtpClient f = null;
        try {
            f = new FtpClient("127.0.0.1");
            f.login("1", "1");
            TelnetInputStream t = f.get("/indexcat.txt");
            //FilterInputStream  ler =  t;
            BufferedInputStream bb = new BufferedInputStream(t);
            byte[] b1 = new byte[1];
            //int readed = t.read(b1);

            File fw = new File("c:\\temp\\srch.txt");
            FileWriter fop = new FileWriter(fw);
            while(t.read(b1) > 0) {
                             fop.write(new String(b1));
                             //System.out.println(new String(b1));
            }
Еще одна проблема появилась по ходу действия, файл не копируется полностью. writer ли виноват в этом?, Но пока...вот код (использовал ваши советы)
Буду благодарен за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)