我正在写一个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);
}
}
答案 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(可能已知为主浏览器)。