java io

File类

File类可以实例化目录也可以实例化文件,可以是相对路径也可以是绝对路径。

String getPath()返回此文件或者目录相对路径

File getAbsoluteFile()返回此对象所对应的绝对路径所对应的File对象

String getParent()返回此对象的父目录

boolean exists() 判断File对象所对应的文件或者目录是否存在

boolean isFile() boolean isDiectory()判断File对象是目录还是文件

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用以方便的读取文本内容

转载于:https://my.oschina.net/u/2609727/blog/743108

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值