File类:
java要对文件(这里文件,是指文件名与路径)进行处理,首先需要做的是如何找到该对应的文件,java通过File类来创建需要对应文件的实例。
File类的构造方法:
File(Stinr path):一般我们创建一个File,是根据路径字符串来创建。该路径可以指向文件或者是目录,也可以是不存在的路径。当然还有其他的构造方法,不过至今我都没有用到。
File类有许多的方法,最常用的方法如下:
boolean File.exists():判断文件是否存在,存在返回true,不存在访问false;
File.createNewFile(): 创建一个与path指向文件的文件名
File.mkdir()以及File.mkdirs():创建一个与path指向目录的目录
Stirng File.list(): 列出File对象的所有子文件名和路径。
文件过滤器FilenameFilter:
在上述File类方法中有个list方法,该方法可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。
代码如下:作用是返回当前程序目录下,子目录中有包含后缀名为".java"文件的名字
public class IO { //文件过滤器 public void fileNameFilter(){ File file = new File("."); System.out.println(file.getAbsolutePath()); // FilenameFilter filenameFileter = new FilenameFilter() { // // @Override // public boolean accept(File dir, String name) { // // TODO Auto-generated method stub // System.out.println("accept方法中的name="+name); // return name.endsWith(".java") || new File(name).isDirectory(); // } // }; // String[] nameList = file.list(filenameFileter); //使用Lambda表达式,相当于上述的代码 String[] nameList = file.list((dir,name) -> name.endsWith(".java") || new File(name).isDirectory()); for(String name : nameList){ System.out.println(name); } } public static void main(String[] args){ IO io = new IO(); io.fileNameFilter(); } }
运行效果如下:
D:\programme\javaEE\project\fzkjshop_project\fzkjshop_test\.
.settings
src
target
File类只能找到文件或者目录,也可以创建删除文件与目录,但是不能对文件进行读与写。为了实现文件的读与写
IO流:
IO流是输入/输出的基础,它可以方便的实现数据的输入/输出操作,不仅可以实现文件的读与写,还可以现实网络传输数据的输入与输出等等。在Java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream),通过流的方式,允许Java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收(sink)的有序数据。
流可以根据方向分成:输入流与输出流,一个只能输入,不能输出;另一个只能输出,不能输入
可以根据传输类型分成: 字节流与字符流,一个使用字节传输,另外一个使用字符传输
可以根据角色分成:节点流与处理流,从/向一个特定的IO设备(如硬盘,网络)读/写数据的流,称为节点流;将节点流进行封装或者连接的称之为处理流。处理流比节点流在编写操作上更简单,同时执行的效率更高。
根据输入/输出流以及字符/字节流,IO流提供4个抽象基类,即是字符输入流(Reader),字符输出流(Writer),字节输入流(InputStream),字节输出流(OutputStream),IO流提供的40多个类都是由4个抽象基类派生而来了,如下图:
根据上图,我们得知了用于访问文件的流,现通过该流编写一个拷贝文件的程序:
public class IO { //拷贝文件 public void copyFile(String path,String copyPath,int fileType){ File file_1 = new File(path); File file_2 = new File(copyPath); try{ if(!file_2.exists()){ file_2.createNewFile(); } if(!file_1.exists()){ System.out.println("要拷贝文件的路径不存在"); } if(file_1.isFile() && file_2.isFile()){ byte[] readByte = new byte[1024]; char[] chars = new char[512]; int hasRead,account = 0; if(fileType == 0){ //当文件时字符类型时 Reader read = new FileReader(file_1); Writer write = new FileWriter(file_2); while((hasRead = read.read(chars))>0){ write.write(chars,0,hasRead); } read.close(); write.close(); } if(fileType == 1){ //当文件时字符类型时 InputStream in = new FileInputStream(file_1); OutputStream out = new FileOutputStream(file_2); while((hasRead = in.read(readByte)) >0){ out.write(readByte,0,hasRead); } in.close(); out.close(); } } }catch(Exception e){} } public static void main(String[] args){ IO io = new IO(); // io.fileNameFilter(); String bytePath = "D:\\data\\file\\img.jpg"; String byteCopyPath ="D:\\data\\file\\img_1.jpg"; String charPath = "D:\\data\\file\\book.txt"; String charCopyPath = "D:\\data\\file\\book_1.txt"; io.copyFile(charPath,charCopyPath,0); io.copyFile(bytePath, byteCopyPath,1); } }
在上述代码中,我们实现了拷贝文件的方法,传入的参数分别是对要拷贝文件的路径,拷贝文件后放置的路径根据以及文件类型,根据文件类型分成了字节拷贝与字符拷贝,各自的流都不一样。