8

I am trying to read a remote file in java

File f = new File("//192.168.1.120/home/hustler/file.txt");

The remote machine needs a Username and Password to allow me to access the file.

Is there a way I could pass the parameters through the java code and read the file?

Pablo Claus
  • 5,886
  • 3
  • 29
  • 38
jaysun
  • 159
  • 1
  • 1
  • 10

4 Answers4

8
package com.eiq;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.vfs.FileObject;
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 RemoteFileDemo {
    public static void main(String[] args) throws IOException {

        String domain = "hyd\\all";
        String userName = "chiranjeevir";
        String password = "Acvsl@jun2013";
        String remoteFilePath = "\\\\10.0.15.74\\D$\\Suman\\host.txt";


        File f = new File("E:/Suman.txt"); //Takes the default path, else, you can specify the required path
        if (f.exists()) {
            f.delete();
        }
        f.createNewFile();
        FileObject destn = VFS.getManager().resolveFile(f.getAbsolutePath());

        //domain, username, password
        UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
        FileSystemOptions opts = new FileSystemOptions();
        DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);


        FileObject fo = VFS.getManager().resolveFile(remoteFilePath, opts);

        System.out.println(fo.exists());

        //fo.createFile();

        destn.copyFrom(fo, Selectors.SELECT_SELF);
        destn.close();

        //InputStream is = new FileInputStream(f);

    }
}

This is a program to read a file from the remote machine and store it in our local machine as file E:/Suman.txt.

Take care while writing the file path means instead of : we have to replace it with $ symbol, e.g.: D:\Suman\Boorla\kpl.txt is wrong, D$\\Suman\\Boorla\\kpl.txt is right.

In the above program, you have to change the domain name, username, password and file path of the remote machine. To work with the above program we need to add the following jar files int the classpath.

commons-vfs.jar
commons-logging.jar
Brad Turek
  • 2,472
  • 3
  • 30
  • 56
Suman Boorla
  • 89
  • 1
  • 2
5

Another alternative with jCIFS you can easily specify authentication parameters:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "user", "password"); // Authentication info here, domain can be null
try (InputStream is = new SmbFile("smb://192.168.1.120/home/hustler/file.txt", auth).getInputStream()) {
    // Read from 'is' ...
} catch (IOException e) {
    // Handle IOException
}
Matthieu
  • 2,736
  • 4
  • 57
  • 87
3

You can also try Commons VSF . Check UserAuthenticator

Lorand Bendig
  • 10,630
  • 1
  • 38
  • 45
3

Here is the code, I've written and it is working Perfectly.

File f=new File("abc.txt"); //Takes the default path, else, you can specify the required path
if(f.exists())
{
    f.delete();
}
f.createNewFile(); 
FileObject destn = VFS.getManager().resolveFile(f.getAbsolutePath());
UserAuthenticator auth = new StaticUserAuthenticator("", "myusername", "secret_password");
FileSystemOptions opts = new FileSystemOptions();

DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile("\\\\192.168.0.1\\direcory\\to\\GetData\\sourceFile.txt",opts);
destn.copyFrom(fo,Selectors.SELECT_SELF);
destn.close();

Now you can use the file to perform the required operations. Something like...

InputStream is = new FileInputStream(f);
smn.tino
  • 2,272
  • 4
  • 32
  • 41
jaysun
  • 159
  • 1
  • 1
  • 10
  • 1
    Are you copying the file locally before reading from the local copy? That's pretty inefficient... – Matthieu Feb 08 '17 at 21:32