Чтение удаленного файла с использованием 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, вы можете настроить сетевой ресурс и получить доступ к нему таким образом.