IO 文件零拷贝

This commit is contained in:
zhuyijun 2021-10-10 23:39:40 +08:00
parent a9299d605b
commit 912b4ac090
6 changed files with 271 additions and 1 deletions

157
C++书单.md Normal file
View File

@ -0,0 +1,157 @@
# C++书单
------
- 《C++ Primer Plus》
- 看来几章,但是对于对我来讲,太过基础了,没有什么编程知识的人适合看这个
- 不太可能继续看
- 《深入实践C++模板编程》
- 模板元编程的入门书籍,推荐
- 正在看,我想我会看它第二遍
- 《深入理解C++11》
- 推荐:⭐⭐⭐⭐
- 当前进度:正在看
- 《C++语言的设计和演化》
- 推荐:
- 评价:
- 当前进度:
- 《C++程序设计语言》
- 推荐:⭐⭐⭐⭐⭐
- 评价:
- C++之父写的,看一遍是绝对不够的!!!!!!
- 这绝对不是什么入门书籍!!!有一定基础的人再来看效果可能更好
- 当前进度第16、17章看完了。 暂停
- 《深入探索C++对象模型》
- 推荐:⭐⭐⭐⭐⭐
- 评价:这书真的写的很好,虽然中文翻译不怎么样,如果不是内容太好,我真的撑不下去,会看第二遍
- 当前进度:看完了
- 《Effective C++ 》
- 推荐:❤️❤️❤️❤️❤️
- 评价:
- 信息密度很高,推荐。
- 这是我看过的写的最好的技术书籍之一
- 第6章写的实在太好了已买书收藏。
- 会看第二遍
- 当前进度:看完了,名不虚传, 我觉得是写C++必读的书籍,就算你不打算全部看完,至少也要看完第六章
- 《More Effective C++ 》
- 推荐:⭐⭐⭐
- 评价:
- 感觉我的时间被浪费了
- 这跟《Effective C++ 》真的是一个作者吗,质量相差太大了,我很失望。
- 这是我近期读过的技术书中最难看的一本。准确评分应该是三星半。
- 当前进度:看完了大部分【近期不打算再看了,冷藏】
- 《C++ Boost程序库完全开发指南》
- 推荐:⭐⭐⭐⭐⭐
- 评价:
- 豆瓣评分居然这么多差评,至于吗,(豆瓣)对国产作者也苛刻了吧,为此加一星。
- 当然学习boost最好的资料是官方文档但是谁让我有这本📕呢我一定会看完它的
- 当前进度:正在看(暂停)
- 《Effective STL》
- 当前进度看到第3节暂停
- 《Exceptional C++ 》
- 《STL源码剖析》
------
- 2021/5.20: C++语法特性暂停,我觉得我已经学的差不多了,需要一点实践,实践完了之后再回头看。接下来打算看网络编程的书籍
------
- 《HTTP权威指南》
- 推荐:💚💚💚
- 评价对HTTP协议感兴趣的可以看看还是挺有用的
- 当前进度:走马观花的看完了,还是挺有用的
- 《Linux-UNIX系统编程手册》
- 推荐:❤️❤️❤️❤️💚
- 评价:孤篇横绝,竟为大家
- 当前进度看到第58章暂停
- 《TCP-IP高效编程改善网络程序的44个技巧》
- 推荐:💚💚💚💚
- 评价谁翻译的译者语文不好吗还不如机器翻译呢内容ok翻译烂
- 当前进度:正在看
- 《TCP/IP详解卷二》
- 4.4BSD-Lite源码的下载地址 http://ftp.icm.edu.pl/packages/4.4BSD-Lite/ https://pub.allbsd.org/bsd-sources/
- 《用TCP_IP进行网际互联设计、实现与内核 (卷2)》
- 推荐:
- 评价:
- 信息密度很高,读来有种原来如此的感觉,将买书收藏,常看常新
- 被安利了操作系统课程以及对Xinu的源码感兴趣了
- 感觉网友说的“比TCP/IP详解”更好是有道理的
- 这书的源码网上没有找到。
- 当前进度:正在看
- 《用TCP_IP进行网际互联客户-服务器编程与应用Linux版 (卷3)》
- 推荐:❤️❤️❤️💚💚
- 评价:
- 这书我想买下来收藏,适合有一定基础的人看
- 第1到17章质量很高后面的就比较拉胯了
- 当前进度看到第26章暂停
- 《TCP/IP详解卷1协议》
- 推荐:
- 评价:
- 当前进度:
- 正在看(2021/06/07)
- 暂停,因为我觉得它不说人话(2021/06/08)
- 《TCP/IP网络编程》
- 推荐:
- 评价:
- 《Unix/Linux编程实践教程》
- 推荐:
- 评价:
- 当前进度:
- 《一本书读懂TCP_IP》
- 推荐:🌒
- 评价: 不推荐,为什么这样的书也能出版
- 当前进度: 已看完
------
- Linux高性能服务器编程
- Linux多线程服务器端编程选看
- UNIX 环境高级编程
- UNIX网络编程卷1必看五星推荐
零.手册类:
- 《C++程序设计语言(The C++ Programming Language)》
- 《C++标准程序库(C++ Standard Library Tutorial and Reference) 》
- 《The C++ IO Streams and Locales》
- 《The C++ Standard (INCITS/ISO/IEC 14882-2011)》
- 《Overview of the New C++ (C++11/14) 》
- 《The Standard C Library》
一.初级入门系列:
- 《C++ Primer》
- 《Accelerated C++》
- 《C++编程思想Thinking in C++) 》
- 《C++程序设计原理与实践Programming: Principles and Practice Using C++ )》
- 《C++初学者指南》
- 《Visual.C++.2008入门经典》
- 《面向对象程序设计—C++语言描述》
- 《数据结构(C++语言版)第三版_邓俊辉》
二.实用系列:
- 《深入浅出设计模式》
- 《设计模式:可复用面向对象软件的基础》
- 《HeadFirst设计模式》
- 《大话设计模式》
三.中级进阶系列:
- 《C++ templates》
- 《More Exceptional C++》
- 《Exceptional C++ Style》
- 《C++编程规范(C++ Coding Standards) 》
- 《C++ 模板完全指南(C++ Templates: The Complete Guide)》
- 《Beyond the C++ Standard Library(Boost)》
- 《C和C++安全编码》
四.高级成神系列:
- 《C++设计新思维-泛型编程与设计模式之应用(Modern C++ Design ) 》
- 《C++模板元编程(C++ Template Metaprogramming)》
- 《C++ Concurrency In Action》
- 《Advanced c++ Programming Styles and Idioms 》
- 《Real-Time C++ Efficient Object-Oriented and Template Microcontroller Programming》
- 《Advanced_Metaprogramming_in_Classic_C 》

View File

@ -4,7 +4,6 @@ import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
public class NIOClient {
public static void main(String[] args) {

View File

@ -0,0 +1,29 @@
package cn.zyjblogs.netty.nio.zerocopy;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
public class NewIOClient {
public static void main(String[] args) {
String fileName = "C++书单.md";
try(SocketChannel socketChannel = SocketChannel.open();
//得到一个文件channel
FileChannel channel = new FileInputStream(fileName).getChannel()) {
socketChannel.connect(new InetSocketAddress("localhost",7001));
//准备发送
long startTime = System.currentTimeMillis();
//linux下一个transferTo 方法可以完成发送
//在windows下一次调用transferTo只能发送8M就需要分段传输文件而且要主要
// 传输时的位置
//transferTo 底层使用到零拷贝
long transferCount = channel.transferTo(0,channel.size(),socketChannel);
System.out.println("发送的总得到字节数 "+ transferCount+" ,耗时: "+(System.currentTimeMillis() - startTime));
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,30 @@
package cn.zyjblogs.netty.nio.zerocopy;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
public class NewIOServer {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress(7001);
try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()){
serverSocketChannel.bind(inetSocketAddress);
//创建buffer
ByteBuffer byteBuffer = ByteBuffer.allocate(4096);
while (true){
SocketChannel socketChannel = serverSocketChannel.accept();
int readCount = 0;
while (-1 != readCount){
readCount = socketChannel.read(byteBuffer);
}
//倒带position 设置为 0 mark作废
byteBuffer.rewind();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,29 @@
package cn.zyjblogs.netty.nio.zerocopy;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
public class OldIOClient {
public static void main(String[] args) {
String fileName = "C++书单.md";
try( Socket socket = new Socket("localhost",7001);
FileInputStream fileInputStream = new FileInputStream(fileName);
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {
byte[] buffer = new byte[4096];
long readCount;
long total = 0;
long startTime = System.currentTimeMillis();
while ((readCount = fileInputStream.read(buffer)) >= 0){
total+=readCount;
dataOutputStream.write(buffer);
}
System.out.println("发送总字节数: "+total +" ,耗时: "+(System.currentTimeMillis() - startTime));
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,26 @@
package cn.zyjblogs.netty.nio.zerocopy;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class OldIOServer {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(7001)) {
Socket socket = serverSocket.accept();
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
byte[] byteArray = new byte[4096];
while (true){
int read = dataInputStream.read(byteArray, 0, byteArray.length);
if (-1 == read){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}