Чтение удаленного файла с использованием Java

Я ищу простой способ получить файлы, расположенные на удаленном сервере. Для этого я создал локальный ftp-сервер на моей Windows XP, и теперь я пытаюсь дать моему тестовому апплетам следующий адрес:

try
{
    uri = new URI("ftp://localhost/myTest/test.mid");
    File midiFile = new File(uri);
}
catch (Exception ex)
{
}

и, конечно, я получаю следующую ошибку:

Схема URI не является файлом

Я пытался использовать другие способы получить файл, они, похоже, не работают. Как я должен это делать? (Я также хочу выполнить HTTP-запрос)

Ответ 1

Вы не можете сделать это из коробки с ftp.

Если ваш файл находится на http, вы можете сделать что-то похожее на:

URL url = new URL("http://q.com/test.mid");
InputStream is = url.openStream();
// Read from is

Если вы хотите использовать библиотеку для FTP, вы должны проверить Apache Commons Net

Ответ 2

Чтение двоичного файла через http и сохранение его в локальном файле (взято из здесь):

URL u = new URL("http://www.java2s.com/binary.dat");
URLConnection uc = u.openConnection();
String contentType = uc.getContentType();
int contentLength = uc.getContentLength();
if (contentType.startsWith("text/") || contentLength == -1) {
  throw new IOException("This is not a binary file.");
}
InputStream raw = uc.getInputStream();
InputStream in = new BufferedInputStream(raw);
byte[] data = new byte[contentLength];
int bytesRead = 0;
int offset = 0;
while (offset < contentLength) {
  bytesRead = in.read(data, offset, data.length - offset);
  if (bytesRead == -1)
    break;
  offset += bytesRead;
}
in.close();

if (offset != contentLength) {
  throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes");
}

String filename = u.getFile().substring(filename.lastIndexOf('/') + 1);
FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.flush();
out.close();

Ответ 3

Ты почти там. Вам нужно использовать URL, а не URI. Java поставляется с обработчиком URL по умолчанию для FTP. Например, вы можете прочитать удаленный файл в байтовый массив следующим образом:

    try {
        URL url = new URL("ftp://localhost/myTest/test.mid");
        InputStream is = url.openStream();
        ByteArrayOutputStream os = new ByteArrayOutputStream();         
        byte[] buf = new byte[4096];
        int n;          
        while ((n = is.read(buf)) >= 0) 
            os.write(buf, 0, n);
        os.close();
        is.close();         
        byte[] data = os.toByteArray();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Однако FTP не может быть лучшим протоколом для использования в апплете. Помимо ограничений безопасности, вам придется иметь дело с проблемами подключения, поскольку FTP требует нескольких портов. Используйте HTTP, если это возможно, как это было предложено другими.

Ответ 4

Это сработало для меня, пытаясь вывести файл с удаленной машины на мою машину.

ПРИМЕЧАНИЕ. Это параметры, переданные функции, указанной в приведенном ниже коде:

String domain = "xyz.company.com";
String userName = "GDD";
String password = "fjsdfks";

(здесь вы должны указать свой IP-адрес устройства удаленной системы, затем путь к текстовому файлу (testFileUpload.txt) на удаленном компьютере, здесь C$ означает диск C для удаленной системы. Также ip адрес начинается с \\, но для того, чтобы избежать двух обратных косых черт, мы начинаем его \\\\)

String remoteFilePathTransfer = "\\\\13.3.2.33\\c$\\FileUploadVerify\\testFileUpload.txt";

(здесь это путь на локальной машине, на которой файл должен быть передан, он создаст этот новый текстовый файл - testFileUploadTransferred.txt, с содержимым удаленного файла - testFileUpload.txt, который находится на пульте дистанционного управления система)

String fileTransferDestinationTransfer = "D:/FileUploadVerification/TransferredFromRemote/testFileUploadTransferred.txt";

import java.io.File;
import java.io.IOException;

import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileSystemOptions;
import org.apache.commons.vfs.Selectors;
import org.apache.commons.vfs.UserAuthenticator;
import org.apache.commons.vfs.VFS;
import org.apache.commons.vfs.auth.StaticUserAuthenticator;
import org.apache.commons.vfs.impl.DefaultFileSystemConfigBuilder;

public class FileTransferUtility {

    public void transferFileFromRemote(String domain, String userName, String password, String remoteFileLocation,
            String fileDestinationLocation) {

        File f = new File(fileDestinationLocation);
        FileObject destn;
        try {
            FileSystemManager fm = VFS.getManager();

            destn = VFS.getManager().resolveFile(f.getAbsolutePath());

            if(!f.exists())
            {
                System.out.println("File : "+fileDestinationLocation +" does not exist. transferring file from : "+ remoteFileLocation+" to: "+fileDestinationLocation);
            }
            else
                System.out.println("File : "+fileDestinationLocation +" exists. Transferring(override) file from : "+ remoteFileLocation+" to: "+fileDestinationLocation);

            UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
            FileSystemOptions opts = new FileSystemOptions();
            DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
            FileObject fo = VFS.getManager().resolveFile(remoteFileLocation, opts);
            System.out.println(fo.exists());
            destn.copyFrom(fo, Selectors.SELECT_SELF);
            destn.close();
            if(f.exists())
            {
                System.out.println("File transfer from : "+ remoteFileLocation+" to: "+fileDestinationLocation+" is successful");
            }
        }

        catch (FileSystemException e) {
            e.printStackTrace();
        }

    }

}

Ответ 5

Я закодировал объекты клиента/сервера Java Remote File для доступа к удаленной файловой системе, как если бы она была локальной. Он работает без какой-либо аутентификации (что было тогда в то время), но его можно было изменить, чтобы использовать SSLSocket вместо стандартных сокетов для аутентификации.

Это очень доступный доступ: нет имени пользователя/пароля, нет каталога "home" /chroot.

Все как можно проще:

Настройка сервера

JRFServer srv = JRFServer.get(new InetSocketAddress(2205));
srv.start();

Настройка клиента

JRFClient cli = new JRFClient(new InetSocketAddress("jrfserver-hostname", 2205));

У вас есть доступ к удаленным File, InputStream и OutputStream через клиента. Он расширяет java.io.File для беспрепятственного использования в API с помощью File для доступа к его метаданным (т.е. length(), lastModified(),...).

Он также использует дополнительное сжатие для передачи файлов и программируемого MTU с оптимизированным поиском всего файла. CLI встроен с FTP-подобным синтаксисом для конечных пользователей.

Ответ 6

Я нахожу это очень полезным: https://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html

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

public class URLReader {
    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com/");
        BufferedReader in = new BufferedReader(
            new InputStreamReader(oracle.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);
        in.close();
    }
}

Ответ 7

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