web-dev-qa-db-fra.com

Lecture d'un fichier distant en Java

Je recherche un moyen simple d’obtenir des fichiers situés sur un serveur distant. Pour cela, j'ai créé un serveur FTP local sur Windows XP et j'essaie maintenant de donner à mon applet de test l'adresse suivante:

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

et bien sûr je reçois l'erreur suivante:

Le schéma d'URI n'est pas "fichier"

J'ai essayé d'autres méthodes pour obtenir le fichier, elles ne semblent pas fonctionner. Comment devrais-je le faire? (Je souhaite aussi effectuer une requête HTTP)

16
vondip

Vous ne pouvez pas faire cela avec FTP.

Si votre fichier est sur http, vous pouvez faire quelque chose de similaire à:

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

Si vous voulez utiliser une bibliothèque pour FTP, vous devriez vérifier Apache Commons Net

20
Eric Anderson

Lecture de fichier binaire via http et enregistrement dans un fichier local (extrait de ici ):

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();
8
serg

Tu es presque là. Vous devez utiliser l'URL au lieu de l'URI. Java est livré avec un gestionnaire d'URL par défaut pour FTP. Par exemple, vous pouvez lire le fichier distant dans un tableau d'octets comme ceci,

    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();
    }

Cependant, FTP n'est peut-être pas le meilleur protocole à utiliser dans une applet. Outre les restrictions de sécurité, vous devrez faire face à des problèmes de connectivité car le protocole FTP nécessite plusieurs ports. Utilisez HTTP si possible comme suggéré par d'autres.

4
ZZ Coder

J'ai codé un Java Remote File objets client/serveur pour accéder à un système de fichiers distant comme s'il était local. Cela fonctionne sans aucune authentification (ce qui était le cas à ce moment-là), mais il pourrait être modifié pour utiliser SSLSocket au lieu des sockets standard pour l'authentification.

C'est très accès brut: pas de nom d'utilisateur/mot de passe, pas de répertoire "home"/chroot.

Tout est maintenu aussi simple que possible:

Configuration du serveur

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

Configuration du client

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

Vous avez accès à File, InputStream et OutputStream à distance via le client. Il étend Java.io.File pour une utilisation transparente dans l'API en utilisant File pour accéder à ses métadonnées (c'est-à-dire length(), lastModified(), ...).

Il utilise également la compression facultative pour le transfert de gros fichiers et le MTU programmable, avec une récupération optimisée du fichier entier. Une interface de ligne de commande est intégrée à une syntaxe de type FTP pour les utilisateurs finaux.

0
Matthieu

Cela a fonctionné pour moi tout en essayant de transférer le fichier d'une machine distante sur ma machine.

NOTE - Ce sont les paramètres passés à la fonction mentionnée dans le code ci-dessous:

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

(Ici, vous devez donner l'adresse IP de votre machine du système distant, puis le chemin du fichier texte (testFileUpload.txt) sur la machine distante, ici C$ signifie le lecteur C du système distant. l'adresse ip commence par \\, mais pour l'echapper, nous la démarrons \\\\)

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

(ici c'est le chemin sur la machine locale où le fichier doit être transféré, il créera ce nouveau fichier texte - testFileUploadTransferred.txt, avec le contenu du fichier distant - testFileUpload.txt qui se trouve sur le système distant) 

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();
        }

    }

}
0
Gloria Rampur

Je trouve cela très utile: 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();
    }
}
0
Feng Zhang