博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java NIO中的读和写
阅读量:6348 次
发布时间:2019-06-22

本文共 4162 字,大约阅读时间需要 13 分钟。

一、概述

  读和写是I/O的基本过程。从一个通道中读取只需创建一个缓冲区,然后让通道将数据读到这个缓冲区。写入的过程是创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作。

二、从文件中读取

  1、原始I/O读文件

  如果使用原来的I/O,那么只需要创建一个FileInputStream并从它那里读取,示例代码如下:

public class BioTest{    public static void main(String[] args) throws IOException    {        FileInputStream in=null;        try        {            in=new FileInputStream("src/main/java/data/nio-data.txt");            int b;             while((b=in.read())!=-1)            {                //一次读一个字节                System.out.print((char)b);            }        }         catch (FileNotFoundException e)        {            e.printStackTrace();        }            }}

  2、NIO读文件

  在NIO系统中,任何时候执行一个读操作,都是从通道中读取,所有的数据最终都是驻留在缓冲区中。读文件涉及三个步骤:

  1. 从FileInPutStream获取Channel
  2. 创建Buffer
  3. 将数据从Channel读到Buffer中

  示例代码如下:

//读文件    private static void readFileNio()    {        FileInputStream fileInputStream;        try        {            fileInputStream = new FileInputStream("src/main/java/data/nio-data.txt");            FileChannel fileChannel=fileInputStream.getChannel();//从 FileInputStream 获取通道            ByteBuffer byteBuffer=ByteBuffer.allocate(1024);//创建缓冲区            int bytesRead=fileChannel.read(byteBuffer);//将数据读到缓冲区            while(bytesRead!=-1)            {                /*limit=position                 * position=0;                 */                byteBuffer.flip();                //hasRemaining():告知在当前位置和限制之间是否有元素                while (byteBuffer.hasRemaining())                {                    System.out.print((char) byteBuffer.get());                }                /*                 * 清空缓冲区                 * position=0;                 * limit=capacity;                 */                byteBuffer.clear();                bytesRead = fileChannel.read(byteBuffer);            }        } catch (FileNotFoundException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

三、写入文件  

  1、原始I/O写文件

  private static void writeFile()    {        FileOutputStream out=null;        try        {            out=new FileOutputStream("src/main/java/data/nio-data.txt");            out.write("hello".getBytes());        }        catch(Exception e)        {            e.printStackTrace();        }    }

  2、NIO写入文件

  //写文件    private static void writeFileNio()    {        try        {            RandomAccessFile fout = new RandomAccessFile("src/main/java/data/nio-data.txt", "rw");            FileChannel fc=fout.getChannel();            ByteBuffer buffer=ByteBuffer.allocate(1024);            buffer.put("hi123".getBytes());            buffer.flip();            try            {                fc.write(buffer);            } catch (IOException e)            {                // TODO Auto-generated catch block                e.printStackTrace();            }        }         catch (FileNotFoundException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

四、读写结合

  将一个文件的所有内容拷贝到另一个文件中。CopyFile.java 执行三个基本操作:首先创建一个 Buffer,然后从源文件中将数据读到这个缓冲区中,然后将缓冲区写入目标文件。这个程序不断重复 ― 读、写、读、写 ― 直到源文件结束。示例代码如下:

//拷贝文件    private static void copyFile()    {        FileInputStream in=null;        FileOutputStream out=null;        try        {            in=new FileInputStream("src/main/java/data/in-data.txt");            out=new FileOutputStream("src/main/java/data/out-data.txt");            FileChannel inChannel=in.getChannel();            FileChannel outChannel=out.getChannel();            ByteBuffer buffer=ByteBuffer.allocate(1024);            int bytesRead = inChannel.read(buffer);            while (bytesRead!=-1)            {                buffer.flip();                outChannel.write(buffer);                buffer.clear();                bytesRead = inChannel.read(buffer);            }        }        catch (FileNotFoundException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        }        }

 

转载地址:http://govla.baihongyu.com/

你可能感兴趣的文章
Java私塾:研磨设计模式 之 访问者模式(Visitor)
查看>>
我的友情链接
查看>>
《Python网络数据采集》读书笔记(六)
查看>>
Linux必学的60个命令
查看>>
iptables 学习笔记 (上)
查看>>
Windows Server 2012 R2 Active Directory(活动目录)实验一
查看>>
android viewpager 无限左右滑动
查看>>
linux下SSH远程连接服务慢解决方案
查看>>
利用mic visual studio 2010 编译器执行wincap获取网络适配器的代码
查看>>
HTML
查看>>
CENTOS7下编译安装PHP-5.4以及配置phpMyAdmin
查看>>
磁盘显示无法访问拒绝访问,里面的资料怎样找到
查看>>
Java之品优购课程讲义_day07(5)
查看>>
Java的新项目学成在线笔记-day3(八)
查看>>
路由简单的实验
查看>>
Centos6.4 xen编译部署
查看>>
好程序员web前端教程分享js reduce方法使用教程
查看>>
零基础学习大数据Hadoop需要什么准备?Hadoop如何发展起来的?
查看>>
前端程序员需要具备的几个软实力,你具备了吗
查看>>
RHEL系列网络配置2015083101
查看>>