精华内容
下载资源
问答
  • AsynchronousFileChannel使异步读写文件成为可能。接下来将说明如何使用AsynchronousFileChannel。 1.创建一个AsynchronousFileChannel 可以通过其静态方法open()创建一个AsynchronousFileChannel: Path ...

    在Java 7中,AsynchronousFileChannel已添加到Java NIO。 AsynchronousFileChannel使异步读写文件成为可能。接下来将说明如何使用AsynchronousFileChannel。

     

    1.创建一个AsynchronousFileChannel

    可以通过其静态方法open()创建一个AsynchronousFileChannel:

    Path path = Paths.get("data/test.xml");
    AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
    

     

    open()方法的第一个参数是一个Path实例,该实例指向与AsynchronousFileChannel关联的文件。

    第二个参数是一个或多个打开的选项,它们告诉AsynchronousFileChannel对基础文件执行哪些操作。在此示例中,我们使用了StandardOpenOption.READ,这意味着将打开文件进行读取。

     

    2.读取数据

    可以通过两种方式从AsynchronousFileChannel读取数据。

     

    3.通过Future读取数据

    从AsynchronousFileChannel读取数据的第一种方法是调用read()方法,该方法返回Future。

    Future<Integer> operation = fileChannel.read(buffer, 0);
    

     

    此版本的read()方法将ByteBuffer作为第一个参数。从AsynchronousFileChannel读取的数据被读入此ByteBuffer。第二个参数是文件中要开始读取的字节位置。

    即使读取操作尚未完成,read()方法也会立即返回。可以通过调用read()方法返回的Future实例的isDone()方法来检查何时完成读操作。

    示例:

    AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
    
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    long position = 0;
    
    Future<Integer> operation = fileChannel.read(buffer, position);
    
    while(!operation.isDone());
    
    buffer.flip();
    byte[] data = new byte[buffer.limit()];
    buffer.get(data);
    System.out.println(new String(data));
    buffer.clear();
    

     

    本示例创建一个AsynchronousFileChannel,然后创建一个ByteBuffer,将其作为参数传递给read()方法,位置设为0。在调用read()之后,该示例循环运行,直到返回的Future的isDone()方法返回true。当然,这不是对CPU的非常有效的使用-但是你需要以某种方式等待读取操作完成。

    一旦读取操作完成,数据将被读取到ByteBuffer中,然后被读取到String中,并打印到System.out中。

     

    4.通过CompletionHandler读取数据

    从AsynchronousFileChannel读取数据的第二种方法是调用以CompletionHandler作为参数的read()方法版本。

    fileChannel.read(buffer, position, buffer, new CompletionHandler<Integer, ByteBuffer>() {
        @Override
        public void completed(Integer result, ByteBuffer attachment) {
            System.out.println("result = " + result);
    
            attachment.flip();
            byte[] data = new byte[attachment.limit()];
            attachment.get(data);
            System.out.println(new String(data));
            attachment.clear();
        }
    
        @Override
        public void failed(Throwable exc, ByteBuffer attachment) {
    
        }
    });
    

     

    读取操作完成后,将调用CompletionHandler的completed()方法。方法第一个参数表明多少字节被读,第二个参数是read读入数据的缓冲区。

    如果读取操作失败,则将改为调用CompletionHandler的failed()方法。

     

    5.写数据

    就像读取一样,可以通过两种方式将数据写入AsynchronousFileChannel。

     

    6.通过Future写入数据

    AsynchronousFileChannel也使你可以异步写入数据:

    Path path = Paths.get("data/test-write.txt");
    AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE);
    
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    long position = 0;
    
    buffer.put("test data".getBytes());
    buffer.flip();
    
    Future<Integer> operation = fileChannel.write(buffer, position);
    buffer.clear();
    
    while(!operation.isDone());
    
    System.out.println("Write done");
    

     

    首先,以写入模式打开一个AsynchronousFileChannel。然后创建一个ByteBuffer并将一些数据写入其中。然后,将ByteBuffer中的数据写入文件。最后,该示例检查返回的Future以查看写入操作何时完成。

    请注意,此代码生效之前,文件必须已经存在。如果文件不存在,则write()方法将抛出java.nio.file.NoSuchFileException。

    你可以使用以下代码确保路径指向的文件存在:

    if(!Files.exists(path)){
        Files.createFile(path);
    }
    

     

    7.通过CompletionHandler写入数据

    还可以使用CompletionHandler将数据写入AsynchronousFileChannel,以告诉你写入何时完成:

    Path path = Paths.get("data/test-write.txt");
    if(!Files.exists(path)){
        Files.createFile(path);
    }
    AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE);
    
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    long position = 0;
    
    buffer.put("test data".getBytes());
    buffer.flip();
    
    fileChannel.write(buffer, position, buffer, new CompletionHandler<Integer, ByteBuffer>() {
    
        @Override
        public void completed(Integer result, ByteBuffer attachment) {
            System.out.println("bytes written: " + result);
        }
    
        @Override
        public void failed(Throwable exc, ByteBuffer attachment) {
            System.out.println("Write failed");
            exc.printStackTrace();
        }
    });
    

     

    写操作完成后,将调用CompletionHandler的completed()方法。如果由于某种原因写入失败,则会调用failed()方法。

     

     

    原文地址: https://www.zhblog.net/go/java/tutorial/java-nio-asynchronous-filechannel?t=630

     

     

    展开全文
  • java NIO异步框架

    2008-11-12 10:22:51
    Java对io重新包装,大大提高了io的处理效率和复用率。可以用nio代替多线程编程。
  • 介绍Java直接读取、带缓冲读取、内存映射读取文件,并详细注释。
  • 如果是异步上传的,如果你传入的异步方法是 MultipartFile file,就会包下面的错 java.io.FileNotFoundException: D:\usr\local\tomcat\work\Tomcat\localhost\upload_46ba607a_d50c_4618_9b66_234953a0ba1f_...

    如果上传的时候,是同步上传的,不会出现问题。
    如果是异步上传的,如果你传入的异步方法是 MultipartFile file,就会包下面的错

    java.io.FileNotFoundException: D:\usr\local\tomcat\work\Tomcat\localhost\upload_46ba607a_d50c_4618_9b66_234953a0ba1f_00000002.tmp (系统找不到指定的文件。)
    	at java.io.FileInputStream.open0(Native Method)
    	at java.io.FileInputStream.open(FileInputStream.java:195)
    	at java.io.FileInputStream.<init>(FileInputStream.java:138)
    	at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:194)
    	at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:100)
    	...
    	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    	at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    	at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
    	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    	at java.util.concurrent.FutureTask.run(FutureTask.java)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at java.lang.Thread.run(Thread.java:748)
    

    解决方法:
    调用异步Async方法的时候,传入file.getInputStream(),就能解决问题。
    如果想要多次使用同一个流:
    比如:参数是 is = file.getInputStream()

    import org.apache.poi.util.IOUtils; //可以使用别的工具类,也可以自己写

    byte[] bytes = IOUtils.toByteArray(is);
    ByteArrayInputStream bisUpload = new ByteArrayInputStream(bytes);
    ByteArrayInputStream bisExcel = new ByteArrayInputStream(bytes);

    service.upload(bisUpload ); //线程上传到服务器
    ExcelUtil.readExcel2007(bisExcel); //然后再读文件

    展开全文
  • 文件异步读取 java

    千次阅读 2011-08-09 21:14:00
    读 写 耗用时间(秒) RandomAccessFile RandomAccessFile 95.848 BufferedInputStream + DataInputStream BufferedOutputStream + DataOutputS
    耗用时间(秒)
    RandomAccessFileRandomAccessFile95.848
    BufferedInputStream + DataInputStreamBufferedOutputStream + DataOutputStream2.935
    BufferedRandomAccessFileBufferedOutputStream + DataOutputStream2.813
    BufferedRandomAccessFileBufferedRandomAccessFile2.453
    BufferedRandomAccessFileBufferedRandomAccessFile2.197
    BufferedRandomAccessFileBufferedRandomAccessFile0.401
    MappedByteBuffer+ RandomAccessFileMappedByteBuffer+ RandomAccessFile1.209


    做了一个视频断点续传的功能,开始使用的 RamdomAccessFile 实现的发现速度太慢了。后来换成 MappedByteBuffer + RandomAccessFile实现


    实例如下:

    RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
                            long fileLength = Long.valueOf(newFile.length()).longValue();
    //                        raf.seek(start_point==null?fileLength:Long.parseLong(start_point));
    //                        raf.write(buffer);
                            FileChannel fc = raf.getChannel();
                            MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, fileLength + length);
                            out.position(start_point == null ? (int) fileLength : Integer.parseInt(start_point));
                            out.put(buffer);
                            out.force();
                            fc.close();
                            is.close();

    展开全文
  • Java 异步IO(1) 文件异步IO

    千次阅读 2014-11-13 19:35:02
    异步IO实际上就是IO的操作

    大家写过多线程都用过java.util.concurrent包,自己创建线程池,自己实现run 或者call接口创建线程类,之后提交给线程池运行。

    之前大家读写文件,必须得等待IO完成。如果要想节约时间,还得自己实现上面多线程那一套。今天刚知道异步IO这个东西,不用自己实现多线程了。下面是示例代码:

    	public static void asynchronousFileIO()
    	{
    		Path path = Paths.get("resource/Stopword.txt");
    
    		try
    		{
    			AsynchronousFileChannel channel = AsynchronousFileChannel.open(path);
    			ByteBuffer buffer = ByteBuffer.allocate(1000);
    			Future<Integer> future = channel.read(buffer, 0);
    
    			while (!future.isDone())
    			{
    				System.out.println("Do others...");
    			}
    
    			Integer number = future.get();
    			System.out.println("Read " + number + " content : " + new String(buffer.array()));
    
    			channel.close();
    
    		} catch (IOException | InterruptedException | ExecutionException e)
    		{
    			e.printStackTrace();
    		}
    	}


    展开全文
  • JAVA异步上传并解析Excel ajax异步上传文件 springBoot方式接收文件 servlet模式接收文件 解析Excel并导入数据库 ajax异步上传文件 //HTML代码,上传的表单 < form action = "" > 选择文件: < input type ...
  • async-file工具提供Java异步读写文件能力,使用Java NIO 库开发
  • 针对目前多数基于同步阻塞式处理模式、采用Java字节码数据流方式进行读写操作的低效率处理技术,将异步文件通道与线程池结合,通过数据分块和读写处理的异步执行,构造一种基于非阻塞数据传输模式的文件上传处理架构,...
  • 今天在写java程序的时候遇到一个奇怪的问题,当我用程序去读取文件时,程序不断提示文件不存在,并抛出Exception in thread "main" java.io.FileNotFoundException (文件不存在)异常。当我在控制台...
  • 采用上传文件后,交给子线程异步处理,主线程及时响应。 同时上传多文件 ,会偶现报错java.io.FileNotFoundException /tmp/XXX/tomcat/XXX 。 springboot文件上传,会创建临时目录保存临时文件,处理完后会清除。 ...
  • 本类,是专门为了处理大文件,按行读取开发的类。 采用读文件的缓存 fbb 1024*5 行缓存 bb 256 字节 设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件...
  • Java IO之文件读取

    千次阅读 2018-07-25 19:41:05
    以BIO形式的文件读取和复制: public class MyReadFile { public static void main(String[] args){ try{ //第一步,定位数据源 File f=new File("c:/work/test.txt"); //第二布,建立...
  • 什么是java异步

    2016-06-10 09:41:25
    什么是java异步? 同步与异步  通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理。  异步通常代表着更好的性能,因为它很大程度...
  • Java异步事件:轮询与中断

    千次阅读 2015-09-19 20:06:44
    一个完整的系统还包含其他的设备,比如:硬盘或者固态硬盘,用来存储程序和数据文件的。(注意,主存仅保存少量的信息,并且只有在计算机接通电源的时候才能保存信息。硬盘或者固态硬盘用来永久存储大量的信息。但是...
  • import java.io.*; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel.MapMode; import java.security.InvalidParameterException; import java.util.HashSet; import java.util.Set; import...
  • 前言 Java NIO使用通道、缓冲来操作流,所以要深刻理解这些概念...读取文件的样例代码 String pathname = "C:\\Users\\adew\\Desktop\\jd-gui.cfg"; FileInputStream fin; try { fin = new FileInputStream(new
  • java实现读取json文件

    2017-10-28 15:31:26
    public static String readFile(String Path){ BufferedReader reader = null; String laststr = ""; try{ FileInputStream fileInputStream = new FileInputStream(Path);
  • Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
  • 异步编程原理以及Java实现

    万次阅读 多人点赞 2019-03-30 14:16:11
    说实话多线程和异步是非常容易让人混淆的,好像产生的效果差不多,甚至有人称多线程为异步,实际上这两种技术背后的实现原理是不同的。 假设您有2个任务,不涉及任何IO(在多处理器机器上)。在这种情况下,线程...
  • 文件上传 1.同步文件上传 1.1首先导入 fileUpload是apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。 1.2前台 在前台创建一个form表单 method必须是post请求 必须有...
  • JAVA IO同步,异步

    2014-08-26 13:48:24
    介绍了基于系统底层通信技术socket,JAVA IO同步,异步,阻塞,非阻塞;
  • java —— 异步任务失败后处理

    千次阅读 2019-06-29 23:24:04
    场景: ...但是如果是异步操作,比如用户注册成功后,系统异步发送短信给用户,发短信的操作出问题了没有发出去,而且这个操作也不是用户主动操作了,所以可能会出现用户不知道你有这个操作,系统...
  • [Java基础] Java NIO(异步IO)和经典IO

    千次阅读 2020-01-27 17:14:32
    前言: 我们在开发中经常使用IO,但是我们确不知道什么时候使用经典IO,什么时候应该使用NIO? 概念 NIO即New IO,在JDK1.4后才引入的...JavaIO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线...
  • JAVA NIO/AIO/BIO读取文件

    千次阅读 2019-04-04 15:08:06
    BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import org.apache.commons.io...
  • java实现高效文件下载

    万次阅读 多人点赞 2018-06-15 22:19:43
    java实现高效文件下载 本文我们介绍几种方法下载文件。从基本JAVA IO 到 NIO包,也介绍第三方库的一些方法,如Async Http Client 和 Apache Commons IO....为有效读取文件,我们使用openStream() 方法获取 ...
  • 使用对文件加锁的方式做到线程安全 FileInputStream、FileOutputStream、RandomAccessFile均可得到FileChannel对象,对文件锁进行操作。...在JAVA的标准I/O中,提供了基于流的I/O实现,即InputStream和Out...
  • Java中的异步执行Future小结

    千次阅读 2018-03-31 11:39:47
    最近碰到的异步处理的操作比较多,异步就是不等想要的结果返回执行接下来的其他操作,等异步结果返回后直接调用已经注册好的处理方法完成后续操作。异步的思想是非常棒的,相比轮询的方式而言,异步的实现方式无疑是...
  • 1.获取OSS服务器上的excel文件(这里可以泛用为本地、任意服务器上可读取的excel文件) 2.解析获取到的excel文件,并获取sheet(页) 、row(行) 、cell(单元格)的内容以及样式 ps:这一步操

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,475
精华内容 49,390
关键字:

java异步读取文件

java 订阅