最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無(wú)法傳輸多個(gè)問(wèn)題

 更新時(shí)間:2024年08月12日 08:58:30   作者:客?卿  
這篇文章主要介紹了解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無(wú)法傳輸多個(gè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

被一個(gè)朋友問(wèn)到一個(gè)關(guān)于sokcet文件傳輸?shù)膯?wèn)題

他發(fā)現(xiàn)他寫(xiě)的代碼只能發(fā)送一次文件,沒(méi)辦法發(fā)送第二次,或者說(shuō)發(fā)送第二次的時(shí)候服務(wù)端就接收不到了。

部分代碼

  // 開(kāi)始接收文件
                    byte[] bytes = new byte[1024];
                    //byte[] bytes = new byte[dis.available()];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                    	 System.out.println(bytes.length);
                        fos.write(bytes, 0, length);
                        fos.flush();
                        
                        
                        
                    }
                    System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");

我給他調(diào)試的時(shí)候發(fā)現(xiàn)確確實(shí)實(shí)發(fā)送第一次文件后就就一直阻塞在while循環(huán)里了,出不來(lái)。

本來(lái)傳輸完第一次的文件后應(yīng)該有打印“======== 文件接收成功 [File。。。。。。”

這些信息,但是實(shí)際上沒(méi)有,而且也不報(bào)錯(cuò)。

調(diào)試的時(shí)候打斷點(diǎn)也是走著走著斷點(diǎn)就不見(jiàn)了,要說(shuō)他是阻塞也不像是阻塞,因?yàn)槿绻亲枞脑捚鸫a斷點(diǎn)是會(huì)存在的只是無(wú)法往下運(yùn)行了而已,但是他這個(gè)調(diào)試就是直接斷點(diǎn)就消失了,我也懵了。

后來(lái)查資料才發(fā)現(xiàn)原來(lái)只要客戶端的DataOutputStream不close掉,那么服務(wù)端的DataInputStream read就永遠(yuǎn)不等于-1。

即使文件的數(shù)據(jù)已經(jīng)傳完了,DataInputStream依舊會(huì)等著客戶端DataOutputStream再傳數(shù)據(jù)過(guò)來(lái)。

最后只能通過(guò)判斷文件的的大小來(lái)確認(rèn)文件是否已經(jīng)傳輸完成。

解決代碼代碼

  //dis就是DataInputStream
 String fileName = dis.readUTF();//文件名字
                    long fileLength = dis.readLong();//文件長(zhǎng)度
                    File directory = new File(savepath);
                    if(!directory.exists()) {
                        directory.mkdir();
                    }
                    File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
                    fos = new FileOutputStream(file);
                    // 開(kāi)始接收文件
                    byte[] bytes = new byte[1024];
                    //byte[] bytes = new byte[dis.available()];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                    	 System.out.println(bytes.length);
                    	 //fos就是FileOutputStream
                        fos.write(bytes, 0, length);
                        fos.flush();

                       //*************關(guān)鍵的一步**************//
                        if(fileLength == file.length()) break;
                        //***************************//
                    }
                    System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 完美解決Get和Post請(qǐng)求中文亂碼的問(wèn)題

    完美解決Get和Post請(qǐng)求中文亂碼的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決Get和Post請(qǐng)求中文亂碼的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • JavaWeb實(shí)戰(zhàn)之開(kāi)發(fā)網(wǎng)上購(gòu)物系統(tǒng)(超詳細(xì))

    JavaWeb實(shí)戰(zhàn)之開(kāi)發(fā)網(wǎng)上購(gòu)物系統(tǒng)(超詳細(xì))

    這篇文章主要介紹了JavaWeb實(shí)戰(zhàn)之開(kāi)發(fā)網(wǎng)上購(gòu)物系統(tǒng)(超詳細(xì)),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 基于JVM 中常見(jiàn)垃圾收集算法介紹

    基于JVM 中常見(jiàn)垃圾收集算法介紹

    下面小編就為大家分享一篇基于JVM 中常見(jiàn)垃圾收集算法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot注解@MapperScan的實(shí)現(xiàn)

    SpringBoot注解@MapperScan的實(shí)現(xiàn)

    @MapperScan是MyBatis和MyBatis-Plus提供的SpringBoot注解,用于自動(dòng)掃描并注冊(cè)?Mapper?接口,使其能夠被?Spring?容器管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • java使用poi生成excel的步驟

    java使用poi生成excel的步驟

    2010以上格式使用XSSFWorkBook對(duì)象, 2003格式使用HSSFWorkBook對(duì)象, 其他對(duì)象操作基本一樣,本文重點(diǎn)給大家介紹java使用poi生成excel的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-04-04
  • Java獲取漢字拼音的全拼和首拼實(shí)現(xiàn)代碼分享

    Java獲取漢字拼音的全拼和首拼實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了Java獲取漢字拼音的全拼和首拼實(shí)現(xiàn)代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Spring?Boot2?整合連接?Redis的操作方法

    Spring?Boot2?整合連接?Redis的操作方法

    在Spring?Boot中,通過(guò)RedisTemplate可以方便地對(duì)Redis進(jìn)行操作,包括設(shè)置和獲取數(shù)據(jù),文章詳細(xì)介紹了如何配置RedisTemplate,創(chuàng)建RedisConfig類進(jìn)行自定義配置,并通過(guò)Controller訪問(wèn)Redis數(shù)據(jù)庫(kù),感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot程序CPU飆升的排查指南

    SpringBoot程序CPU飆升的排查指南

    在生產(chǎn)環(huán)境里,大家或多或少都遇到過(guò)這種場(chǎng)景:某個(gè) Spring Boot 應(yīng)用突然 CPU 飆升,打滿服務(wù)器資源,監(jiān)控報(bào)警狂響,業(yè)務(wù)接口開(kāi)始超時(shí),登錄服務(wù)器,top一看,只能看到是 java 進(jìn)程在耗 CPU,所以本文給大家介紹了SpringBoot程序CPU飆升的排查指南,需要的朋友可以參考下
    2025-08-08
  • 使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問(wèn)題

    使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問(wèn)題

    這篇文章主要介紹了使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • spring boot系列之集成測(cè)試(推薦)

    spring boot系列之集成測(cè)試(推薦)

    這篇文章主要介紹了spring boot系列集成測(cè)試,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

濮阳县| 紫阳县| SHOW| 高密市| 海南省| 开封县| 武汉市| 林西县| 古浪县| 六枝特区| 长武县| 临江市| 油尖旺区| 东丽区| 梁河县| 彰武县| 湖北省| 罗甸县| 襄垣县| 大田县| 天柱县| 景泰县| 清流县| 咸丰县| 贵德县| 怀远县| 东明县| 桂东县| 三亚市| 达孜县| 黄冈市| 义马市| 玉环县| 浮山县| 南郑县| 通渭县| 岚皋县| 湘阴县| 驻马店市| 保山市| 铁岭县|