Java怎么使用NIO优化IO实现文件上传下载功能
本篇内容主要讲解“Java怎么使用NIO优化IO实现文件上传下载功能”,感兴趣设计中的朋友不妨来看看。本文介绍的方法操作简单快捷,java ni o,实用性强。下面就让小编来带大家学习“Java怎么使用NIO优化IO实现文件上传下载功能”吧!
1 NIO的理解一些基础预备原理NIO知识为单位
Java中IO流类的中的体系NIO中BIO与NIO:https://blog.csdn.net/ZGL_cyy/article/details/104326458
Java IO体系与NIO和nioBIO体系面试区别题 :https://blog.csdn.net/ZGL_cyy/article/details/122836368
为什么使用NIO:因为传统上传下载IO文件原理传输速率低,所以选择了NIO进行文件的下载操作。NIO还有一个好处就是其中零拷贝可以实现减少内存中数据的重复,减少CPU操作的效果。所以相对于传统IO,NIO有着效率高点的优势。
2 NIO为何较传统以什么o的文件io速度选择器较快
就拿单个io过程来看,首先时间主要花在了用户态和内核态的转换文件上,java ni,其次,考虑将多个io的“合并设计”为一个io,这不就节省时间了吗
相应以什么的NIO主要io做了两方 面的提升Java.nio
1.避免选择器了用户态dao和内核态的交换,直接操作内存aio,用户态和内核态的转换是很费时文件的,传统的io写入磁盘中时,用户态的接口试题不能直接操作内存,而是通过操作系统调用内核态接口来进行io。
2.利用buffer减少io的次数,buffer化零为整”的写入方式因为大大减小了寻址/写入次数,所以就降低优化了硬盘中的的负荷。
3.IO 是aio基于流来读取的,而NIO则是基于块读取,面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的,java nio教程。不利的一面是,面向流的中 I/O 通常相当慢。
一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的试题 I/O 所具有的优雅性和简单性。
4.非阻塞IO 和 异步IO的支持, 减少线程占有的栈空间,以及理解上下文切换
5.为单位IO 多路复用设计的数据场景支持面试IO
6.Buffer 支持,java中nio是什么,所有读写是什么操作都是基于 缓冲 来实现java
7.NIO 支持 Direct Memory,Java.nio,深入理解java nio, 可以减少一次数dao架构 据拷贝IO
8.Netty 零拷贝的面试支持功能优化
3 NIO实战为单位中的上传下载理解优化优化
3.1 url下载文件
java NIO包数据nio提供了无缓冲情况下在两个通道之间bio直接传输字节的可能java,Java nio是什么意思,java中的dao怎么设计。
为了架构读来自URL的文件,需Java从URL流教程创建ReadableByteChannel :
ReadableByteChannel readableByteChannel = Channels.bio选择器上传下载newChannel(url.openStream());
从区别ReadableByteChannel 读取Java字节功能将被是什么传输至FileChannel:
FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME); FileChannel fileChannel = fileOutputStream.试题面试中的oIOgetChannel();
然后架构使用transferFrom方法,从ReadableByteChannel 类下载来自URL的字节原理传输到FileChannel:
fileOutputStream.教程getChannel().transferFrom(readableByteChannel, 0,java中的nio架构, Long.MAX_VALUE);
transferTo() 和 transferFrom() 方法比简单使用缓存从流中读更有效。依据不同的底层操作系统,数据可以直接从文件系统缓存传输到我们的文件,java nio aio区别,而不必为单位将任何上传下载字节复制到应用程序内存中。
在Linux和bioIOUNIX系统上区别,这些方法使用零拷贝技术,Java怎么使用NIO优化IO实现文件上传下载功能,减少了内核Java模式和用户模式之间的上下文切换次数。
工具类:
/**NIO文件下载工具类场景 * @author olalu */ public class NioDownloadUtils { /** * @description: * @param file: 要下在文件 * @return: void */ public static void downloadDoc(File file,HttpServletResponse response) throws IOException { OutputStream outputStream = response.getOutputStream(); String contentType = Files.probeContentType(Paths.get(file.getAbsolutePath())); //设置响应头 response.setHeader("Content-Type", contentType); response.setHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes("utf-8"),"ISO8859-1")); response.setContentLength((int) file.length()); //获取文件输入流 FileInputStream fileInputStream = new FileInputStream(file); //获取输出流通道 WritableByteChannel writableByteChannel = Channels.newChannel(outputStream); FileChannel fileChannel = fileInputStream.getChannel(); //采用零拷贝的方式实现文件的下载 fileChannel.transferTo(0,fileChannel.size(),writableByteChannel); //关闭Java.nio对应的资源 fileChannel.close(); outputStream.flush(); writableByteChannel.close(); } public static void downloadDoc(String path,HttpServletResponse response) throws IOException { File file = new File(path); if (!file.exists()){ throw new RuntimeException("文件不存在"); } downloadDoc(file,response); } }
3.o2 通过Java.nioNIO上传文件
/** * 文件上传方法 */ public static Result uploading(MultipartFile file) { //获取文件名dao String realName = file.getOriginalFilename(); String newName = null; if(realName != null && realName != ""){ //获取文件后缀 String suffixName = realName.substring(realName.lastIndexOf(".")); //生成新数据名字o newName = UUID.randomUUID().toString().replaceAll("-", "")+suffixName; }else { return Result.fail("文件名不可为空"); } //创建流 FileInputStream fis = null; FileOutputStream fos = null; //创建通道 FileChannel inChannel = null; FileChannel outChannel = null; try { fis = (FileInputStream)file.getInputStream(); //开始上传 fos = new FileOutputStream(UPLOAD_URL+"\\"+newName); //通道间传输 inChannel = fis.getChannel(); outChannel = fos.getChannel(); //上传 inChannel.transferTo(0,inChannel.size(),outChannel); }catch (IOException e){ return Result.fail("文件上传路径错误"); }finally { //关闭资源 try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } if (inChannel != null) { inChannel.close(); } if (outChannel != null) { outChannel.close(); } } catch (IOException e) { e.printStackTrace(); } } return Result.ok(newName); }
到此,相信区别大家对java“Java怎么使用NIO优化IO实现文件上传下载功能”有了更深的了解,不妨来实际操作一番吧!这里是蜗牛博客网站,更多相关内容可以进入io相关频道进行查询,关注我们io,继续学习io!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,java中nio与aio的区别,并提供相关证据,一经查实,将立刻ni删除涉嫌侵权内容。
评论