java - 使用 SmbFileInputStream 获取 NullPointerException
问题描述
试图修改另一台机器上的excel。传递 IP 地址、用户名、密码和文件路径来访问和修改文件,但在new SmbFileInputStream(sFile)
. 这是什么原因?
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domin", "username", "password");
String path = "smb:\\\\<IPaddress>\\C$\\<FolderName>\\File%20-%20Input.xlsx";
SmbFile sFile = new SmbFile(path, auth);
try {
SmbFileInputStream inputStream = new SmbFileInputStream(sFile);
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
int rowCount = sheet.getLastRowNum(),i=0;
Cell cell;
for(ForemostReservedDataDO obj : unsavedRecords){
i++;
Row row = sheet.createRow(rowCount+i);
cell = row.createCell(0);
cell.setCellValue(obj.getPolicyNum());
cell = row.createCell(1);
cell.setCellValue("Recreational Value");
}
inputStream.close();
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
workbook.write(sfos);
workbook.close();
sfos.close();
} catch (EncryptedDocumentException | InvalidFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
全栈
SEVERE: Servlet.service() for servlet [spring-dispatcher] in context with path [/Foremost] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213)
at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202)
at jcifs.smb.SmbComNTCreateAndX.writeBytesWireFormat(SmbComNTCreateAndX.java:170)
at jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101)
at jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65)
at jcifs.smb.SmbTransport.doSend(SmbTransport.java:439)
at jcifs.util.transport.Transport.sendrecv(Transport.java:67)
at jcifs.smb.SmbTransport.send(SmbTransport.java:655)
at jcifs.smb.SmbSession.send(SmbSession.java:238)
at jcifs.smb.SmbTree.send(SmbTree.java:119)
at jcifs.smb.SmbFile.send(SmbFile.java:775)
at jcifs.smb.SmbFile.open0(SmbFile.java:989)
at jcifs.smb.SmbFile.open(SmbFile.java:1006)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65)
at com.Foremost.Controllers.DataDownController.saveReservedData(DataDownController.java:217)
解决方案
您的 JCIFS 版本似乎已过时并且与远程系统不兼容。升级到最新的 JCIFS(当前版本:2.1.3,https ://github.com/codelibs/jcifs )或 jcifs-ng(https://github.com/AgNO3/jcifs-ng),从中链接 JCIFS现在是fork了。
下面是一些关于如何使用 jcifs-ng 通过 SMB 读取文件的示例代码:
String fileUrl = "smb://netserver/some/path/to/file.xls";
Properties cifsProps = new Properties();
cifsProps.setProperty("jcifs.smb.client.domain", "my.domain.int");
cifsProps.setProperty("jcifs.smb.client.username", USER_NAME);
cifsProps.setProperty("jcifs.smb.client.password", PASSWORD);
Configuration config = new PropertyConfiguration(cifsProps);
BaseContext context = new BaseContext(config);
SmbResource resource = context.get(fileUrl);
if (!(resource instanceof SmbFile)) {
throw new CIFSException("File URL does not point to a file on a network share");
}
try (InputStream in = ((SmbFile) resource).getInputStream()) {
// TODO read from in
} finally {
context.close();
}
对于编写文件,好吧,我认为您将能够弄清楚:-)
推荐阅读
- python-3.x - 为什么在布尔过滤数组中切片没有发生..?
- python - 基本 Docker 绑定挂载故障排除
- javascript - 我正在努力在我的代码中定义 yVelocity
- oracle - 如何使用 APEX_UTIL.PREPARE_URL?
- python - 抓取动态信息
- vue.js - Vue - 检测元素是否已添加到 v-for 对象
- javascript - 如何在反应中显示另一个组件中的函数值?
- java - 没有 XML 的加载屏幕 - android studio
- android - 使用 Wireshark 进行 Android 蓝牙侦听:androiddump 中缺少蓝牙接口
- swift - 如何为 SwiftPM 包启用 ABI 稳定性?