java io

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用以方便的读取文本内容
相关文章
相关标签/搜索