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