You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java将修改后的JSONObject写回远程Linux服务器的JSON文件

解决远程SFTP服务器JSON文件修改后写回的问题

嗨,看起来你已经搞定了JSON解析和属性修改的核心部分,剩下的写回步骤其实很简单,用JSch的ChannelSftp就能轻松实现!我来给你补全代码并解释关键细节:

核心步骤说明

要把修改后的JSONObject写回远程原文件,你需要做这几件事:

  • 将修改后的JSONObject转换为标准JSON字符串
  • 把字符串包装成输入流(因为SFTP的put方法只接受输入流作为数据源)
  • 使用ChannelSftp.put()方法上传到原文件路径,指定覆盖模式避免文件冲突

完整代码示例

我把你的现有代码补全,加上写回逻辑和资源关闭的最佳实践:

Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
InputStream stream = null;

try {
    // 1. 读取远程JSON文件并解析
    stream = sftp.get("<JSON FILE LOCATION>");
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(stream, "UTF-8"));
    
    // 2. 修改指定属性
    System.out.println("修改前的JSON: " + jsonObject.toJSONString());
    jsonObject.put("XXXX", "WWWWXYZ");
    System.out.println("修改后的JSON: " + jsonObject.toJSONString());
    
    // 3. 将修改后的JSON转换为UTF-8编码的字节流
    String updatedJson = jsonObject.toJSONString();
    InputStream updatedStream = new ByteArrayInputStream(updatedJson.getBytes(StandardCharsets.UTF_8));
    
    // 4. 写回远程原文件,指定OVERWRITE模式覆盖原有文件
    sftp.put(updatedStream, "<JSON FILE LOCATION>", ChannelSftp.OVERWRITE);
    System.out.println("JSON文件已成功更新并写回远程服务器!");

} catch (ParseException | IOException e) {
    e.printStackTrace();
} finally {
    // 5. 关闭所有资源,避免连接泄漏
    try {
        if (stream != null) stream.close();
        if (sftp != null) sftp.disconnect();
        if (channel != null) channel.disconnect();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关键细节解释

  • ChannelSftp.OVERWRITE模式:如果不指定这个参数,当远程文件已存在时,SFTP默认会抛出"文件已存在"的异常,加上这个参数就能直接覆盖原文件。
  • UTF-8编码:读取和写入都强制使用UTF-8,避免不同系统环境下中文或特殊字符出现乱码问题。
  • 资源关闭:一定要在finally块里关闭流和SFTP通道,防止长期占用服务器连接资源导致泄漏。

内容的提问来源于stack exchange,提问作者Vikas shitole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:00