java把输入/输出源称为流。流可分为输入流(只能从中读取数据)和输出流(只能向其写入数据)。输入、输出都是站在内存的角度来划分的,比如从程序运行所在内存写数据到磁盘,通常称为输出流。流又可分为字节流(所操作的数据单元是8位字节)、字符流(所操作的数据单元位16位字符)。流还可分为节点流和处理流,节点流和数据源直接相连,处理流将已存在的流根据数据源类型进行封装,可以采用相同的输入/输出代码访问不同的数据源。处理流还可提供缓存提高输入、输出效率,允许批量输入、输出数据。

InputStream和Reader是所有输入流的基类,它们分别有两个对应的实现类:FileInputStream,FileReader。

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("E:/wz.txt");
        byte[] buff = new byte[1024];
        int hasRead = 0;
        // while read end,read() return -1
        while ((hasRead = fis.read(buff)) > 0) {
            System.out.print(new String(buff, 0, hasRead));
        }
        //I/O resource is not internal memory,as a result,it can not collection by GC
        fis.close();
    }
}

IO资源需要手动进行关闭,java7对其进行了改进,可以通过try语句对其进行自动关闭。

public class FileReaderTest {
    public static void main(String[] args) throws IOException {
        try (FileReader fr = new FileReader("E:/wz.txt")) {
            char[] buff = new char[1024];
            int hasRead = 0;
            while ((hasRead = fr.read(buff)) > 0) {
                System.out.println(new String(buff, 0, hasRead));
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}