socket从客户端向主机传输一个文件

client

FileInputStream 是 Java 中用于从文件中读取字节流的类,它属于字节流的一部分。它主要用于读取原始的字节数据,例如图像、音频、文本文件等。FileInputStream 继承自 InputStream 类。

//将需要读取的文件变成可输出的流FileInputStream fileInputStream=new FileInputStream("text.txt");

使用 FileInputStream 时,您可以使用 read 方法逐个字节地读取文件内容,或使用 read(byte[] b) 方法一次读取多个字节到字节数组中。

首先,将需要读取的文件放入一个输入流a中,然后我们创建一个数组b,将输入流a中的数据写入数组b,然后创建输出流c,用输出流c输出数组b(也就是输出a)

public class Client {public static void main(String[] args) {try(Socket socket=new Socket("localhost",8080)){//将需要读取的文件变成可输出的流FileInputStream fileInputStream=new FileInputStream("text.txt");//把socket的输出流和io的输出流绑定,使得io操作更方便OutputStream stream=socket.getOutputStream();//从需要读取的文件读取内容后,需要暂时存放在这个数组里byte[] bytes=new byte[1024];int i;//将需要读取的文件的可输出流写入数组,i表示写入的数据数量,当i==-1的时候表示什么都没有读取到while((i=fileInputStream.read(bytes))!=-1){//从数组里读取内容,写入io输出流中(也就是写入了socket的输出流)//0表示从0开始读取//i表示一次读取i位stream.write(bytes,0,1);}stream.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

当然,我们也可以省略中间的那个数组b ,将需要发送的文件转化为输入流a后,直接发送给输出流c:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8080);FileInputStream fileInputStream = new FileInputStream("text.txt");OutputStream outputStream = socket.getOutputStream()) {// 使用 transferTo 将文件内容直接传输到输出流long bytesTransferred = fileInputStream.transferTo(outputStream);// 刷新输出流,确保所有数据都被发送到服务器outputStream.flush();System.out.println("Transferred " + bytesTransferred + " bytes.");} catch (IOException e) {throw new RuntimeException(e);}}
}

使用 transferTo 有几个优点:

  1. 简化代码: 不需要手动创建缓冲区或字节数组,简化了代码结构。

  2. 性能优化: transferTo 方法的实现可能会利用底层系统的优化,例如零拷贝(zero-copy)技术,提高了大数据传输的性能。

server

 这里使用了transferTo方法

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String args[]) {try (ServerSocket server = new ServerSocket(8080)) {// 等待客户端连接Socket socket = server.accept();// 获取与客户端连接的输入流InputStream inStream = socket.getInputStream();// 创建输出流,用于写入接收到的数据到本地文件try (FileOutputStream outStream = new FileOutputStream("C:\\Users\\86136\\projects\\IdeaProjects\\javaWeb\\src\\socket2文件传输\\text2.txt")) {// 使用 transferTo 方法直接从输入流传输数据到输出流inStream.transferTo(outStream);} catch (IOException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}
}

I/O4

FileOutputStreamOutputStreamWriter 是 Java 中用于处理文件输出的两个不同的类。它们之间的主要区别在于处理的数据类型和提供的功能。以下是它们的一些主要区别:

1. FileOutputStream:

  • 数据类型: FileOutputStream 是字节流,用于写入字节数据。
  • 功能: 它提供了直接将字节写入文件的能力,适用于处理二进制数据,如图像、音频等。
  • 编码: 不关心字符编码,它操作的是字节而不是字符。

所以在这里,我们的client不仅仅可以传输txt文件,任何类型的文件都可以传输,只要server接受这个文件时,存储方式不发生变化就行。比如传.class文件,接受时也是.class文件。

可以实现这种传输的原因是 FileOutputStream 是字节流,对于这段字节,只要你编码的方式(txt按txt文件编码格式读取,class按class文件编码格式读取)是一样的,就永远可以读出正确的内容。

2. OutputStreamWriter:

  • 数据类型: OutputStreamWriter 是字符流,用于写入字符数据。
  • 功能: 它是字节流到字符流的桥梁,将字节转换为字符并将字符写入文件。提供了字符编码的支持。
  • 编码: 可以指定字符编码,适用于处理文本数据,支持字符集的设置,例如UTF-8、ISO-8859-1等。

而对于字符,如果编码格式不一样,可能会出现乱码。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT应用篇:QT解析与生成XML文件的四种方式

四种常见的解析 XML 的方式(DOM、SAX、以及基于 Qt 的 XmlStreamReader)各有自己的优缺点,适合不同的应用场景。 DOM 适合小型且结构简单的 XML 文件,需要频繁修改和操作整个文档结构的情况。SAX 适合大型 XML 文件,以及只需读取不需要修改的情况。基于 Qt 的 XmlStreamRe…

12V 全桥驱动芯片GC9008——可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片,为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM(IN1/IN2)输入接口,与行业标准器件兼容.是 SOP8封装,GC9008D是DIP封装芯片特点 ● H 桥电机驱…

使用 CompletableFuture 分批处理任务

一、无返回值任务函数 // 数据分批 List<List<StatisticsDTO>> batches Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures new ArrayList<>(batches.size());// 数据处理 for (int i 0; i < batches…

Pytorch 反向传播 计算图被修改的报错

先看看报错的内容 RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [5, 1]], which is output 0 of AsStridedBackward0, is at version 2; expected version 1 instead. Hint: enable an…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

4.6 BOUNDARY CHECKS

我们现在扩展了tile矩阵乘法内核&#xff0c;以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵&#xff0c;图4.18创建了矩阵的宽度为3&#xff0c;不是tile宽度&#xff08;2&#xff09;的倍数。图4.…

Spring事务控制

1.事务介绍 1.1什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执…

window mysql5.7 搭建主从同步环境

window 搭建mysql5.7数据库 主从同步 主节点 配置文件my3308.cnf [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4[mysqld] server-id8 #server-uuidbc701be9-ac71-11ee-9e35-b06ebf511956 log-binD:\mysql_5.7.19\mysql-5.7.19-winx64\mysql-bin binlog-…

如何在 Umi /Umi 4.0 中配置自动删除 console.log 语句?

背景&#xff0c;开发时需要console.log 日志&#xff0c;再生产、uat 、sit不想看到日志打印信息 方案1、代码规范eslint校验"no-console": true, //console.log 方案2、bable 插件 babel-plugin-transform-remove-console 配置在.umirx.ts/js中 export default…

一篇文章足以让你掌握蓝牙协议栈基本架构(蓝牙核心文档、HCI架构解读等)

目录 1. 蓝牙核心文档介绍 1.1 架构 1.2 BR/EDR 控制器 1.3 主机 1.4 主机控制器接口

【笔记】用Python做手机多平台UI应用

最近一直在找一个简单的基于Python的多平台UI实现&#xff0c;特别是希望能比较好地支持手机端。 总结一下标准是&#xff1a; Python&#xff0c;最好能支持Numpy、Pandas等库无缝集成简单&#xff0c;不要考虑过多的实现细节&#xff0c;如html、css、qt等多端支持&#xff…

性能分析与调优: Linux 内存观测工具

目录 一、实验 1.环境 2.vmstat 3.PSI 4.swapon 5.sar 6.slabtop 7.numstat 8.ps 9.top 10.pmap 11.perf 12.bpftrace 二、问题 1.接口读写报错 2.slabtop如何安装 3.numactl如何安装 4.numad启动服务与关闭NUMA 5. perf如何安装 6. kernel-lt-doc与kern…

go-carbon v2.3.4 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

Vue3+Vite打包跨平台(七牛、阿里OSS)上传部署前端项目

1、业务场景 阅读之前&#xff0c;想了解一下各位观众老爷们&#xff0c;你们公司的项目是怎么部署的&#xff1a; 1.本地打包手动上传服务器&#xff1b; 2.本地打包自动上传服务器&#xff1b; 3.代码仓库流水线自动构建&#xff1b; 4.其他…&#xff1b; 我们用的第3种部…

EasyExcel 不使用科学计数发并以千分位展示

EasyExcel 不使用科学计数发并以千分位展示 不使用科学计数法 不使用科学计数法 BigDecimalStringConverter 将 BigDecimal 类型的数值转换为字符串类型&#xff0c;并将其导出到 Excel 文件中。在 convertToExcelData 方法中&#xff0c;我们将 BigDecimal 转换为字符串&…

线程|死锁条件及实现

死锁&#xff08;Deadlock&#xff09;是指两个或多个进程在执行过程中因争夺资源而造成的一种互相等待的现象 死锁通常发生在多任务系统中&#xff0c;其中进程通过竞争有限的资源来完成任务 死锁通常涉及互斥、持有和等待三个条件。 死锁的原因 互斥条件&#xff08;Mutual…

前端中什么是DOM对象

DOM&#xff08;文档对象模型&#xff09;是一种编程接口&#xff0c;用于HTML和XML文档。它提供了一种将文档结构表示为树结构的方式&#xff0c;这使得程序和脚本能够动态地访问和更新文档的内容、结构和样式。 在前端开发中&#xff0c;DOM是非常重要的概念。当浏览器加载网…

认知能力测验,⑥如何破解逻辑判断类测试题?

逻辑思维&#xff0c;是一个比较大的范围&#xff0c;在绝大多数的招聘中&#xff0c;认知能力测评形式多样&#xff0c;难度也较大&#xff0c;其中逻辑判断题型所涉及到的分类为&#xff1a;概念类、条件类、矛盾类、数字类、图形类等知识。比如奥数就是个好东西.....如果经历…

Go语言日志美化库,slog使用指南

Go语言日志美化库&#xff0c;slog使用指南 1.slog2.快速开始3.使用JSON格式4.Text格式化formatter 1.slog slog是Go 实现的一个易于使用的&#xff0c;易扩展、可配置的日志库 slog - github 控制台效果&#xff1a; 安装方式&#xff1a; go get github.com/gookit/slog2…

RAG 最新最全资料整理

最近在做RAG方面的工作。它山之石可以攻玉&#xff0c;做了一些调研&#xff0c;包含了OpenAi&#xff0c;百川&#xff0c;iki.ai为我们提供的一些实现方案。 本文以时间顺序&#xff0c;整理了最近最新最全的和RAG相关的资料。都是满满的干货&#xff0c;包含了RAG评测工具、…