getInputStream中的jcifs nullpointerexception

时间:2014-10-23 09:20:16

标签: java android jcifs

我正在写一个Android应用程序从网络下载文件,但我不断收到以下错误:

  

显示java.lang.NullPointerException               at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213)               at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202)               在jcifs.smb.SmbComNTCreateAndX.writeBytesWireFormat(SmbComNTCreateAndX.java:170)               at jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101)               at jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65)               在jcifs.smb.SmbTransport.doSend(SmbTransport.java:415)               在jcifs.util.transport.Transport.sendrecv(Transport.java:70)               在jcifs.smb.SmbTransport.send(SmbTransport.java:619)               在jcifs.smb.SmbSession.send(SmbSession.java:240)               在jcifs.smb.SmbTree.send(SmbTree.java:111)               在jcifs.smb.SmbFile.send(SmbFile.java:721)               在jcifs.smb.SmbFile.open0(SmbFile.java:926)               在jcifs.smb.SmbFile.open(SmbFile.java:943)               在jcifs.smb.SmbFileOutputStream。(SmbFileOutputStream.java:142)               在jcifs.smb.SmbFileOutputStream。(SmbFileOutputStream.java:97)               在jcifs.smb.SmbFileOutputStream。(SmbFileOutputStream.java:67)               在za.co.ver_tex.itqueries.NetworkShareFileCopy.copyFileUsingJcifs(NetworkShareFileCopy.java:80)               在za.co.ver_tex.itqueries.ViewQuery.ViewFile(ViewQuery.java:780)               在za.co.ver_tex.itqueries.ViewQuery $ 4.onClick(ViewQuery.java:375)               在android.view.View.performClick(View.java:4633)               在android.view.View $ PerformClick.run(View.java:19330)               在android.os.Handler.handleCallback(Handler.java:733)               在android.os.Handler.dispatchMessage(Handler.java:95)               在android.os.Looper.loop(Looper.java:157)               在android.app.ActivityThread.main(ActivityThread.java:5356)               at java.lang.reflect.Method.invokeNative(Native Method)               在java.lang.reflect.Method.invoke(Method.java:515)               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1265)               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)               在dalvik.system.NativeStart.main(本地方法)

这是我的代码 :

public void copyFromNetwork(String NetworkFile, String DestinationFile) {
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Domain",
                "User", "Password");
 SmbFile remoteFile;
        try {

remoteFile = new SmbFile(" smb:" + NetworkFile,auth);

OutputStream os = new FileOutputStream(DestinationFile);

            InputStream is = null;
is = remoteFile.getInputStream();
 int bufferSize = 5096;

            byte[] b = new byte[bufferSize];
            int noOfBytes = 0;
            while ((noOfBytes = is.read(b)) != -1) {
                os.write(b, 0, noOfBytes);
            }
            os.close();
            is.close();
} catch (Exception ex) {
            Log.w("FileCopy", ex);
        }
    }

2 个答案:

答案 0 :(得分:0)

remoteFile未创建,这就是NullPointerException的原因。 首先在使用它之前为类创建对象:

SmbFile remoteFile;//<-- HERE
        try {

OutputStream os = new FileOutputStream(DestinationFile);

            InputStream is = null;
is = remoteFile.getInputStream();

空指针:

is = remoteFile.getInputStream();// Thrown here!

我不知道SmbFile,但你需要这样的东西:

SmbFile remoteFile = new SmbFile();

答案 1 :(得分:0)

遇到非常类似的问题,我认为文件路径很可能不符合SMB URL要求。如果你调试,并且SmbFile实例的unc字段为null,我的怀疑就会得到确认。它可以通过遵循source code documentation中的规范(在初始导入语句之后)来解决。这是一个选择:

  

SMB网址示例

     

smb://users-nyc;miallen:mypass@angus/tmp/
  此URL引用服务器angus上名为tmp的共享作为用户miallen   谁的密码是mypass。

     

smb://Administrator:P%40ss@msmith1/c/WINDOWS/Desktop/foo.txt
  一个相对复杂的示例,以用户Administrator的身份引用文件msmith1的桌面。请注意&#39; @&#39;使用&#39;%40&#39;进行网址编码hexcode escape。

     

smb://angus/
  这仅引用服务器。某些方法的行为在此上下文中是不同的(例如,您无法删除服务器),但是您可能期望list方法将列出此服务器上的可用共享。

     

smb://myworkgroup/
  这在语法上与上面的例子相同。但是,如果myworkgroup发生工作组(确实是由名称建议),list方法将返回已将自己注册为myworkgroup成员的服务器列表。

     

smb://正如smb://server/列出共享和smb://workgroup/列出服务器一样,smb:// URL列出了netbios局域网上的所有可用工作组。同样,在此上下文中,许多方法无效并返回默认值(例如,isHidden将始终返回false)。

     

smb://angus.foo.net/d/jcifs/pipes.doc
  服务器名称也可以是此示例中的DNS名称。有关详细信息,请参阅设置名称分辨率属性。

     

smb://192.168.1.15/ADMIN$/
  服务器名称也可以是IP地址。有关详细信息,请参阅设置名称分辨率属性。

     

smb://domain;username:password@server/share/path/to/file.txt
  一个使用所有字段的原型示例。

     

smb://myworkgroup/angus/&lt; - ILLEGAL
  尽管工作组,服务器和文件系统之间存在层次关系,但此示例无效。

     

smb://server/share/path/to/dir&lt; - ILLEGAL
  表示工作组,服务器,共享或目录的URL需要一个尾部斜杠&#39; /&#39;。

     

smb://MYGROUP/?SERVER=192.168.10.15
  SMB URL支持一些查询字符串参数。在此示例中,SERVER参数用于覆盖服务器名称服务查找,以联系工作组MYGROUP中服务器列表的服务器192.168.10.15(可能已知为主浏览器)。