国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java通過FTP跨服務(wù)器動態(tài)監(jiān)聽讀取指定目錄下文件數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了java通過FTP跨服務(wù)器動態(tài)監(jiān)聽讀取指定目錄下文件數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景:

1、文件數(shù)據(jù)在A服務(wù)器(windows)(不定期在指定目錄下生成),項目應(yīng)用部署在B服務(wù)器(Linux);
2、項目應(yīng)用在B服務(wù)器,監(jiān)聽A服務(wù)器指定目錄,有新生成文件,進行讀取文件信息,持久化數(shù)據(jù);
3、提供兩塊內(nèi)容,第一安裝windows FTP服務(wù);第二項目源碼,希望可以幫助到你。

共計4種方案,試錯采用了第三種方案,第四種方案沒有試。

1、使用jcsh.jar提供方法讀取文件信息,但需要A服務(wù)器開通SSH遠程連接,一般linux服務(wù)器都是默認開通的,可直接讀取連接讀取,windows系統(tǒng)需安裝SSH,因現(xiàn)場環(huán)境A服務(wù)器是windows2003,故放棄這種方法。
2、曲線救國,通過腳本(腳本監(jiān)聽比較困難,故放棄)把A服務(wù)器信息定時存入B服務(wù)器(Linux),再通過jcsh.jar讀取文件信息。
3、通過A服務(wù)器安裝FTP服務(wù),B服務(wù)器安裝FTP客戶端,使用java動態(tài)監(jiān)聽該目錄下生成文件讀取信息。
4、把A服務(wù)器指定目錄進行共享(等同于共享的這個目錄就是B服務(wù)的目錄了),再進行讀取,因第三種方案成功,故沒有嘗試第四種方案。

windows安裝FTP服務(wù)

1、開啟ftp服務(wù):控制面板–程序和功能–啟用或關(guān)閉windows功能–標(biāo)紅框全部打開–點擊確定
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
2、新建站點:
控制面板–大圖標(biāo)–管理工具
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
IIS管理器
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
網(wǎng)站–添加FTP站點
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
java監(jiān)控ftp變化,java,服務(wù)器,開發(fā)語言
以上就是windows安裝FTP服務(wù)的過程,我這演示了匿名創(chuàng)建站點,誰都可以訪問,還可以新建用戶,需要用戶登錄才能訪問。文章來源地址http://www.zghlxwxcb.cn/news/detail-778388.html

源碼

引入該依賴

<dependency>
   <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

FileChangeData

@Data
public class FileChangeData {

    /**
     * 文件信息
     * */
    private FTPFile ftpFile;

    /**
     * 文件改變類型
     * */
    private FileChangeType eventType;

    /**
     * 文件名稱
     * */
    private   String fileName;

    /**
     * 文件大小
     * */
    private Long fileSize;

    /**
     * FTPClient
     * */
    private FTPClient ftpClient;

    /**
     * 獲取文件輸入流
     * @return InputStream
     * */
    public InputStream getInputStream(String filePathName) {
        //如果是刪除事件則不能夠獲取流
        if (Objects.equals(eventType, FileChangeType.FILE_DELETED)) {
            return null;
        }

        try {
            return ftpClient.retrieveFileStream(filePathName);
        } catch (IOException e) {
            return null;
        }
    }
}

FileChangeEvent

public interface FileChangeEvent {

    /**
     * 文件發(fā)生改變時觸發(fā)此方法
     * @param fileChangeData 文件發(fā)生了改變
     * */
    @Function
    void change(FileChangeData fileChangeData) throws IOException;
}

FTPService

public interface FTPService {

    /**
     * ftp登陸
     * @return boolean 是否登陸成功
     * */
    FTPClient login();

    /**
     * ftp登出
     * @return boolean 是否登出成功
     * */
    boolean loginOut();

    /**
     * 獲取文件列表
     * @return FTPFile[] 文件列表
     * */
    FTPFile[] listFile();

    /**
     * 監(jiān)聽文件夾的改變
     * @param fileChangeEvent 文件改變事件
     * */
    void addListenerFileChange(FileChangeEvent fileChangeEvent);
}

ListenerChangeRunnable

public interface ListenerChangeRunnable extends Runnable {

    /**
     * 停止監(jiān)聽文件
     * @return boolean 是否停止成功
     * */
    boolean stopListener();
}

FTPServiceImpl

@Service
public class FTPServiceImpl implements FTPService {

    @Autowired
    private FTPConfig ftpConfig;

    private String SPLIT = ":";

    private ThreadLocal<FTPClient> currentFTPClient;

    private ThreadLocal<ListenerChangeRunnable> currentListener;

    public FTPServiceImpl() {
        this.currentFTPClient = new ThreadLocal<>();
        this.currentListener = new ThreadLocal<>();
    }

    @Override
    public FTPClient login() {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(ftpConfig.getFtpIp(), ftpConfig.getFtpPort());
            ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword());
//            ftpClient.setControlEncoding("gb2312");
            this.currentFTPClient.set(ftpClient);
            return ftpClient;
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public boolean loginOut() {
        try {
            currentFTPClient.get().logout();
            currentFTPClient.get().disconnect();
            return Boolean.TRUE;
        } catch (Exception e) {
            return Boolean.FALSE;
        }
    }

    @Override
    public FTPFile[] listFile() {
        FTPClient ftpClient = this.currentFTPClient.get();
        try {
            return ftpClient.listFiles();
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public void addListenerFileChange(FileChangeEvent fileChangeEvent) {
        FTPClient ftpClient = this.currentFTPClient.get();
        ListenerFileChangeThreadRunnable listenerFileChangeThread = new ListenerFileChangeThreadRunnable(ftpClient, fileChangeEvent);
        this.currentListener.set(listenerFileChangeThread);
        new Thread(listenerFileChangeThread).start();
    }
}

ListenerFileChangeThreadRunnable

@Slf4j
public class ListenerFileChangeThreadRunnable implements ListenerChangeRunnable {

    private final FTPClient ftpClient;

    private volatile boolean stop;

    private final Map<String, Long> fileMemory;

    private final FileChangeEvent fileChangeEvent;

    public ListenerFileChangeThreadRunnable(FTPClient ftpClient, FileChangeEvent fileChangeEvent) {
        this.ftpClient = ftpClient;
        this.fileChangeEvent = fileChangeEvent;
        this.fileMemory = new HashMap<>();
    }

    @Override
    public void run() {
        while (!stop) {
            try {
                FTPFile[] ftpFiles = ftpClient.listFiles();

                //判斷文件被刪除
                if (fileMemory.size() > 0) {
                    Set<String> fileNames = new HashSet<>();
                    for (FTPFile ftpFile : ftpFiles) {
                        if (ftpFile.isDirectory()) {
                            log.info("文件夾不做刪除判斷");
                            continue;
                        }
                        fileNames.add(ftpFile.getName());
                    }
                    Set<Map.Entry<String, Long>> entries = fileMemory.entrySet();
                    for (Map.Entry<String, Long> map : entries) {
                        if (!fileNames.contains(map.getKey())) {
                            log.info("文件{}被刪除了", map.getKey());
                            FileChangeData fileChangeData = new FileChangeData();
                            fileChangeData.setEventType(FileChangeType.FILE_DELETED);
                            fileChangeData.setFileName(map.getKey());
                            fileChangeData.setFileSize(map.getValue());
                            fileMemory.remove(map.getKey());
                            entries.remove(map.getKey());
                            fileChangeEvent.change(fileChangeData);
                        }
                    }
                }
                //判斷文件是否有更改或新增
                for (FTPFile ftpFile: ftpFiles) {
                    //判斷是否為文件夾
                    if (ftpFile.isDirectory()) {
//                        log.info("{}為文件不進行監(jiān)聽操作", ftpFile.getName());
                        continue;
                    }
                    FileChangeData fileChangeData = new FileChangeData();
                    fileChangeData.setFileName(ftpFile.getName());
//                    fileChangeData.setFileName("D:\\ftptest\\aaa\\"+ftpFile.getName());
                    fileChangeData.setFileSize(ftpFile.getSize());
                    fileChangeData.setFtpFile(ftpFile);
                    //文件是否存在于緩存文件列表中
                    if (fileMemory.containsKey(ftpFile.getName())) {
//                        log.info("文件{}在內(nèi)存中已經(jīng)存在,進行大小判斷", ftpFile.getName());
                        if (!Objects.equals(fileMemory.get(ftpFile.getName()), ftpFile.getSize())) {
//                            log.info("文件{}在內(nèi)存中已經(jīng)存在且大小不一致,進行更新緩存操作", ftpFile.getName());
                            fileMemory.put(ftpFile.getName(), ftpFile.getSize());
                            fileChangeData.setEventType(FileChangeType.FILE_UPDATE);
                            fileChangeEvent.change(fileChangeData);
                        }
                        continue;
                    }
//                    log.info("文件{}在內(nèi)存中不存在進行緩存操作", ftpFile.getName());
                    fileMemory.put(ftpFile.getName(), ftpFile.getSize());
                    fileChangeData.setEventType(FileChangeType.FILE_ADD);
                    fileChangeEvent.change(fileChangeData);
                }
            } catch (Exception e) {
                continue;
                //throw new RuntimeException(e);
            }
            try {
                TimeUnit.SECONDS.sleep(20);
            } catch (InterruptedException e) {
                continue;
                //throw new RuntimeException(e);
            }
        }
    }

    @Override
    public boolean stopListener() {
        this.stop = Boolean.TRUE;
        this.fileMemory.clear();
        return this.stop;
    }
}

FileChangeType

public enum FileChangeType {
    FILE_UPDATE(0, "文件更新"),
    FILE_ADD(1, "文件添加"),
    FILE_DELETED(2, "文件刪除");

    @Getter
    private Integer type;

    @Getter
    private String desc;

    FileChangeType(Integer type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}

FTPConfig

@Data
@Configuration
public class FTPConfig {

    @Value("${ftp.ip:ftp的ip}")
    private String ftpIp;

    @Value("${ftp.port:ftp端口,默認21}")
    private Integer ftpPort;

    @Value("${ftp.username:ftp創(chuàng)建的用戶名}")
    private String username;

    @Value("${ftp.password:ftp創(chuàng)建的用戶名密碼}")
    private String password;
}

SendEmailApplicationTests

@Component
class SendEmailApplicationTests implements ApplicationRunner {
    @Autowired
    private FTPService ftpService;
    void ftpTest() {
        FTPClient ftpClient = ftpService.login();
        ftpService.addListenerFileChange(ftpFile -> {
            System.out.println(String.format("文件%s被改變了,文件改變類型%s", ftpFile.getFileName(), ftpFile.getEventType().getDesc()));
            InputStream inputStream = ftpClient.retrieveFileStream("/"+ ftpFile.getFileName());
            if(inputStream!=null){
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"GBK"));
                String s = null;
                List<String> listStr = new ArrayList<>();//讀取的數(shù)據(jù)在listStr
                while ((s = reader.readLine()) != null) {
                    System.out.println("===================>" + s);
                    listStr.add(s);
                }
                //處理業(yè)務(wù)邏輯
                
                inputStream.close();
                reader.close();
                ftpClient.completePendingCommand();
            }
        });
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ftpTest();
    }
}

到了這里,關(guān)于java通過FTP跨服務(wù)器動態(tài)監(jiān)聽讀取指定目錄下文件數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java從ftp服務(wù)器上傳與下載文件

    業(yè)務(wù)需要從ftp服務(wù)器上上傳、下載、刪除文件等功能,通過查閱資料及手動敲打代碼,實現(xiàn)了操作ftp的基本功能,有需求的小伙伴可以看看具體的實現(xiàn)過程。 摘自百度百科:文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP)是用于在 網(wǎng)絡(luò) 上進行文件傳輸?shù)囊惶讟?biāo)準(zhǔn)協(xié)議,F(xiàn)TP允許用戶以

    2024年02月07日
    瀏覽(34)
  • Java 兩臺服務(wù)器間使用FTP進行文件傳輸

    背景:需要把服務(wù)器A中的文件拷貝至服務(wù)器B中,要求使用FTP進行傳輸,當(dāng)文件傳輸未完成時文件是tmp格式的,傳輸完畢后顯示為原格式(此處是grib2)。

    2024年02月15日
    瀏覽(26)
  • JAVA使用SFTP和FTP兩種方式連接服務(wù)器

    FTP是一種文件傳輸協(xié)議,一般是為了方便數(shù)據(jù)共享的。包括一個FTP服務(wù)器和多個FTP客戶端。FTP客戶端通過FTP協(xié)議在服務(wù)器上下載資源。FTP客戶端通過FTP協(xié)議在服務(wù)器上下載資源。而一般要使用FTP需要在服務(wù)器上安裝FTP服務(wù)。 而SFTP協(xié)議是在FTP的基礎(chǔ)上對數(shù)據(jù)進行加密,使得傳

    2024年02月14日
    瀏覽(24)
  • CSV導(dǎo)出(通過讀取數(shù)據(jù)字節(jié)流直接上傳文件到服務(wù)器)

    CSV導(dǎo)出(通過讀取數(shù)據(jù)字節(jié)流直接上傳文件到服務(wù)器)

    文件之前讀取大多數(shù)都是用前端點擊相應(yīng)傳入后端,通過HttpServletResponse response得輸入輸出流進行導(dǎo)入導(dǎo)入導(dǎo)出數(shù)據(jù)。 近期碰到得需求是定時查詢數(shù)據(jù)庫數(shù)據(jù)并通過csv文件上傳至系統(tǒng)。所以不能使用HttpServletResponse,因為對應(yīng)文件流比較熟悉所以最開始使用文件流進行讀寫數(shù)據(jù)

    2024年02月12日
    瀏覽(22)
  • Python3通過串口服務(wù)器讀取設(shè)備Modbus數(shù)據(jù)【modbus_rtu_over_tcp】

    Python3通過串口服務(wù)器讀取設(shè)備Modbus數(shù)據(jù)【modbus_rtu_over_tcp】

    工業(yè)采集設(shè)備支持ModbusRtu 協(xié)議,通訊端口為232串口 或485接口,上位機連接采集終端,不方便走線【串口線 、485總線】,利用現(xiàn)有網(wǎng)絡(luò),通過串口服務(wù)器進行連接。 實現(xiàn)方案: 1、虛擬串口,上位機通過串口直接采集數(shù)據(jù), 缺點:需要安裝、開啟虛擬串口程序,增加不穩(wěn)定因

    2024年02月11日
    瀏覽(29)
  • Java實現(xiàn)讀取SFTP服務(wù)器指定目錄文件

    SFTP服務(wù)器的簡介 SFTP(SSH File Transfer Protocol)是一種在安全通道上傳輸文件的協(xié)議,它是基于SSH(Secure Shell)協(xié)議的擴展,用于在客戶端和服務(wù)器之間進行加密的文件傳輸。 SFTP 服務(wù)器的主要作用是提供一個安全的方式來上傳、下載和管理文件。以下是一些 SFTP 服務(wù)器的主要

    2024年02月03日
    瀏覽(22)
  • java讀取服務(wù)器數(shù)據(jù)包并下載至本地目錄

    java讀取服務(wù)器數(shù)據(jù)包并下載至本地目錄

    jsch包如果沒有的話,可評論聯(lián)系我,我私發(fā)給你,或者通過https://mvnrepository.com/artifact/com.jcraft/jsch/0.1.55進行下載,添加至工程目錄

    2024年02月09日
    瀏覽(26)
  • Ftp服務(wù)器、 Samba服務(wù)器、NFS服務(wù)器的區(qū)別

    Ftp服務(wù)器、 Samba服務(wù)器、NFS服務(wù)器的區(qū)別

    根據(jù)使用的方式來看,可以分為3種類別的文件服務(wù)器:ftp服務(wù)器(ftp/tftp)、 Samba服務(wù)器、NFS服務(wù)器。ftp的客戶可以是任意平臺,samba是專門針對windows客戶,而NFS則是面向linux/unix用戶的。下面是三種服務(wù)器的對比情況: 各個服務(wù)器的配置 NFS服務(wù)器: NFS是SUN Microsystem公司開發(fā)

    2024年02月03日
    瀏覽(26)
  • 【1000個GDB技巧之】如何在遠端服務(wù)器打開通過vscode動態(tài)觀測Linux內(nèi)核實戰(zhàn)篇?

    【1000個GDB技巧之】如何在遠端服務(wù)器打開通過vscode動態(tài)觀測Linux內(nèi)核實戰(zhàn)篇?

    (也可以直接在vscode中配置,忽略) 主要步驟:在~/.ssh/config中添加服務(wù)端的host,以便vscode的remote中能夠登錄 詳細配置過程參考兄弟篇文章:ssh config如何配置用host名替代root@1.1.1.1 初次使用remote功能,需要在遠端安裝一個ssh的代理,需要耗費一定時間。 添加一個調(diào)試配置文

    2024年04月16日
    瀏覽(20)
  • ubuntu服務(wù)器配置ftp服務(wù)

    ubuntu服務(wù)器配置ftp服務(wù)

    目錄 ?一、安裝vsftpd 二、配置vsftpd 三、設(shè)置安全組 四、客戶端測試 SFTP服務(wù)的配置看主頁的下一篇博客:ubuntu云服務(wù)器配置SFTP服務(wù)-CSDN博客 需求:配置ftp服務(wù)用于在windows電腦上直接瀏覽、下載、上傳ubuntu服務(wù)器上的文件,用于文件共享,方便實用 效果:用戶打開windows資源

    2024年02月13日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包