线程类

服务器端要用到线程,每次有文件上传都要用到这个类,所以最好将这个类抽离出来专门处理文件上传业务的线程类。

相关代码如下:

//处理文件上传业务的线程类
public class ServerThread implements Runnable{private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}//负责获取客户端传递文件的数据,同时将数据写入到本地的某个文件中@Overridepublic void run() {//获取客户端对应的ip地址String ip=socket.getInetAddress().getHostAddress();//创建一个用于计数文件上传次数的变量int count=1;try {//获取输入流对象InputStream in=socket.getInputStream();//文件对象File parentFile=new File("E:/upload/");//如果文件夹目录不存在自动创建此文件夹if(!parentFile.exists()){parentFile.mkdir();//创建此文件夹}//创建一个具体的File对象,将来存储客户端传递的数据,写入到此File中//在父目录的文件夹下会生成以ip开头的文件File file=new File(parentFile,ip+"("+count+").jpg");if(file.exists()){//如果该文件已存在,则让count先自增后加创建file=new File(parentFile,ip+"("+ ++count +").jpg");}//获取输入流中的数据,然后将数据写入到File对象中FileOutputStream fos = new FileOutputStream(file);//客户端传递过来的数据也要进行读写操作byte[] buf=new byte[1024];//定义一个读取的长度int len=0;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}//如果文件上传完成,则提示客户  文件上传成功!OutputStream out = socket.getOutputStream();out.write("上传成功".getBytes());//关流fos.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

文件操作的服务端

每发现有客户端来连接,直接启动一个线程来和服务端通信

//文件上传操作的服务端
public class FileServer {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket serverSocket=new ServerSocket(10001);//accept()对象while(true){//此时这个socket包含了客户端所有的信息Socket socket= serverSocket.accept();//创建对应的线程,独立处理与客户端的通信ServerThread serverThread=new ServerThread(socket);//启动当前的线程来处理和客户端对应的通信new Thread(serverThread).start();}}
}

客户端

//文件上传操作的客户端类
public class FileClient {public static void main(String[] args) throws IOException {System.out.print("请输入上传问件对应的路径");Scanner input=new Scanner(System.in);// 加入客户端输入 D:/work/1.jpgString upload=input.nextLine();//Socket要连接的服务器ip地址和端口号Socket socket=new Socket("localhost",10001);//获取Socket的输出流对象OutputStream out = socket.getOutputStream();//判断upload是否真实存在if(!upload.isEmpty()){//文件不为空FileInputStream fis=new FileInputStream(upload);//定义一个字节数组byte[] buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){//将buf中的数据转移到out中out.write(buf,0,len);}//注意:当客户端输出数据完毕后,一定要进行关闭/*shutdown方法关流只是对当前socket持有的output流关掉,不会影响后续socket调其他流close会关掉所有与该对象相关的流*/socket.shutdownOutput();//处理服务端响应回来的数据(上传成功!)InputStream in = socket.getInputStream();byte[] msg=new byte[1024];//调用read()int num=in.read(msg);//字节数组转化成字符串进行输出String str=new String(msg,0,num);System.out.println(str);fis.close();socket.close();}}
}

这样我们就可以完成一个文件的传输啦!

JavaIO流实现文件传输相关推荐

  1. Java------IO流之文件专属流

    文件专属流 文章目录 文件专属流 FileInputStream流 FileInputStream初步读取 FileInputStream循环读 IDEA默认当前路径 往byte数组中读 最终版Fil ...

  2. java-IO流-在文件中数据内容的插入问题

    1问题 在某个文件的中间某个位置插入字符串,例如: 文件内容:abcd 插入内容:123 插入下标:2 预期结果:ab123cd 2基本思路 1.校验参数的合法性 2.将指针移动到插入的位置 3.通过 ...

  3. java-IO流-将文件夹以树形结构打印(打印文件夹目录)问题

    问题 将一个文件夹下的文件(包括目录)以树形结构打印出来,等级目录要有标识 基本思路 1.参数合法性校验 2.如果是文件  当前属于第几层打印层级表示和文件名 3.如果是目录的   进入目录 当前是第 ...

  4. JavaIO流之文件路径

    斜杠和反斜杠 正斜杠,又称左斜杠,符号是"/": 反斜杠,也称右斜杠,符号是"\". 在Unix/Linux中,路径的分隔采用正斜"/",比 ...

  5. javaIO流之转换流

    目录 简介 一.编码和解码 二.字符集 2.1ASCII 字符集 2.2Unicode 字符集 2.3GBK 字符集 三.乱码 四.InputStreamReader 4.1构造方法 4.2解决编码问 ...

  6. php接收流文件,PHP传输文件流及文件流的保存

    什么是文件流 在HTTP数据传送过程中,传输一方直接以二进制流方式传送文件内容,这样就形成了一个文件流: 文件流的接收通常涉及到预定义变量函数 $HTTP_RAW_POST_DATA 和 file_g ...

  7. 文件传输基础——Java IO流

    一.文件的编码 1 package com.study.io; 2 3 4 /** 5 * 测试文件编码 6 */ 7 public class EncodeDemo { 8 9 /** 10 * @ ...

  8. java io flush_《文件传输基础——Java IO流》,对其中flush方法的思考

    在学习了<文件传输基础--Java IO流> 课程后,发现自己对flush()方法的调用有很多疑惑.在查询资料和自己看源码以及动手试验之后发现有以下几个特点.如有误也请大家指正出来,一切为 ...

  9. Java从入门到精通十一(javaIO流)

    Java从入门到精通十一(javaIO流) IO引入 字节流和字符流(一些说明) 字节流没有用到缓冲区并不是没有用到内存 为什么输入流是读数据,而输出流是写数据? 字节流说明 字节输入流读数据的方法 ...

  10. 【JavaIO流】JavaIO中的常用处理流

    JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...

最新文章

  1. VC嵌入断点中断INT3
  2. 视频智能去水印:从数学建模到工程实现
  3. 前端学习(3289):react hook state-hook
  4. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
  5. 计算机辅助设计cad综述,控制系统计算机辅助设计综述
  6. 从源码分析非线程安全集合类的不安全迭代器
  7. SQL Server2008 错误源:.net SqlClient data provider的解决方法
  8. 如何使用电力电子仿真软件Plecs写程序脚本?(欢迎交流学习)
  9. pythonudp通信程序_python中UDP编程实现通信
  10. 达摩院发布:2022年十大科技趋势
  11. 【控制理论】矩阵求逆引理推导及理解
  12. 康佳电视手机遥控器android版,康佳电视遥控器
  13. pythonexcel源码_Python对Excel操作详解_Python教程
  14. 百度没有文化(转载)
  15. OpenStack实践(十一):Instance Live Migrate and Evacuate
  16. 双胺基修饰MOF/GO烯复合材料|硫修饰Cu基MOF材料|磁性纳米多孔碳材料FeO@C|mof材料的复杂定制
  17. webrtc 支持h264 思路
  18. 使用POI创建Excel无法打开
  19. vue项目中gojs最新V2.2.5版本去除水印
  20. Design and Implementation of a Highly Efficient DGEMM for 64-bit ARMv8 Multi-Core Processors

热门文章

  1. 微型计算机原理考试试卷,微机原理与应用试题库(附答案)
  2. Python|LeetCode习题答案汇总
  3. 近场动力学python_科学网—近动力学最新上线的文章快报:2018年7月 - 韩非的博文...
  4. 计算机论文要多少字,期刊论文一般多少字
  5. 【学习笔记】TRIZ 40个创新原理及解析
  6. SLAB内存泄露分析实践
  7. word计算机课实验报告,Word 文字处理实验报告
  8. CAD软件中如何自定义CAD填充图案?
  9. 智能毫米波雷达人体感应器,实时检测静止存在,智能化控制方案
  10. Servlet 运行工作原理详解