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();        
        
    }

}
原文地址:https://www.cnblogs.com/xiangkejin/p/5935074.html