zoukankan      html  css  js  c++  java
  • IO流(一)__File对象和字符流FileWriter FileReader

    IO流:
    IO流用来处理设备之间的数据传输,Java对于流的操作对象都在IO包中
    将外设中的数据读取到内存中:输入
    将内存的数写入到外设中:输出


    流分为字节流和字符流
    字符流的由来:
    其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表。
    获取相应的文字。在对这个文字进行操作,简单地说就是:字节流+编码表

    字节流的顶层父类:
    1.InputStream 2.OutputStream

    字符流的两个顶层父类:
    1.Reader 2.Writer
    这些体系的子类都以父类名作为后缀
    而子类名的前缀就是该对象的功能

    一、File对象

    下面几种方式都可以创建File对象:

    private static void construtorDemo() {
            //将一个已经存在的,或者不存在的文件或者目录封装成file对象
        File f1=new File("c:\a.txt");
        
        File f2=new File("c:\","a.txt");
        
        File f=new File("c:\a.txt");
        File f3=new File(f,"a.txt");
        
        File f4=new File("c:"+File.separator+"a.txt");
        }

    * File对象的常见方法
    * 1.获取
    *     1.1获取文件名称
    *     1.2获取文件路径
    *     1.3获取文件大小
    *     1.4获取文件修改时间
    * 2.创建与删除
    * boolean
    * 3.判断
    * 4.重命名

      1 package p8.io.file;
      2 
      3 import java.io.File;
      4 import java.io.IOException;
      5 import java.util.Date;
      6 
      7 import p8.io.filter.FilterByHidden;
      8 import p8.io.filter.FilterByJava;
      9 import p8.io.filter.SuffixFilter;
     10 
     11 public class FileMethodDemo {
     12 
     13     public static void main(String[] args) throws IOException {
     14         //getDemo();
     15         //createAndDeleteDemo();
     16         //isDemo();
     17         //renameToDemo();
     18         //listRootDemo();
     19         //listDemo();
     20         listDemo_2();
     21         listDemo_3();
     22         listDemo_4();
     23         
     24         
     25     }
     26 
     27     /*
     28      * file.list()方法不能遍历文件夹中的文件
     29      */
     30     private static void listDemo_4() {
     31         File dir =new File("c:\");                
     32         File[] files=dir.listFiles(new FilterByHidden());  //显示隐藏文件
     33         for (File file : files) {
     34             System.out.println(file);
     35         }
     36     }
     37 
     38     private static void listDemo_3() {
     39         File file =new File("c:\");        
     40         //用Lambda表达式
     41         //File[] files=dir.listFiles((File f,String name)->name.endsWith(".java"));
     42                 
     43         String[] names=file.list(new SuffixFilter(".java")); //添加后缀名过滤器
     44         for (String name : names) {
     45             System.out.println(name);            
     46         }        
     47     }
     48 
     49     
     50     private static void listDemo_2() {
     51         File file =new File("e:\");
     52         String[] names=file.list(new FilterByJava()); //添加名称过滤器
     53         for (String name : names) {
     54             System.out.println(name);
     55             
     56         }
     57         
     58         
     59     }
     60 
     61     
     62     //获取当目录下的文件以及文件夹的名称。包含隐藏文件。
     63     private static void listDemo() {
     64         File file =new File("f:\");
     65         /*
     66          * 调用list方法中File对象中封装的必须是目录。
     67          * 如果访问的系统级对象也会发生空指针异常
     68          * 如果目录存在但是没有内容,会返回一个数组但是长度为0.
     69          */
     70         String[] names=file.list();
     71         for (String name : names) {
     72             System.out.println(name);
     73             
     74         }
     75         
     76         
     77     }
     78 
     79     
     80     //获取磁盘大小和根路径
     81     private static void listRootDemo() {
     82     File file =new File("d:\");
     83     System.out.println("getFreeSpace:"+file.getFreeSpace());
     84     System.out.println("getTotalSpace:"+file.getTotalSpace());
     85     System.out.println("getUsableSpace:"+file.getUsableSpace());
     86         
     87         File[] files =File.listRoots();
     88         for ( File f : files) {
     89             System.out.println(f);
     90         }
     91     }
     92 
     93     
     94     //更改文件名
     95     private static void renameToDemo() {
     96         File f1=new File("d://aaa.txt");   //已有文件
     97         File f2=new File("d://1aaa.txt");   //更改后的文件名
     98         boolean b=f1.renameTo(f2);//重命名并且会剪切
     99         System.out.println(b);
    100         
    101     }
    102 
    103     
    104     //文件(夹)是否存在
    105     private static void isDemo() throws IOException {
    106         File f=new File("ab7.txt");
    107         f.mkdir();
    108         f.createNewFile();
    109 //        boolean b=f.exists();
    110         //最好先判断是否存在
    111         System.out.println(f.isFile());
    112         System.out.println(f.isDirectory());
    113         
    114     }
    115 
    116     
    117     //创建和删除文件(夹)
    118     private static void createAndDeleteDemo() throws IOException {
    119         File dir=new File("abc//hk//hiih//iuhj//ukh.txt");
    120         //boolean b=dir.mkdir();//创建文件夹,只能创建单级目录
    121         
    122         //boolean c=dir.delete();//删除文件夹,windows的删除是从里往外删的,如果文件夹中有内容则无法删除
    123         
    124         dir.mkdirs();//创建多级目录
    125         //dir.delete();//只删除最里的文件夹
    126                     
    127         //文件的创建和删除
    128         File file= new File("file.txt");
    129         /*
    130          * 和输出流不一样,如果文件不存在,则创建。如果存在则不创建。
    131          */
    132         boolean b=file.createNewFile();
    133         System.out.println("b="+b);
    134         //boolean c=file.delete();
    135         //System.out.println(c);
    136         
    137     }
    138     
    139     
    140     //获取文件的信息
    141     private static void getDemo() {
    142         //File file=new File("a.txt");  //相对路径
    143         File file=new File("E:\JAVA\JAVA练习\9.IO流\a.txt"); //绝对路径
    144         String name=file.getName();
    145         String path=file.getAbsolutePath();//绝对路径
    146         String path1=file.getPath();        //相对路径
    147         long len=file.length();
    148         long time =file.lastModified();
    149         Date date=new Date(time);
    150         
    151         System.out.println("name:"+name);
    152         System.out.println("path:"+path);
    153         System.out.println("path1:"+path1);//得到是file中传入的值
    154         System.out.println("len:"+len);
    155         System.out.println("time:"+date);
    156     }
    157 
    158 }
    View Code

    p8.io.filter过滤文件(将其替换为Lambda表达式更为简洁,FilenameFilter接口是函数式接口,boolean accept(File dir, String name)方法  FileFilter接口也是函数式接口,boolean accept(File pathname)):

    public class FilterByHidden implements FileFilter {
    
        @Override
        public boolean accept(File pathname) {
    
            return pathname.isHidden();
        }
    
    }
    
    public class FilterByJava implements FilenameFilter {
    
        @Override
        public boolean accept(File dir, String name) {
            
            return name.endsWith(".java");
        }
    }
    
    public class SuffixFilter implements FilenameFilter {
        private String suffix;
        
        public SuffixFilter(String suffix) {
            super();
            this.suffix = suffix;
        }
    
        @Override
        public boolean accept(File dir, String name) {
    
            return name.endsWith(suffix);
        }
    
    }
    View Code

    二、FileWriter

    FileWriter fw=new FileWriter("demo.txt",true);   //如果构造函数加入true,可以实现对文件的续写

    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    
        public static void main(String[] args) throws IOException {
            //创建一个可以往文件中写入字符数据的输出流对象
            /*
             * 既然是往一个文件中写入文件数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地)
             * 如果文件不存在,则会自动创建
             * 如果文件存在,则会被覆盖
             * 如果构造函数加入true,可以实现对文件的续写
             */
            FileWriter fw=new FileWriter("demo.txt",true);
            
            /*
             * 调用Writer对象中的writer(string)
             * 其实数据存储到了临时缓冲区中。
             */
            fw.write("aga"+LINE_SEPARATOR+"ngag");
            
            /*
             * 进行刷新,将数据直接写到目的地
             */
            //fw.flush();
            /*
             * 关闭流,关闭资源,在关闭前,会调用flush
             */
            fw.close();
            
            
        }

    三、FileReader

    FileReader fr=new FileReader("demo.txt");

    ch=fr.read();  //一次读取一个字符,返回asc码数字

    len=fr.read(buf) //一次读取一个数组长度的字符,返回读取长度

    public class FileReaderDemo {
    
        public static void main(String[] args) throws IOException {
    /*
     * 1.创建读取字符数据的流对象
     * 在创建读取流对象时,必须要明确被读取的文件。一定要确定该文件是存在的。
     * 用一个读取流关联一个已存在文件
     */
            FileReader fr=new FileReader("demo.txt");
            int ch=fr.read();
            System.out.println(ch);        
            int ch1=0;
            while((ch1=fr.read())!=-1){
                System.out.println(((char)ch1));
            }
            
            /*
             * 使用read(char[])读取文本文件数据。
             * 先创建字符数组。效率更高。
             */        
            char[] buf= new char[1024];
            int len=0;
            while((len=fr.read(buf))!=-1){
                System.out.println(new String(buf,0,len));
            }            
            
            fr.close();
        }
    
    }

    作业:将c盘的一个文本文件复制到d盘

    分析:
    读取c盘中的文件数据
    将这些数据写入到d盘中
    连读带写。
    思路:
    1.需要读取源
    2.将读到的源数据写到目的地
    3.既然是操作文本数据,使用字符流

    public class CopyTextTest {
    
        public static void main(String[] args) throws IOException  {
            //1.读取一个已有的文本文件,使用字符去流和文件相关联
            FileReader fr=new FileReader("demo.txt");
            //2.创建一个目的,用于存储读到数据
            FileWriter fw=new FileWriter("D://copytext_1.txt");
            //3.频繁的读写操作
            int ch=0;
            while((ch=fr.read())!=-1){
                fw.write(ch);
            }
            //4.关闭资源
            fw.close();
            fr.close();        
            
        }
    
    }
  • 相关阅读:
    oracle如何实现自增?----用序列sequence的方法来实现
    win7旗舰版安装 oracle 10g 不能进入图形界面的问题
    MBA都需要学习哪些课程
    查看Oracle当前用户下的(表视图,同义词...)
    辽宁省全国计算机等级考试 网上报名须知
    大学毕业之后的几年 你能考哪些证书
    plsql启动报 Using filter for all users can lead to poor perform
    hive web界面管理
    hive常用命令
    hive-site.xml
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/5935074.html
Copyright © 2011-2022 走看看