zoukankan      html  css  js  c++  java
  • IO和NIO

    一.创建IO

    System.out.println( "*************欢迎进入文件操作系统*************" );
            System.out.println( "*************1.创建文件*************" );
            System.out.println( "*************2.删除文件*************" );
            System.out.println( "*************3.修改文件*************" );
            System.out.println( "*************4.创建文件夹*************" );
            System.out.println( "*************5.查询文件夹下所有的文件列表*************" );
            System.out.println( "*************请选择:*************" );
    
            //获取用户的输入
            int choose = input.nextInt();
            switch (choose){
                case 1://创建文件
                     createNewFile();
                    break;
                case 2://删除文件
                     deleteFile();
                    break;
                case 3://修改文件
                     updateFile();
                    break;
                case 4://创建文件夹
                     mkdirs();
                    break;
                case 5://查询文件夹下所有的文件列表
                     findFileList();
                    break;
            }
        }
       // 查询文件夹下所有的文件列表
        private static void findFileList() {
            System.out.println("请您输入查询的文件夹名称:(默认是E:/)");
            String fileName = input.next();
            //创建File对象
            File file=new File("E:/"+fileName);
            File[] files = file.listFiles();
            int dirNums=0;
            int fileNums=0;
            //遍历集合
            for (File f:files){
                if (f.isDirectory()){
                    dirNums++;
                }
                if (f.isFile()){
                   fileNums++;
                    System.out.println(f.getName());
                }
            }
            System.out.println("有多少个文件夹?"+dirNums);
            System.out.println("有多少个文件?"+fileNums);
        }
    
        //创建文件夹
        private static void mkdirs() {
            System.out.println("请您输入创建的文件夹名称:(默认是E:/)");
            String fileName = input.next();
            //创建File对象
            File file=new File("E:/"+fileName);
            if (file.mkdirs()){
                System.out.println("创建成功");
            }else{
                System.out.println("创建失败");
            }
        }
    
        //修改文件
        private static void updateFile() {
            System.out.println("请您输入需要修改文件的名称:(默认是E:/)");
            String oldFileName = input.next();
            System.out.println("请您输入文件的新名称:(默认是E:/)");
            String newFileName = input.next();
            //创建File对象
            File oldFile=new File("E:/"+oldFileName);
            File newFile=new File("E:/"+newFileName);
            if(oldFile.renameTo(newFile)){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失败");
            }
    
        }
    
        //删除文件
        private static void deleteFile() {
            System.out.println("请您输入删除文件的名称:(默认是E:/)");
            String fileName = input.next();
            //创建File对象
            File file=new File("E:/"+fileName);
            if (file.exists()){  //文件存在才能删除
                boolean flag = file.delete();
                if (flag){
                    System.out.println("文件删除成功!");
                }else{
                    System.out.println("文件删除失败!");
                }
            }else{
                System.out.println("该文件不存在!");
            }
        }
    
        //创建文件
        private static void createNewFile() {
            System.out.println("请您输入文件的名称:(默认是E:/)");
            String fileName = input.next();
            //创建File对象
            File file=new File("E:/"+fileName);
            if (file.exists()){  //文件已经存在
                System.out.println("该文件已经存在!");
            }else{
                try {
                 boolean  flag= file.createNewFile();
                 if (flag){
                     System.out.println("文件创建成功!");
                 }else{
                     System.out.println("文件创建失败!");
                 }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    二.流

      1.字节流

    //创建输出流和输出流对象
    InputStream inputStream=null
    OutputStream outputStream=null
    try{
        inputStream=new InputStream("e:/a.txt");
      //true 代表是否向文件中拼接,不删除之前的内容 outputStream
    =new OutputStream("e:/a.txt",true);
      //先向文件写入内容 outputStream.write(
    "54321".getBytes());
      //read 方法将返回0~255之间的数字如果流读到了最后,将返回-1
       int num=0;
       while((num=inputStream.read())!=-1){
        System.out.println((char)num);
      } }
    catch(Exception e){ e.printStackTrace(); }finally{ try{ inputStream.close(); outputStream.close(); }catch(Exception e){ e.printStackTrace(); } }

        

      2.字符流

    //创建输出流和输入流
    Reader reader=null;
    Writer writer=null;
    try{
      reader=new FileReader("e:/a.txt");
      writer=new FileWriter("e:/a.txt",true);
      writer.write("我是小明");
      writer.flush();
      
    writer.write("我是小刚");
      writer.write("我是小红");
      writer.close();
      int num=0;
      char[]data=new char{1024};
      StringBuffer sb=new StringBuffer();
      while((num=reader.read(data))!=-1){
        sb.append(data);
      }
      System.out.println(sb.toString())
      catch(Exception e){
        e.prinrStackTrace();
      }finally{
          try {     
            reader.close();
          } catch (IOException e) {
            e.printStackTrace();
          }  
       }
    }
     

      3.二进制流

    //创建输出流和输入流对象
    InputStream inputStream=null;
    OutputStream outputStream=null;
    DataInputStream dis=null;
    DataOutputStream dos=null;
    try{
        //获取输入流
        inputStream=new InputStream("e:/a.txt");
        dis=new DataInputStream(inputStream);
        //获取输出流
        outputStream=new OutputStream("e:/a.txt");
        dos=new DataOutputStream(outputStream);
        int num=0;
        while((num=dis.read())!=-1){
            dos.write(num);//复制
        }
    
    
    }catch (Exception e) {
            e.printStackTrace();
     }finally{
        dos.close();
        dis.close();
        outputStream.close();
        inputStream.close();
    }

      4.缓冲流

    Reader reader=null;
            Writer writer=null;
            BufferedReader  br=null;
            BufferedWriter bw=null;
            try {
                writer=new FileWriter("e:/a.txt",true);
                bw=new BufferedWriter(writer); //封装
                bw.write("我是小明!");
                bw.newLine();  //换行
                bw.write("我是小刚!");
                bw.flush();
                bw.write("我是小红!");       
                bw.close();
                writer.close();  //如果不关闭  后续两句话没法获取
                //读取
                reader=new FileReader("e:/a.txt");
                br=new BufferedReader(reader);//封装
                String line=null;
                StringBuffer sb=new StringBuffer();
                while ((line=br.readLine())!=null){
                    sb.append(line);
                }
                System.out.println(sb.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    br.close();
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

      5.序列化和反序列化

    static Scanner  input=new Scanner(System.in);
        //创建需要的输入和输出流对象
        static   InputStream inputStream=null;
        static  OutputStream outputStream=null;
        static ObjectInputStream objectInputStream=null;
        static ObjectOutputStream  objectOutputStream=null;
    
        public static void main(String[] args) {
             //注册   序列化
            //register();
            //登录  反序列化
            login();
        }
    
        //注册
        private static void register()  {
            User user=new User();
            System.out.println("请输入您的用户名:");
            user.setUserName(input.next());
            System.out.println("请输入您的密码:");
            user.setPassword(input.next());
    
            try {
                outputStream=new FileOutputStream("e:/user.txt");
                objectOutputStream=new ObjectOutputStream(outputStream);
                //把对象输出到文件中
                objectOutputStream.writeObject(user);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    objectOutputStream.close();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        //登录
        private static void login() {
            try {
                inputStream=new FileInputStream("e:/user.txt");
                objectInputStream=new ObjectInputStream(inputStream);
                //读取对象
                User user= (User) objectInputStream.readObject();
                System.out.println(user);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    objectInputStream.close();
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    三.NIO

      1.buffer

        01.buffer   缓冲区:存储的是相同类型的数据集!

          本质是一个可以写入数据,并且从中读取数据的内存!

        02.position:写入或者读取的数据的当前指针

          最大值是:capacity-1

        03.limit:有多少数据可以写或者可以读

          在write模式下,我们的limit和capacity的值一致!

          在read模式下,我们的limit和write模式下的position的值一致

              position变成了0!

        03.capation:缓冲区的最大容量;

    //创建一个容量为20的int类型缓冲区
    IntBuffer buffer=IntBuffer.allocate(10);
    System.out.println("capacity====>"+buffer.capacity());
    System.out.println("position====>"+buffer.position());
    System.out.println("limit====>"+buffer.limit());
    //创建一个int类型的数组,便于放进缓冲区
    int[]nums={5,6,4,6,4,3};
    buffer.put(nums);
    System.out.println("*************************");
    System.out.println("capacity====>"+buffer.capacity());
    System.out.println("position====>"+buffer.position());
    System.out.println("limit====>"+buffer.limit());
    //重设缓冲区  切换到 读模式
    buffer.flip();
    System.out.println("*************************");
    System.out.println("capacity====>"+buffer.capacity());
    System.out.println("position====>"+buffer.position());
    System.out.println("limit====>"+buffer.limit());
    //读取数据
    while(buffer.hasremaining()){
        System.out.println(buffer.get());
    }

     2.channel通道

      1.概念

        01.基于缓冲区对数据进行读取或者是写入

        02.通道是双向的,流是单向的

        03.可以异步的读写

      2.常用的实现类

        01.FileChannel:从文件中读写数据

        02.DatagrarmChannel:通过UDP读写网络中的数据

        03.Socketchannel:通过TCP读写网络中的数据

        04.ServerSocketchannel:可以监听新来的TCP连接,每进来一个都会创建一个新的 Socketchannel。

      3.内存映射:就是把文件映射到电脑中的内存中,道过探作内存从而达到操作文件的目的内存中操作速度是最快的

      4.java中读取文件的方式:
        01. RandomAccessFile随机读取,速度最慢82.F ile Inputstream 流的方式读取
        03. BufferReader 缓存的方武读取
        04. MappedByteBuffer内存映射,速度是最快的! ***零*米
      5.内存映射的种模式: MapMode
        01. READ ONLY 对缓冲区的内容只读B

        02.READ WRITE茶对绊冲义的内容读写

        03. PRIVATE 只会对缓冲区的内容进行修改,不会影响到真实的文件
        (通常活用于文件的读取!一般不会涉及到文件的写入)
      6.文件锁:
        01.FileLock基于FileChanne1对 文件捉供锁的功能!
        02.共享锁共享读的操作,只能有个写操作 !防止其他线程获取独占锁!适合读取数据!
        03.独占锁:读写不能同时,只能有一个读或者一个写!适合写数据!
        lock():阻塞

        无参的默认是独占锁:

        有参的为共享锁!
        tryLock():非阻塞

    //创建需要读取和写入的文件地址
    File filea=new File("d:/a.txt”);
    File fileb=new File("d:/b.txt");
    //创建输入流和输出流
    FileInputStream input=new FileInputStream(filea);
    FileOutputStream output=new FileOutputStream(fileb);
    //创建输入流和输出流通道
    FileChannel inChannel=input.getChannel();
    FileChannel outChannel=outputgetChannel();
    //创建缓冲区
    ByteBuffer buffer=ByteBuffer.allocate(1024);
    
    int num=0;
    while((num=outchannel.read())!=-1){
        buffer.flip();
        outChannel.write(buffer);
        buffer.close();
    }
    outChannel.close();
    inChannel.close();
    output.close();
    input.close();
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/wang2386033566/p/9260241.html
Copyright © 2011-2022 走看看