通过几个Hello World感受.NET Core全新的开发体验

2016年6月27日,这是一个特殊的日子,微软全新的.NET开发平台.NET Core的RTM版本正式发布。我个人将.NET Core的核心特性归结为三点,它们的首字母组成一个非常好记的简称——COM,分别代表的含义Cross-Platform、Open-Source和Modularization。开发.NET Core应用的方式与之前具有非常大的变化,对于那些尚未体验过.NET Core的朋友,我希望通过本篇文章创建的这几个Hello World应用可以很容易地带你们入门。


首先我们会介绍如何构建.NET Core应用的开发环境。在这之后,我们会利用dotnet new命令行创建一个控制台类型的Hello World应用,这个简单的应用时后续几个Hello World应用的雏形,后者都是通过它改变而成。我们做的第一个改变是将它变成一个ASP.NET Core应用,并采用Self-Host的方式将它寄宿于这个控制台应用中。这个ASP.NET Core应用被进一步改造成一个ASP.NET Core MVC应用,我们会自行定义Controller和View已经路由。


目录

一、构建开发环境

二、执行dotnet new命令创建一个控制台应用

三、将应用修改成一个ASP.NET Core应用

四、自行指定监听地址

五、将应用修改成一个ASP.NET Core MVC应用

六、添加View


 

一、构建开发环境

根据自身的操作系统类型安装和运行环境.NET Core SDK、IDE和相关的工具


  • Windows:https://www.microsoft.com/net/core#windows

  • Linux

    • Ret Hat :https://www.microsoft.com/net/core#redhat

    • Ubuntu :https://www.microsoft.com/net/core#ubuntu

    • Debian :https://www.microsoft.com/net/core#debian

    • Fedora: https://www.microsoft.com/net/core#fedora

    • Centos: https://www.microsoft.com/net/core#centos

    • Opensuse: https://www.microsoft.com/net/core#opensuse

  • Mac: https://www.microsoft.com/net/core#macos

  • Docker:https://www.microsoft.com/net/core#docker


二、执行dotnet new命令创建一个控制台应用

我们直接启动命令行工具,为创建的Hello World应用创建一个根目录(%USERPROFILE% projects/helloworld)。在将该目录设置为当前目录后,我们按照如下的方式执行“dotnet new”命令。源代码下载:netcore.helloworld1



dotnet new命令会为我们创建一个由如下两个文件组成的控制台应用。


作为程序入口的Main方法定义在Program.cs文件中,如下所示的代码片段体现了该文件的整体定义,我们可以看到Main方法仅仅是在控制台上打印出“Hello World”字样而已。


   1: using System;

   2: namespace ConsoleApplication

   3: {

   4:     public class Program

   5:     {

   6:         public static void Main(string[] args)

   7:         {

   8:             Console.WriteLine("Hello World!");

   9:         }

  10:     }

  11: }


我们创建的控制台项目直接映射为一个目录,项目自身的设置定义在project.json这个文件中,该文件的整体定义反应在如下所示的代码片段中。整个文件由四个节点组成,其中versionbuildOptions用来定义目标项目的版本和编译选项。dependencies在用来存放针对NuGet包的以来。我们创建的项目可以针对一个或者多个Framework(比如我们希望创建的可以同时在.NET Framework和.NET Core上运行),支持的Framework定义在frameworks节点下。如果添加了多个Framework,并不是说最终生成的应用可以同时在这些Framework中运行,而是说源文件在编译的时候会针对这些Framework生成对应的程序集。


   1: {

   2:   "version": "1.0.0-*",

   3:   "buildOptions": {

   4:     "debugType": "portable",

   5:     "emitEntryPoint": true

   6:   },

   7:   "dependencies": {},

   8:   "frameworks": {

   9:     "netcoreapp1.0": {

  10:       "dependencies": {

  11:         "Microsoft.NETCore.App": {

  12:           "type": "platform",

  13:           "version": "1.0.0"

  14:         }

  15:       },

  16:       "imports": "dnxcore50"

  17:     }

  18:   }

  19: }


对于传统的.NET项目来说,如果我们需要调用某个API,需要添加所在程序集的引用。对于.NET Core来说,所有使用到的程序集都被打包成一个NuGet包,所以针对程序集的直接依赖转变成针对某个NuGet包的依赖。针对NuGet的依赖主要有两种类型,一种是针对所有Framework的,它们会直接定义在dependencies节点下,另一种则是针对某个具体Framework的,定义的定义为当前Framework节点下的dependencies子节点。我们定义在Project.json中的设定的NuGet包可能尚未在本地安装,我们可以执行dotnet restore命令获取并在本地安装所有需要的NuGet包。一旦完成了针对NuGet包的回复操作,我们就可以直接执行dotnet run命令来启动应用。在这期间,我们的应用实际上会经历一个编译的过程,我们也可以执行dotnet build命令对其实施编译。如下面的代码片段所示,我们分别先后执行restore、build和run三个命令,目标程序最终得以执行。


三、将应用修改成一个ASP.NET Core应用

接下来我们将这个控制台应用改造成一个最简单的ASP.NET Core应用。IDE的选择,我们可以使用VS 2015,也可以使用VS Code,假设我们选择前者。我们以开启项目(File->Open->Project/Solution)的方式打开project.json后,相当于开启了整个控制台项目。ASP.NET Core的核心管道定义在NuGet包“Microsoft.AspNetCore.Hosting”中,以Self-Host的方式寄宿ASP.NET Core应用还需要一个Server,我们选择的是定义在“Microsoft.AspNetCore.Server.Kestrel”这个NuGet包中的KestrelServer,所以我们第一步需要做的就是在project.json中添加针对这两个NuGet包的依赖。源代码下载:netcore.helloworld2


   1: {

   2:   "version": "1.0.0-*",

   3:   "buildOptions": {

   4:     "debugType": "portable",

   5:     "emitEntryPoint": true

   6:   },

   7:   "dependencies": {

   8:      "Microsoft.AspNetCore.Hosting":"1.0.0",

   9:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"

  10:   },

  11:   "frameworks": {

  12:     "netcoreapp1.0": {

  13:       "dependencies": {

  14:         "Microsoft.NETCore.App": {

  15:           "type": "platform",

  16:           "version": "1.0.0"

  17:         }

  18:       },

  19:       "imports": "dnxcore50"

  20:     }

  21:   }

  22: }


ASP.NET Core应用的寄宿依赖于一个WebHost对象,后者则通过对应的工厂WebHostBuilder创建,为此我们将针对WebHost的创建定义在作为入口点的Main方法中。如下面的代码片段所示,我们创建了一个WebHostBuilder对象,在调用其Build方法创建WebHost对象之前,我们先后调用了前者的UseKestrelUseStartup方法。前者的目的在于注册上面提及的这个叫做KestrelServer的Server,后者则注册一个启动类型Startup。WeHost的Run方法一旦调用,意味着ASP.NET Core应用被启动。


   1: using System;

   2: using Microsoft.AspNetCore.Hosting;

   3: using Microsoft.AspNetCore.Builder;

   4: using Microsoft.AspNetCore.Http;

   5:  

   6: namespace ConsoleApplication

   7: {

   8:     public class Program

   9:     {

  10:         public static void Main(string[] args)

  11:         {

  12:             new WebHostBuilder()

  13:             .UseKestrel()

  14:             .UseStartup<Startup>()

  15:             .Build()

  16:             .Run();

  17:         }

  18:     }

  19: }


ASP.NET Core应用的背后是一个由ServerMiddleware构成的管道,Server实现针对请求的监听、接收和响应,而注册的Middleware则负责对请求进行处理。WebHostBuilder的UseKestrel方法为管道注册了必不可少Server,Middleware的注册在实现在由UseStartup方法注册的启动类型中。如下所示的是我们注册的Startup类型的定义,我们在Configure方法中调用ApplicationBuilder的扩展方法Run注册了唯一的Middleware,它对请求的处理逻辑简单而直接——直接响应一个“Hello World”字符串。


   1: using System;

   2: using Microsoft.AspNetCore.Hosting;

   3: using Microsoft.AspNetCore.Builder;

   4: using Microsoft.AspNetCore.Http;

   5:  

   6: namespace ConsoleApplication

   7: {    

   8:     public class Startup

   9:     {

  10:         public void Configure(IApplicationBuilder app)

  11:         {

  12:             app.Run(context=>context.Response.WriteAsync("Hello World"));

  14:         }

  15:         

  16:     }

  17: }

我们同样按照上面的方式执行dotnet restore和dotnet run命令,ASP.NET Core应用将被启动。



上控制台上的输出我们可以看出,ASP.NET Core启动后会绑定到默认的地址“http://localhost:5000/”来监听请求,所以我们可以利用浏览器向这个地址发送请求,应用处理请求后会按照如下的形式响应由注册的Middleware写入的“Hello World”。


四、自行指定监听地址

我们在利用WebHostBuilder创建WebHost,以及利用后者启动ASP.NET Core应用的整个过程中并没有显式指定Server监听的地址,在此情况下默认的监听地址“http://localhost:5000/”会被使用。我们也可以自行指定这个监听地址,该地址可以通过调用WebHostBuilder的扩展方法UseUrls来指定。如下面的代码片段所示,我们在利用WebHostBuilder创建WebHost之前调用UseUrls方法注册了两个监听地址“http://localhost:8888/“和“http://localhost:9999/”。源代码下载:netcore.helloworld3


   1: using System;

   2: using Microsoft.AspNetCore.Hosting;

   3: using Microsoft.AspNetCore.Builder;

   4: using Microsoft.AspNetCore.Http;

   5:  

   6: namespace ConsoleApplication

   7: {

   8:     public class Program

   9:     {

  10:         public static void Main(string[] args)

  11:         {

  12:             new WebHostBuilder()

  13:             .UseKestrel()

  14:             .UseStartup<Startup>()

  15:             .UseUrls("http://localhost:8888/", "http://localhost:9999/")

  16:             .Build()

  17:             .Run();

  18:         }

  19:     }

  20: }


当应用再次被启动后,监听地址将发生改变,我们可以改变浏览器的目标地址来对此做验证。



五、将应用修改成一个ASP.NET Core MVC应用

我们继续对上面这个ASP.NET Core应用进行改造,并将其构建成一个MVC应用。建立在ASP.NET Core的所有的开发框架都是通过注册到管道中的某一个或者多个Middleware实现的。针对MVC的Middleware实现了路由、Controller的激活、Action方法的执行以及View的呈现。相关的类型通过“Microsoft.AspNetCore.Mvc”这个NuGet包承载,所以我们需要添加这个NuGet包的依赖。简单起见,我们只需要直接将project.json中添加的“Microsoft.AspNetCore.Hosting”替换成“Microsoft.AspNetCore.Mvc”即可。


   1: {

   2:   "version": "1.0.0-*",

   3:   "buildOptions": {

   4:     "debugType": "portable",

   5:     "emitEntryPoint": true

   6:   },

   7:   "dependencies": {

   8:      "Microsoft.AspNetCore.Mvc":"1.0.0",

   9:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"

  10:   },

  11:   "frameworks": {

  12:     "netcoreapp1.0": {

  13:       "dependencies": {

  14:         "Microsoft.NETCore.App": {

  15:           "type": "platform",

  16:           "version": "1.0.0"

  17:         }

  18:       },

  19:       "imports": "dnxcore50"

  20:     }

  21:   }

  22: }


ASP.NET Core MVC相关Middleware的注册同样实现在Startup类型的Configure方法中。如下面的代码片段所示,我们直接调用ApplicationBuilder的扩展方法UseMvc注册了这个Middleware。由于这个Middleware需要使用到相关的服务,所以我们在另一个名为ConfigureServices的方法中通过调用ServiceCollection的扩展方法AddMvc注册了这些服务。


   1: using Microsoft.AspNetCore.Hosting;

   2: using Microsoft.AspNetCore.Builder;

   3: using Microsoft.AspNetCore.Http;

   4: using Microsoft.Extensions.DependencyInjection;

   5:  

   6: namespace ConsoleApplication

   7: {

   8:     public class Startup

   9:     {

  10:         public void ConfigureServices(IServiceCollection services)

  11:         {

  12:             services.AddMvc();

  13:         }

  14:         

  15:         public void Configure(IApplicationBuilder app)

  16:         {

  17:             app.UseMvc();            

  18:         }        

  19:     }

  20: }


对于一个MVC应用来说,任意一个请求都是指向定义在目标Controller的某个Action方法中,接下来我们就来定义如下一个HomeController。ASP.NET Core MVC不像之前的MVC版本要求Controller实现IController接口,它可以是一个普通一个以Controller为后缀命名的公共类型。我们在HomeController中定义的Action方法Index,该方法上应用HttpGetAttribute以特性注入的形式注册了模板为“/{name}”的路由。


   1: using System;

   2: using Microsoft.AspNetCore.Mvc;

   3:  

   4: namespace ConsoleApplication

   5: {

   6:     public class HomeController

   7:     {

   8:         [HttpGet("/{name}")]

   9:         public string Index(string name)

  10:         {

  11:             return $"Hello {name}";

  12:         }

  13:     }

  14: }


当我们按照上面的方式启动这个ASP.NET Core MVC应用后,如果我们利用浏览器访问与注册路由相匹配的目标地址(“http://localhost:9999/foobar”),可以得到如下所示的相应结果。源代码下载:netcore.helloworld4


六、添加View

接下来我们为上面这个MVC应用添加View。为此我们需要按照如下的方式改写HomeController。我们让它继承基类Controller,并改变Action方法Index的返回类型(IActionResult),该方法直接调用View方法返回只想默认View的ViewResult对象。再次之前,我们将传入的参数name保存在ViewBag中。


   1: using Microsoft.AspNetCore.Mvc;

   2:  

   3: namespace ConsoleApplication

   4: {

   5:     public class HomeController: Controller

   6:     {

   7:         [HttpGet("/{name}")]

   8:         public IActionResult Index(string name)

   9:         {

  10:             ViewBag.Name = name;

  11:             return View();

  12:         }

  13:     }

  14: }


接下来我们来定义Action方法Index指向的这个View,按照约定我们应该将对应的Index.cshtml文件存放在/Views/Home目录下。该View定义如下。


   1: <html>

   2:     <head>

   3:         <title>Hello</title>

   4:     <head>

   5:         <body>Hello, @ViewBag.Name</body>

   6: </html>


由于我们使用到了Razor引擎,我们同样需要将相关的NuGet包“Microsoft.AspNetCore.Razor.Tools”按照如下的方式添加到project.json文件中。除此之外,基于View动态编译的需要,我们需要添加一个名为“preserveCompilationContext”的编译选项,并将其值设置为true。


   1: {

   2:   "version": "1.0.0-*",

   3:   "buildOptions": {

   4:     "debugType": "portable",

   5:     "emitEntryPoint": true,

   6:     "preserveCompilationContext": true

   7:   },

   8:   "dependencies": {

   9:      "Microsoft.AspNetCore.Mvc":"1.0.0",

  10:      "Microsoft.AspNetCore.Razor.Tools": {

  11:       "version": "1.0.0-preview2-final",

  12:       "type": "build"

  13:     },

  14:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"

  15:      

  16:   },

  17:   "frameworks": {

  18:     "netcoreapp1.0": {

  19:       "dependencies": {

  20:         "Microsoft.NETCore.App": {

  21:           "type": "platform",

  22:           "version": "1.0.0"

  23:         }

  24:       },

  25:       "imports": "dnxcore50"

  26:     }

  27:   }

  28: }


除此之外,View的定位依赖于一个根路径,所以我们需要按照如下的方式调用WebHostBuilder的UseContentRoot方法将当前目录设置为此根目录。


   1: using Microsoft.AspNetCore.Hosting;

   2: using Microsoft.AspNetCore.Builder;

   3: using System.IO;

   4:  

   5: namespace ConsoleApplication

   6: {

   7:     public class Program

   8:     {

   9:         public static void Main(string[] args)

  10:         {

  11:             new WebHostBuilder()

  12:             .UseKestrel()

  13:             .UseStartup<Startup>()

  14:             .UseContentRoot(Directory.GetCurrentDirectory())

  15:             .UseUrls("http://localhost:8888/", "http://localhost:9999/")

  16:             .Build()

  17:             .Run();

  18:         }

  19:     }

  20: }


当我们按照上面的方式启动这个ASP.NET Core MVC应用后,如果我们利用浏览器访问与注册路由相匹配的目标地址(“http://localhost:9999/foobar”),可以得到如下所示的相应结果。源代码下载:netcore.helloworld5




请扫描此二维码或者搜索“大内老A”关注蒋金楠(Artech)微信公众帐号,你将会得到及时的高质量技术文章推送信息。

内容转载自公众号

大内老A
大内老A
了解更多

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

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

相关文章

Java多线程(六)之Deque与LinkedBlockingDeque深入分析

转载自 Java多线程&#xff08;六&#xff09;之Deque与LinkedBlockingDeque深入分析 一、双向队列 DequeQueue除了前面介绍的实现外&#xff0c;还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作&#xff0c;因此在功能上比Queue显然要更复杂。下图…

matlab边算边出图命令,Matlab:不包含边境和工具栏的figure(移除保存图片的白边)...

Matlab:不包含边界和工具栏的figure(移除保存图片的白边)当我们使用matlab的imshow命令显示图片时&#xff0c;会有白框和工具栏出现。在保存图片时会出现白色的边框。下面将说明如何去除这些显示。Matlab启动时运行脚本script.m&#xff0c;文件位置在~/matlab/ directory。在…

JavaScript实现复选框全选与全不选的效果

//里面涉及到几张图片&#xff0c;有需要的可以联系我要&#xff0c;直接私信我就行&#xff0c;每天在这个点都会上线&#xff0c;看到就回&#xff0c;或者从我的资料里面找我的联系方式&#xff0c;收到之后会发给你们的<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…

ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

之前两篇文章简析.NET Core 以及与 .NET Framework的关系和.NET Core的构成体系从总体上介绍.NET Core,接下来计划用一个系列对ASP.NET Core的运行原理进行剖析。 ASP.NET Core 是新一代的 ASP.NET&#xff0c;早期称为 ASP.NET vNext&#xff0c;并且在推出初期命名为ASP.NET …

深入并发包-ConcurrentHashMap

转载自 深入并发包-ConcurrentHashMap 前言 以前写过介绍HashMap的文章&#xff0c;文中提到过HashMap在put的时候&#xff0c;插入的元素超过了容量&#xff08;由负载因子决定&#xff09;的范围就会触发扩容操作&#xff0c;就是rehash&#xff0c;这个会重新将原数组的内容…

红帽、微软和 Codenvy 联合推出语言服务器协定(Language Server Protocol,LSP)项目

微软、红帽及容器开发环境供应商Codenvy本周在Red Hat DevNation开放源码大会上宣布将共同发展语言服务器协定&#xff08;Language Server Protocol&#xff0c;LSP&#xff09;项目&#xff0c;让不同的程序编辑器与集成开发环境&#xff08;IDE&#xff09;方便嵌入各种程序…

ConcurrentHashMap总结

转载自 ConcurrentHashMap总结并发编程实践中&#xff0c;ConcurrentHashMap是一个经常被使用的数据结构&#xff0c;相比于Hashtable以及Collections.synchronizedMap()&#xff0c;ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力&#xff0c;但同时降低了对读一…

最全面的常用正则表达式大全

很多不太懂正则的朋友&#xff0c;在遇到需要用正则校验数据时&#xff0c;往往是在网上去找很久&#xff0c;结果找来的还是不很符合要求。所以我最近把开发中常用的一些正则表达式整理了一下&#xff0c;在这里分享一下。给自己留个底&#xff0c;也给朋友们做个参考。 转载至…

php access allow,PHP标头不适用于Access-Control-Allow-Origin

我使用jQuery File Upload plugin by Blueimp将图像上传到服务器.问题是,发送服务器是admin.example.com,存储图像的接收服务器位于www.example.com上.相同的域,不同的子域.XMLHttpRequest cannot load http://www.example.com/upload/. Origin http://admin.example.com is no…

.NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布&#xff0c;社区里涌现了很多文章&#xff0c;我也计划写个系列文章&#xff0c;原因是.NET Core的入门门槛相当高&#xff0c;很有必要写个深入浅出的系列文章&#xff0c;本节内容帮助你入门。我将可能…

java语言中的访问权限控制符有哪些,18.Java的访问控制符

Java的访问控制符一.类的成员的可见性对于类的成员变量和成员方法&#xff0c;我们可以通过设定一定的访问可见性来限定应用范围。(一).privateprivate表示当前类访问权限。如果类里的一个成员(包括成员变量、方法、构造器等)使用private访问控制符来修饰&#xff0c;则这个成员…

ConcurrentHashMap能完全替代HashTable吗?

转载自 ConcurrentHashMap能完全替代HashTable吗&#xff1f;关于ConcurrentHashMap在之前的ConcurrentHashMap原理分析中已经解释了原理&#xff0c;而HashTable其实大抵上只是对HashMap的线程安全的封装&#xff0c;在JDK7与JDK8中HashMap的实现中解释了HashMap的原理。 至此…

购物车的功能——界面源码

里面所用到的图片资源统一都在“我的资源”里面&#xff0c;相对应的图片是“ 购物车源码相关图片 ”http://download.csdn.net/detail/qq_34137397/9665878&#xff0c; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o…

Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

前言 在上篇文章中&#xff0c;主要介绍了 Dotnet Core Run 命令&#xff0c;这篇文章主要是讲解如何在Linux中&#xff0c;对 Asp.Net Core 的程序进行发布和部署。 有关如何在 Jexus 中进行部署&#xff0c;请参见本人的另一篇文章&#xff1a;http://www.cnblogs.com/savorb…

php渐变字,jQuery_jQuery实现的立体文字渐变效果,先截两个图看看: 效果很 - phpStudy...

jQuery实现的立体文字渐变效果先截两个图看看&#xff1a;效果很不错吧&#xff1f;会不会误以为这些字体是图片&#xff1f;这可不是图片&#xff0c;而是用JS实现的在线演示 http://demo.phpstudy.net/js/gradient-test/demo.htm下面来简单分享下实现过程及原理(网站中使用了…

https 单向认证和双向认证

转载自 https 单向认证和双向认证 一、Http HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;是互联网上使用最广泛的一种协议&#xff0c;所有WWW文件必须遵循的标准。HTTP协议传输的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用HTT…

python中将整数转化为八进制的函数,Python进制转化

Python中的进制有二进制、八进制、十进制、十六进制&#xff0c;用python的内置函数可以方便的进行不同进制之间的转换&#xff0c;二、八、十六进制数字表示前面分别添加0b、0o、0x(前面为零)。二进制八进制十进制十六进制0b1010o1271230x1a转化为十进制int()可以接收一个或者…

Asp.Net Core 发布和部署(Linux + Jexus )

前言 在上篇文章中&#xff0c;主要介绍了 Dotnet Core Run 命令&#xff0c;这篇文章主要是讲解如何在 asp.net core 中对我们的已经完成的程序进行发布和部署。 有关如何使用 Nginx 进行部署&#xff0c;请参见本人的另一篇文章&#xff1a;http://www.cnblogs.com/savorboar…

购物车的功能——CSS源码

里面所用到的图片资源统一都在“我的资源”里面&#xff0c;相对应的图片是“ 购物车源码相关图片 ”http://download.csdn.net/detail/qq_34137397/9665878&#xff0c; 此CSS的对应的是“购物车的功能——界面源码”的内容 charset "gb2312"; /* CSS Document */…

Java NIO系列教程(十 五)Java NIO Path

转载自 Java NIO系列教程&#xff08;十 五&#xff09;Java NIO Path译文链接 译者&#xff1a;章筱虎 Java的Path接口是Java NIO2 的一部分&#xff0c;是对Java6 和Java7的 NIO的更新。Java的Path接口在Java7 中被添加到Java NIO&#xff0c;位于java.nio.file包中&#x…