簡體   English   中英

從 InputStream 獲取大小的最低影響方法

[英]Lowest impact method of getting size from InputStream

我正在嘗試獲取 InputStream 的大小以用作與文件傳輸的比較,以確保傳輸所有文件數據。 我正在使用 Jcraft 的 ChannelSftp 和 SftpProgressMonitor,但是SftpProgressMonitor.init()沒有為 InputStreams 提供max ,所以我想在內部找到它。

在系統的這一點上,我知道 InputStream 不會被進一步寫入,我無法輕松訪問原始文件以讀取該大小,並且我已經看到許多其他讀取到字節數組的實現或字節數組輸出流。 如果我想為實際的 SFTP 調用維護 InputStream,哪種方法對系統的整體影響最小? 正在寫入的文件可能非常大(超過 1 GB),因此簡單的實現可能會產生重大影響。

在使用 JSch API 的上下文中,在調用 ChannelSftp.get() 之前,您可以調用ChannelSftp.lstat()

這將返回一個SftpATTRS 對象,其中包含一個 .getSize() 方法,該方法返回文件的大小(以字節為單位)。 這應該告訴您需要多少字節才能檢索整個文件。

請記住,如果您獲取的文件的大小經常變化,那么獲取文件大小和開始文件傳輸之間可能存在競爭條件。 因此,如果您只是將其用作進度指示器,則此方法應該沒問題,但如果您正在分配靜態緩沖區或類似的東西,您可能需要重新考慮您的方法。

基於@Michael 的建議

這是我們在 kotlin 中可以做的事情

        val session: Session = getSession() // Jsch Session
        session.connect()

        val channel = session.openChannel("sftp") as ChannelSftp
        channel.connect()

        val contentSize: Long = channel.lstat("/upload/some_file.csv").size

        val inputStream = channel.get("/upload/some_file.csv")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM