我有一个FileServer和一个FileClient,服务器在客户端连接时发送文件.这是一个简单的程序,只是为了理解背后的概念.

我能够将文件从Server发送到Client,缓冲区为1024.

问题是收到的文件总是比原始文件少大约0.01 MB.因此mp3文件丢失了一些信息,视频文件就无法播放.

我在服务器和放大器的while循环中放了一些prinln语句.客户.我发现我的服务器没有发送整个文件.

//Server

byte [] mybytearray = new byte [1024];

FileInputStream fis = new FileInputStream(myFile);

BufferedInputStream bis = new BufferedInputStream(fis);

bis.read(mybytearray,0,mybytearray.length);

OutputStream os = sock.getOutputStream();

System.out.println("Sending...\n mybytearray length:"+mybytearray.length+"file length:"+(int)myFile.length());

int read, readTotal=0;

while ((read = fis.read(mybytearray,0,mybytearray.length)) != -1) {

os.write(mybytearray, 0, read);

System.out.println("File REad:"+read+"readtotal:"+readTotal); //*

readTotal += read;

}

System.out.println("Final File Read:"+read+" Final readtotal:"+readTotal);

os.flush();

sock.close();

}

Println语句输出为:

Sending...

mybytearray length:1024file length:12767554

File REad:1024readtotal:0

File REad:1024readtotal:1024

.............and a lot of it...and then

File REad:1024readtotal:12756992

File REad:1024readtotal:12758016

File REad:322readtotal:12759040

Final File Read:-1 Final readtotal:12759362

文件长度:12767554&最后阅读总数:12759362 shud相等.我不明白为什么最后一个读数值较低[322],而它仍然可以有1024.

任何形式的帮助都值得赞赏.

谢谢.

[编辑]

//Client

int read;

int totalRead = 0;

while ((read = is.read(mybytearray,0,mybytearray.length)) != -1) {

bos.write(mybytearray, 0 , read);

totalRead += read;

System.out.println("\nread:"+read+"\ntotalread: "+totalRead);

}

System.out.println("Final File Read:"+read+" Final readtotal:"+totalRead);

bos.write(mybytearray, 0 , read); //57 Line in FileClient.java

bos.flush();

我再次尝试发送文件.这次是一个txt.

这是我服务器的输出

Sending...

mybytearray length:1024file length:1232

File REad:1024readtotal:0

File REad:208readtotal:1024

Final File Read:-1 Final readtotal:1232

这个客户端

read:208

totalread: 1232

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException

Final File Read:-1 Final readtotal:1232

at java.lang.System.arraycopy(Native Method)

at java.io.BufferedOutputStream.write(Unknown Source)

at FileClient.main(FileClient.java:57)

readtotal值是相同的,但有时我得到这个错误,有时我没有.

[大编辑 – 完整的客户代码]

public class FileClient{

public static void main (String [] args ) throws IOException {

long start = System.currentTimeMillis();

int bytesRead;

int current = 0;

final JFrame f = new JFrame("Sample");

f.getContentPane().setLayout(new FlowLayout());

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setSize(590,490);

f.setVisible(true);

// localhost for testing

Socket sock = new Socket("localhost",13267);

System.out.println("Connecting...");

File f1=new File(RecieveObject(sock));

// receive file

byte [] mybytearray = new byte [1024];

InputStream is = sock.getInputStream();

FileOutputStream fos = new FileOutputStream(f1);

ProgressMonitorInputStream nn= new ProgressMonitorInputStream(f,"reading",is);

BufferedOutputStream bos = new BufferedOutputStream(fos);

/* bytesRead = is.read(mybytearray,0,mybytearray.length);

current = bytesRead;

do {

bytesRead =

is.read(mybytearray, current, (mybytearray.length-current));

System.out.println("mybytesarray length: "+mybytearray.length+"\ncurrent:"+current+"\nbytesread: "+bytesRead);

if(bytesRead >= 0) current += bytesRead;

} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);

bos.flush();

*/

int read;

int totalRead = 0;

//InputStream clientInputStream = clientSocket.getInputStream();

while ((read = is.read(mybytearray,0,mybytearray.length)) != -1) {

bos.write(mybytearray, 0 , read);

totalRead += read;

System.out.println("\nread:"+read+"\ntotalread: "+totalRead);

}

System.out.println("Final File Read:"+read+" Final readtotal:"+totalRead);

// bos.write(mybytearray, 0 , read);

bos.flush();

long end = System.currentTimeMillis();

System.out.println(end-start);

bos.close();

sock.close();

}

public static String RecieveObject(Socket s) {

String str = null;

try{

ObjectInputStream is = new ObjectInputStream(s.getInputStream());

str =(String)is.readUTF();

}

catch(IOException ex){}

return str;

}

}

java写入txt数据丢失_文件传输中的数据丢失 – JAVA?相关推荐

  1. java swt 画按钮_向表中添加按钮(java swt)

    我正在尝试复制类似于此的UI: 我一直在关注如何创建表格每列中的按钮的作者说明(没有成功).我的项目与他的区别在于我正在尝试使用Tree而不是Table,而我正在使用eclipse TreeViewe ...

  2. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  3. 文件服务器恢复测试,基于文件传输中文件损坏检测和恢复办法.doc

    基于文件传输中文件损坏检测和恢复办法 基于文件传输中文件损坏检测和恢复办法 摘 要:在网络上文件传输是一种常见的应用,讨论在文件传输完成后检测错误和恢复数据的办法. 关键词:文件传输;文件校验;恢复 ...

  4. 使用ADB Pull文件传输中卡住的解决方法

    使用ADB Pull文件传输中卡住的解决方法 原因分析: 尝试的方法 最终解决方法 优化方法 原因分析: 硬件:PCIE转USB3.0(无供电),PC到手机延长线15M. 使用同一ADB.exe程序在 ...

  5. 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行

    标题使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1.在电脑桌面使用快捷键win+r打开 2.打开cmd命令界面之后使用md d ...

  6. 如何把一个java程序打包成exe文件,运行在没有java虚

    如何把一个java程序打包成exe文件,运行在没有java虚 核心提示:首先,将编译好的程序打包成jar文件,然后做出exe,这样代码就不可见了:但是exe文件在没有安装jre的电脑上不能运行,如果要 ...

  7. Java写入txt文件内容

    Java写入数据进txt文件,需求:多条数据追加进文件,且需要处理中文编码问题. 以下代码只能处理向文件添加数据的功能,但是会覆盖掉之前的数据 import java.io.File; import ...

  8. java 实现文件秒传_文件传输和秒传

    InetAddress类: InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作.例如获取域名或主机名.上网ip等等.这 ...

  9. java io字符输出流_灵魂一击!详解Java中的IO输入输出流

    什么是流?流表示任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象,它屏蔽了实际的I/O设备中处理数据的细节. IO流是实现输入输出的基础,它可以很方便地实现数据的输入输出操作,即读写操作 ...

最新文章

  1. tensorflow入门(二)
  2. 浏览器tab关闭事件_翻译|揭示现代浏览器原理(2):网页访问 — Chrome官方
  3. python模块-paramiko-修改源码(demo实例)
  4. APT 信息收集——shodan.io ,fofa.so、 MX 及 邮件。mx记录查询。censys.io查询子域名。...
  5. boost::allocator_void_pointer
  6. 综合学生信息管理系统(JSP+JDBC)
  7. python读取多个文件夹中的音频文件_Python3.7 读取音频根据文件名生成脚本的代码...
  8. srsLTE源码学习:S1接口抓包s1ap_pcap.h,s1ap_pcap.cc
  9. linux裸设备大小,SUSE Linux 十 配置裸设备(raw devices)
  10. 计算机网络技术期中,计算机网络技术基础期中试卷
  11. 一步一步打造基于TICK的工业级系统监控平台
  12. 上周热点回顾(10.15-10.21)
  13. python123.io在线编程,详解Python IO编程
  14. 莫烦python进化算法_使用遗传算法解决TSP问题(莫烦python 学习笔记)
  15. Error: could not open `C:\Program Files\Java\jre6\lib\amd64\jvm.cfg' 解决办法
  16. java中between and什么意思,关于 oracle between and的用法!
  17. oracle怎么确定安装成功,怎么判断oracle是否安装成功
  18. Android 仿微信录制短视频(不使用 FFmpeg)
  19. MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket
  20. 百胜软件黄飞:携手阿里云,用双中台驱动新零售...

热门文章

  1. 虚拟机运行win11以及安装apk
  2. 信息系统项目管理师论文-项目整体管理
  3. 中国oracle ocm,【Oracle 10g OCM 巅峰之战】
  4. Omi NTFS磁盘专家 for Mac - Mac磁盘读写工具
  5. TeamViewer 替代品:使用 frp 实现 Windows 远程桌面连接教程
  6. EasyExcel导出多个sheet
  7. 完全彻底手动卸载MSSQL2005数据库
  8. nvidia-rapids︱cuML机器学习加速库
  9. white-space: nowrap;
  10. 以图识图——基于内容的图片检索CBIR(Content Based Image Retrieval)