读者范围:

本文是一篇简短入门文章.本文假设读者对Java的IO系统和Java的网络系统有所了解.

正文:

关于文件传输的问题,实际也是一种IO读写的基本问题.对于网络而言也是一种IO读写问题.因此所谓网络的文件传输实际是两种IO问题的综合讨论.这里我们首先分析一个图示.然后围绕这个图示来讨论:

图1:

分析图1我们基本可以知道从服务器文件系统中通过流把文件中的数据写入到服务器的进程中,然后把进程中的数据通过网络IO系统传递到客户机,这个阶段,网络中的数据以字节流的形式保存.当该字节流被客户进程接受后,客户进程通过客户本地文件流写入客户本地的文件系统中.

根据以上分析,我们基本可以确定我所需要处理的问题了.首先我们需要可以对本地文件系统IO操作的操作接口,然后是一个可以对网络IO系统进行操作的操作接口,已经一个可以把数据包装成字节流的操作接口,他们分别可以提供客户和服务器两个进程进行读写的操作.如下图所示:

图2:

根据以上分析,我们可以把问题归结到对以下编程接口的需求上:

1. 字节包装器和字节解包器,

2. 网络传输器和网络接收器

3. 本地文件读/写器

而这些Java本身的API就已经提供.他们都被包装到java.io和java.net这两个包里,这里我提供一个基于TCP/IP的实现版本,使用基于连接的方式来完成工作.我们首先介绍几个相关的JDK中的类来完成以上任务,

1. DataOutputStream和DataInputStream实现类提供了上面的字节包装和解包器的实现

2. ServerSocket和Socekt提供了基于连接的网络传输和接受接口

3. File,FileInputStream和FileOutputStream提供了基本的本地文件输入输出接口.

服务器端实现代码:

import java.io.*;

import java.net.*;

public class FileServer{

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

//创建文件流用来读取文件中的数据

File file=new File("lishengjie.jpg");

FileInputStream fos=new FileInputStream(file);

//创建网络服务器接受客户请求

ServerSocket ss=new ServerSocket(3108);

Socket client=ss.accept();

//创建网络输出流并提供数据包装器

OutputStream netOut=client.getOutputStream();

OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));

//创建文件读取缓冲区

byte[] buf=new byte[2048];

int num=fos.read(buf);

while(num!=(-1)){//是否读完文件

doc.write(buf,0,num);//把文件数据写出网络缓冲区

doc.flush();//刷新缓冲区把数据写往客户端

num=fos.read(buf);//继续从文件中读取数据

}

fos.close();

doc.close();

}

}

客户方实现代码:

import java.io.*;

import java.net.*;

public class FileClient{

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

//使用本地文件系统接受网络数据并存为新文件

File file=new File("newFile.jpg");

file.createNewFile();

RandomAccessFile raf=new RandomAccessFile(file,"rw");

// 通过Socket连接文件服务器

Socket server=new Socket(InetAddress.getLocalHost(),3108);

//创建网络接受流接受服务器文件数据

InputStream netIn=server.getInputStream();

InputStream in=new DataInputStream(new BufferedInputStream(netIn));

//创建缓冲区缓冲网络数据

byte[] buf=new byte[2048];

int num=in.read(buf);

while(num!=(-1)){//是否读完所有数据

raf.write(buf,0,num);//将数据写往文件

raf.skipBytes(num);//顺序写文件字节

num=in.read(buf);//继续从网络中读取文件

}

in.close();

raf.close();

}

}

归结以上代码:

服务器

客户端

1. 服务器从本地文件系统读取文件

2. 服务器创建网络服务连接

3. 服务器提供数据包装器

4. 服务器将本地文件写入数据包装器

5. 服务器通过包装器写入到网络

1. 客户端建立新文件准备存储来自网络的数据

2. 客户端连接服务器

3. 客户端通过网络接受服务器数据并进行数据解包

4. 客户端将数据写入缓冲区

5. 客户端从缓冲区把数据写入客户本地文件

总结:

事实上java的开发环境为我们提供大多数的编程接口,为我们简化了开发工作量.我们通过java的IO接口所提供的文件,数据包装器等接口非常方便的解决了我们上面的开发工作量.同时在java的net接口所提供的套接字也使得基于连接的数据接受和发送成为非常容易的工作.

java file 网络文件_Java 网络文件传输相关推荐

  1. java file数组 初始化_java从文件中读取数据并赋值给数组

    从txt文件中读取数据赋值给一维数组 字节流读入字节数组中 字节数组转化为字符串 字符创解析为字符串数组 字符串数组转化为数值,并赋值为数组 文本文件是以字节的形式储存的. 在txt文件中一个数字或者 ...

  2. java file取不到linux文件_Java中高级核心知识全面解析——Linux基本命令(切换、增删改查、压缩文件、权限命令)...

    一.目录切换命令 cd usr: 切换到该目录下usr目录 cd ..(或cd../): 切换到上一层目录 cd /: 切换到系统根目录 cd ~: 切换到用户主目录 cd -: 切换到上一个操作所在 ...

  3. java 协议这个概念_java网络协议概念是什么?

    网络协议 对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念.那么什么是网络协议呢? 网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协 ...

  4. java实现套接字网络编程_Java网络编程(一)Socket套接字

    一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...

  5. java 把文件打包成zip文件_java将文件或是文件夹打包压缩成zip格式

    导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.BufferedInputStream; impo ...

  6. java中实现选择文件_Java 实现文件选择对话框及功能

    时间:2018-10-02 概述:文件选择器 Java实现文件选择器,就是大家熟悉的打开文件.选择文件的对话框,本例子分为两部分来进行,一个部分是选择器对话框构建部分,另一部分是文件过滤部分,用于过滤 ...

  7. java上传网络图片_java网络编程之图片上传

    输入输出流核心代码 所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中. InputStream in =输入源; OutputStream os=输出目 ...

  8. java io删除文件_java IO 文件操作方法总结

    java IO 文件操作方法总结 对于输入输出的理解: 输入输出,以程序为参考点,外部数据进入程序,通过输入流完成.程序将数据给外部设备,通过输出流完成. 文件Io的操作 //获取文件 File fi ...

  9. java中上传文件_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

最新文章

  1. iphone,ipad,关于icon图标的那些事
  2. 2021fall Broadway Tech校招
  3. python调用oracle数据库_python操作oracle数据库
  4. 一个95分位延迟要求5ms的场景,如何做性能优化
  5. DijKstra算法普通+堆优化链式向前星
  6. HP服务器ile进系统,HP GEN10服务器UEFI安装Windows Sverver 2012 R2教程
  7. Asterisk入门系列
  8. Elasticsearch7.15.2 安装、部署(linux环境)
  9. 信息学奥赛C++语言: 第n小的质数
  10. WinForms C# :TabWebBrowser 多页面浏览器源码
  11. 非root安装php nginx,非root用户安装nginx
  12. Ubuntu常用软件大全
  13. morning 是字符串的内容变成good_小洁详解《R数据科学》--第十章 使用stringr处理字符串(上)...
  14. 将已有的文件夹添加到git
  15. 常用文件的mime和mimetype的对应关系
  16. 厦大C语言上机 1394 抛硬币
  17. 计算2个GPS坐标的距离
  18. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx
  19. iOS App Store 上传项目报 隐私政策网址(URL)!~解决方法
  20. C++ 获取时间戳:下周一、月初、月中、月末

热门文章

  1. 怎么写出高质量软文?软文写作攻略知多少
  2. mysql查询数据库所有表名字
  3. maven-replacer-plugin 静态资源版本号解决方案(css/js等)
  4. 2023中国(江西)国际火锅食材展览会暨火锅产业大会
  5. SecureCRT6.1 注册码
  6. ASP.NET-解决GridView控件某字段设置只读后,更新后该字段值为Null
  7. Window Server 2012 R2搭建AD域
  8. 那些曾刷爆朋友圈的APP,你以为全都死了?
  9. Android服务之信使
  10. 手机号,身份证号,邮政编码,统一信用代码,发票抬头,纳税人识别号正则校验