IO流

一、流

java中把不同的输入、输出源(键盘、文件、内存、网络连接等)抽象表述为“流”(stream)

如上图所示,通过IO流,我们的程序要想访问内存、硬盘、网络等IO目的地,全通过IO流的方法就可以完成,统一了访问方法。

根据数据流方向的不同,可以将数据流分为输入流和输出流。如下图示,我们的程序通过输入流读取数据

输入流只能从中读取数据,而不能向其写出数据

输出流恰好相反

二、根据流中数据类型的不同,可以分为字节流和字符流,字节流传送的是字节数据(byte),字符流传送的是字符数据。

InputStream是所有字节输入流的顶层父类

 int read()是其基本方法,返回的int表示读取的数据指向,如果到了流的末尾,则返回-1

FileInputStream表示指向文件的字节输入流

BufferedInputStream用于给流增加缓冲的功能

OutputStream为字节输出流的顶层父类

void write(int i)

FileOutputStream表示输出到文件的字节流

BufferedOutputStream用于给流增加缓冲的功能。

一个输入流/输出流的综合例子:实现文件的复制

package com.csu.test1;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class FileCopy {
public static void main(String[] args) {
    try {
        InputStream is=new FileInputStream("D:/ex2.txt");
        OutputStream os=new FileOutputStream("E:/ex2.txt");
        BufferedInputStream bis=new BufferedInputStream(is);
        BufferedOutputStream bos=new BufferedOutputStream(os);
        int i=bis.read();
        while(i!=-1){
            bos.write(i);
            i=bis.read();            
        }        
        bos.close();bis.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }            
}
}

 三、字符流

字节流一次读取一个字节的数据,而字符流一次读取一个字符的数据。如“中a”两个字符,如果使用字节流读取,“中”字占有两个字节,读取两次,被转化成两个字符,所以会成为乱码。而用字节流,一个“中”字,只会读取一次,一次读取两个字节。

1.字符输入流(Reader),字符输入流的父类是Reader

InputStreamReader表示一个字节流转化成字符流的工具流。

FileReader 表示指向文件的字符输入流。

BufferedReader 表示给字符输入流增加缓冲功能的字符流。

int read()方法  读取一个字符的数据。

示例程序:将键盘字节流转化成字符流

package com.csu.test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class KeyReaderTest {
    /**
     * 
     * InputStreamReader将字节流转化为字符流
     */
public static void main(String[] args) {
    InputStream is=System.in;
    System.out.println("Please input:");
    //将字节流转化成字符流
    Reader r=new InputStreamReader(is);
    BufferedReader br=new BufferedReader(r);
    //一次从流里读取一行
    try {
        String line=br.readLine();
        while(line!=null){
            System.out.println(line);
            line=br.readLine();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
}
}

2.字符输出流Writer

与Reader流类似

原文地址:https://www.cnblogs.com/chaofn/p/4569265.html