Java中的流

文件管理

​ Java语言使用File类对文件和目录进行操作, 查找文件时需要实现FilenameFilter或FileFilter接口。 另外, 读写文件内容可以通过FileInputStream、 FileOutputStream、 FileReader和FileWriter类实现, 它们属于I/O流。

​ File类表示一个与平台无关的文件或目录。 File类名很有欺骗性, 初学者会误认为是File对象只是一个文件, 但它也可能是一个目录 。

流的分类

根据不同的角度对流进行分类:

1.处理的数据单位不同,可分为:字符流、字节流

2.数据流方向不同,可分为:输入流、输出流

3.功能不同,可分为:节点流,处理流

IO流概述

在这里插入图片描述

所有的输入形式都抽象为输入流, 所有的输出形式都抽象为输出流, 它们与设备无关。

缓冲区

缓冲区可以简单地理解为一段内存区域。
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

4个抽象类

字节为单位的流称为字节流, 以字符为单位的流称为字符流。 Java SE提供4个顶级抽象类, 两个字
节流抽象类: InputStream和OutputStream; 两个字符流抽象类: Reader和Writer。

字符流和字节流的主要区别

1、字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

2、字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

3、Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.

4、字节流与字符流主要的区别是他们的的处理方式

字节流:处理字节和字节数组或二进制对象;

字符流:处理字符、字符数组或字符串。

如何选用

一、字符(Reader和 Writer):中文,字符是只有在内存中才会形成的,操作字符、字符数组或字符串,

二、字节(InputStream 和OutputStream):音频文件、图片、歌曲,所有的硬盘上保存文件或进行传输的时候,操作字节和字节数组或二进制对象,

如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。

节点流和处理流类型

节点流
类型字符流字节流
File(文件)FileReader
FileWriter
FileInputStream
FileOutputStream
Memory ArrayCharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputStream
Memory StringStringReader
StringWriter
-
Pige(管道)PipedReader
PipedWriter
PipedInputStream
PipedOutputStream
处理流
类型字符流字节流
BufferingBufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
FilteringFilterReader
FilterWriter
FilterInputStream
FilterOutputStream
Converting between
bytes and oharacter
InputStreamReader
OutputStreamWriter
Object
Serialization
ObjectInputStream
ObjectOutStream
Data conversionDataInputStream
DataOutputStream
CountingLineNumberReaderLineNumberInputStream
Peeking aheadPushbackReaderPushbackInputStream
PringtingPrintWriterPrintStream

转换流

​ 转换流非常的有用,它可以把一个字节流转换成一个字符流,转换流有两种,一种叫InputStreamReader,另一种叫OutputStreamWriter。InputStream是字节流,Reader是字符流,InputStreamReader就是把InputStream转换成Reader。OutputStream是字节流,Writer是字符流,OutputStreamWriter就是把OutputStream转换成Writer。把OutputStream转换成Writer之后就可以一个字符一个字符地通过管道写入数据了,而且还可以写入字符串。我们如果用一个FileOutputStream流往文件里面写东西,得要一个字节一个字节地写进去,但是如果我们在FileOutputStream流上面套上一个字符转换流,那我们就可以一个字符串一个字符串地写进去。

转换流测试代码:

public void test(){
    try{
        //OutputStreamWriter字符流 FileOutputStream//字节流
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"));
        osw.write("你好,世界!");
        System.out.println(osw.getEncoding()); //output: UTF-8
        osw.close();
        osw = new OutputStreamWriter(new FileOutputStream("D:/test.txt",true),"ISO8859_1");
        osw.write("你好");
        System.out.println(osw.getEncoding());//output: ISO8859_1
        osw.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值