java的IO流

java的IO操作

IO指的是Input,Output,即输入与输出

流划分为两类:节点流和处理流。

节点流:又称为低级流,是真实连接程序与数据源的“管道”,负责实际搬运数据。

读写一定是建立在节点流的基础上进行的。
 处理流:又称为高级流,高级流不能独立存在,一定是连接在其他流上使用的,
目的是通过其连接的流将数据流经此流时对数据进行加工处理,从而简化我们实际对读写的数据加工的操作。
 在低级流的基础上通过组合多个高级流在读写过程中完成一系列的数据加工操作的过程,称为流的连接。
这是java标准IO操作的精髓所在。

java.io.InputStream:所有字节输入流的父类,规定了所有输入流都应当具备读取字节的相关方法。
java.io.OutputStream:所有字节输出流的父类,规定了所有输出流都应当具备的写出字节的相关方法。

文件流:是一对低级流,用来读写文件数据。
java.io.FileInputStream:文件输入流,用来从文件中读取字节的流
java.io.FileOutputStream:文件输出流,用于向文件中读写字节的流
论功能,与RandomAccessFile一致,但是RAF又能读又能写,而文件要根据做读操作选取用输入或输出进行。
并且它们的底层实际读取操作是不一样的。 RAF是基于指针对文件读写操作,所以可以通过操作指针进行部分
覆盖写操作等,做到对文件数据编辑操作。但是流做不到。所以对于灵活性而言,RAF是优于文件流等的。
但是文件流基于IO操作可以通过连接不同高级流更轻松地完成复杂的读写操作。
对于读写文件而言:
RAF是基于指针的读写,称为“随机读写”。可以移动指针对任意位置读写操作。
文件流是流的读写方式,而流是“顺序读写”,只能顺序往后读写操作,是不能回退操作的。
I/O读完以后不能缩回去,而随机流是非常灵活的,而I/O流与流之间的连接是非常强大的。
文件输出流创建出来,默认为覆盖模式
即:当操作的文件已经存在,那么在创建该流写出的所有数据作为文件数据。
文件流还支持重载构造方法,在第一个参数基础上可以再传入一个boolean类型的参数,当该值为true时,则是追加模式。
即:文件原有数据全部保留,通过该流写出的数据会被追加到文件末尾。
RandomAccessFile既可以用来读文件也可以用来写文件。

代码展示如下所示:

import java.io.IOException;
import java.io.RandomAccessFile;

public class CopyRandomAccessFile {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
RandomAccessFile raf = new RandomAccessFile("web.flv", "r");
RandomAccessFile desc = new RandomAccessFile("copy.flv", "rw");

int len = -1;
byte[] data = new byte[1024 * 10];
long start = System.currentTimeMillis();
while((len = raf.read(data)) != -1)
{
desc.write(data, 0, len);
}
long end = System.currentTimeMillis();
System.out.println("复制共历时" + (end - start) + "毫秒");
desc.close();
raf.close();
}

}

使用字符流读取数据的时候,需要把读取到的数据转换为字符。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* 利用转换流测试字符流读取字符操作
* @author 小明
*
*/

public class ISRDemo {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("osw.txt");

//InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
InputStreamReader isr = new InputStreamReader(fis);

int d = -1;

/**
* 字符流提供的读取字符操作:
* int read()
* 该方法会一次读取一个字符,具体实际读取了
* 多少字节取决于指定的字符集以及对应的额字符(字符流会自行判定)
* 读取字符后还是以int形式返回,若该值为-1依然表示流读取到了末尾。
* 否则该数据表示的就是读取到的对应字符,转换为char即可。
*
*/

while((d = isr.read()) != -1)
{
char c = (char)d;
System.out.print(c);
}

isr.close();
}

}

java按照读写的数据单位将流分为两大类:

字节流和字符流

字节流是以字节为单位读写数据的流哦,由于计算机底层都是二进制,所以字节流可以读写任意数据。

字符是以字符为单位读写数据的流,实际底层还是读写字节。

但是字符流会自动将字节与字符进行对应的转换工作,因此

字符流天生具有字符编码解码的能力,对此字符流也仅适用于读写文本数据。

java.io.Reader,java.io.Writer它们是所有字符输入流与字符输出流的父类。

规定了读写字符的相关方法。

java.io.InputStreamReader,java.io.OutputStreamWriter它们是字符流常用的一对实现类,同时也是一对高级流。

在流连接中起到了非常重要的一环,承上启下,衔接字节流与其他字符流使用。

public class OSWDemo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        FileOutputStream fos = new FileOutputStream("osw.txt");
        
        
        OutputStreamWriter write = new OutputStreamWriter(fos);
        //OutputStreamWriter write = new OutputStreamWriter(fos, "utf-8");
        
        write.write("写入字符流");
        //一定要关闭流,否则缓冲区中的数据不会写入字符流指向的文件中。
        write.close();
        
    }

}
原文地址:https://www.cnblogs.com/liaoxiaolao/p/9581005.html