File类java
File类能够实例化目录也能够实例化文件,能够是相对路径也能够是绝对路径。设计模式
String getPath()返回此文件或者目录相对路径数组
File getAbsoluteFile()返回此对象所对应的绝对路径所对应的File对象网络
String getParent()返回此对象的父目录测试
boolean exists() 判断File对象所对应的文件或者目录是否存在设计
boolean isFile() boolean isDiectory()判断File对象是目录仍是文件code
long length() 返回文件的长度,若为目录则返回0对象
boolean createNewFile() 当此File对象对应的文件不存在时,建立一个文件递归
boolean delete()删除目录或者文件内存
boolean mkdir()若File所对应的目录不存在,则新建一个目录
String[] list()列出当前File对象内的全部文件,目录(不包括子目录)的相对路径字符串
File[] listFile()列出当前File对象内的全部文件,目录及其子目录的File对象
下面给出一个例子,使用递归遍历某文件下的全部文件和文件夹
import java.io.File; public class Test { public static void main(String[] args) throws Exception { //递归显示C盘下全部文件夹及其中文件 File root = new File("c:"); showAllFiles(root); } final static void showAllFiles(File dir) throws Exception { File[] fs = dir.listFiles(); for (int i = 0; i < fs.length; i++) { System.out.println(fs[i].getAbsolutePath()); if (fs[i].isDirectory()) { try { showAllFiles(fs[i]); } catch (Exception e) { } } } } }
按照流的单元能够划分为字节流和字符流
字节流和字符流
字节流和字符流的区分很是简单,他们的用法几乎彻底同样,区别在于字节流和字符流所操做的单元不一样,字节流所操做的最下单元是8位的字节,而字符流操做的最下单元是16位字符。字节流主要由InputStream和OutputStream做为基类,字符流主要由Reader和Writer做为基类。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串, 字节流提供了处理任何类型的IO操做的功能,但它不能直接处理Unicode字符,而字符流就能够
按照流的角色分能够分为节点流和处理流
节点流
能够从/向一个特定的IO设备(如磁盘、网络)读/写数据,由于程序直接链接到实际的数据源,和实际的输入输入出链接,所以节点流也成为低级流
处理流
处理流用于对一个已存在的流进行链接或者封装,经过封装后的流来实现数据的读写功能。使用处理流时程序并不会直接链接到实际的数据源,没有和实际的数据源链接,这样有一个好处就是,只要使用相同的处理流,程序就能够采用彻底相同的输入输出代码来访问不一样的数据源 。实际上java使用处理流来包装节点流是一种典型的装饰器设计模式,所以处理流也成为包装流。
java把全部设备里的有序数据抽象成流的模型简化了输入输出的处理,理解了流的概念模型也就了解了java IO
输入输出流体系
java IO流40多个类所有是由4个抽象基类派生来的,InputStream/Reader,字节输入流/字符输入流,OutputStream/Writer,字节输出流/字符输出流
InputStream/Reader是全部输入流的抽象基类,他们不能建立实例来执行输入,但他们将成为全部输入流的模板,InputStream中的可用方法有
int read()从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)
int read(byte[] b)从输入流中读取最多b.length个字节的数据,并将其存储在字节数组b中,返回直接读取的字节数
int read(byte[] b,int off,int len)从输入里中读取最多len个字节的数据,并将其存在在数组b中,放入b数组中时,并非从数组起点开始,而是从off位置开始,返回实际读取的字节数
Reader中也包含如上3个方法,只不过将字节换为字符而已。
示例代码:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * Created by rockjh on 2016/9/6. */ public class FileInputStreamTest { public static void main(String[] args) throws IOException { /*建立字节输入流*/ FileInputStream fis = new FileInputStream("src/FileInputStreamTest.java"); /*建立一个长度为1024的竹筒*/ byte[] bbuf = new byte[5]; int hasRead = 0; while ((hasRead = fis.read(bbuf)) > 0) { /*取出竹筒中的水滴,将字节数组转为字符串输出*/ System.out.println(new String(bbuf, 0, hasRead)); } fis.close(); } } ``` 这样的代码输出会有出现中文乱码的状况,由于咱们创建的是一个只有5字节的数组,一个中文占2个字节,若是刚好将一个中文的两个字节拆成了两半,那么就出现了中文乱码,解决办法是用Reader,或者将字节数组大小调至足够大,可以一次性读完该文件,推荐用Reader OutputStream/Writer是全部输入流的抽象基类,他们不能建立实例来执行输入,但他们将成为全部输入流的模板,OutputStream/Writer中的可用方法有 void write(int c)将指定的字节或者字符输出到输出流,c能够是字节也能够是字符 void write(byte[]/char[] buf)将字节数组或者字符数据输出到指定的输出流中 void write(byte[]/char[] buf,int off,int len)将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中 示例代码
import java.io.*;
/**
Created by rockjh on 2016/9/6. */ public class FileWriteTest {
public static void main(String[] args) throws IOException { /建立字符输入流/ FileReader fr = new FileReader("src/FileWriteTest.java"); FileWriter fw=new FileWriter("src/FileWriteTestdf.txt"); /建立一个长度为10的竹筒/ char[] bbuf = new char[1]; int hasRead = 0; while ((hasRead = fr.read(bbuf)) > 0) { /取出竹筒中的水滴,写进缓冲区/ fw.write(bbuf,0,hasRead); /加上这句就是读取一个字符数组,就写一个字符数组到文件,若是不加将会等到fw关闭后才会将输出到文件/ /刷新内存,即将缓冲区内容的清空/ fw.flush(); } fr.close(); fw.close(); } }
**经常使用的处理流** 实际上咱们要识别处理流很是简单,只要流的构造器参数不是一个物理节点(如:文件),而是已经存在的流,那么这种流就必定是处理流 下面程序使用PrintStream来包装FileOutputStream
import java.io.*;
/**
Created by rockjh on 2016/9/6. */ public class PrintStreamTest {
public static void main(String[] args){ PrintWriter ps = null; try { /建立一个节点输出流/ FileWriter fos=new FileWriter("src/test.txt"); /以PrintStream来包装FileOutStream流/ ps=new PrintWriter(fos); /向文件中输出内容并换行/ ps.println("测试1"); ps.println("测试2"); } catch (IOException e) { e.printStackTrace(); } finally { /关闭了处理流就不用再关闭他包装的节点流了/ ps.close(); } } }
BufferedReader具备readLine(),所以经常将读取的文本内容的输入流包装成BufferedReader用以方便的读取文本内容