Java基础IO(流的概念)

流的概念

  流: 在Java中所有的数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质就是数据传输,根据数据传输特性将流抽象为各种类。
  ①按照流向分:输入流,输出流
  ②按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)

输入输出流

输入就是将数据从各种输入设备(文件,键盘等)中读取到内存中
输出正好相反,是将数据写入到各种输出设备(文件,显示器,磁盘等)
键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备

Java基础IO(流的概念)_第1张图片

Java基础IO(流的概念)_第2张图片

字节流,字符流

  File类不支持文件内容处理,如果要处理文件内容,就必须要通过流的操作模式来完成
在java.io包中,流分为两种:字节流和字符流
①字节流:数据流中最小的数据单元是字节。InputStream,OutputStream
②字符流:数据流中最小的数据单元是字符,Java中的字符是Unicode编码,一个字符占用两个字节。Reader,Writer
Java基础IO(流的概念)_第3张图片

一.字节流

1.FileInputStream和FileOutputStream

public class FileInputStream extends InputStream{}

·FileInputStream从文件系统中的某个文件中获得输入字节
·FileInputStream用于读取诸如图像数据之类的原始字节流

方法 解释
FileInputStream(File file) 通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的File对象file命名
FileInputStream(String name) 通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径命name命名


public class FileOutputStream extends OutputStream{}

·文件输出流是用于将数据写入到输出流File或一个FileDescriptor。文件是否可用或可能被创建取决于底层平台
·某些平台允许一次只能打开一个文件来写入一个FileOutputStream(或其他文件写入对象)。在这种情况下,如果涉及到的文件已经打开,则此类中的构造函数将失败

方法 解释
FileOutputStream(File file) 创建文件输出流以写入由指定的File对象表示的文件
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件


复制图片代码示例:

package com.bit;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class JavaIo {
    public static void main(String[] args) throws IOException {
        FileInputStream fin=new FileInputStream("E:\\icons\\icons\\wode1.png");
        FileOutputStream fout=new FileOutputStream("E:\\icons\\wode1.png");

        int len=0;
        byte[] buff=new byte[1024];
        //从此输入流中将最多buff.length个字节的数据读入一个buff字节数组中
        while((len=fin.read(buff))!=-1){
            fout.write(buff,0,len);   //将指定字节数组buff中从偏移量0开始的len个字节写入此文件输出流
        }

        //关闭流
        fin.close();
        fout.close();
    }
}

运行结果(成功复制到指定路径):
Java基础IO(流的概念)_第4张图片

2.字节缓冲流BufferedInputStream和BufferedOutputStream

为什么要有缓冲流?
  当使用read()读取文件时,每读一个字节,访问一次硬盘,效率很低。当文件过大时,操作起来也不是很方便。因此要用到buffer缓冲流,当创建buffer对象时,会创建一个缓冲区数组。读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出,效率更高

public class BufferedInputStream extends FilterInputStream

·BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。当创建BufferedInputStream时,将创建一个内部缓冲区数组

方法 解释
BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,输入流in,供以后使用
BufferedInputStream(InputStream in,int size) 创建BufferedInputtream具有指定缓冲区大小,并保存其参数,输入流in,供以后使用


public class BufferedOutputStream extends FilterOutputStream

方法 解释
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
BufferedOutputStream(OutputStream out,int size) 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流




文件拷贝代码示例

package com.bit;

import java.io.*;

public class BufferedStream {
    public static void main(String[] args) throws IOException {
        File file=new File("bit.txt");
        if(!file.isFile()){
            return;
        }

        BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bfos=new BufferedOutputStream(new FileOutputStream("src\\"+file.getName()));

        byte[] bytes=new byte[1024];
        int tmp=0;

        while((tmp=bfis.read(bytes))!=-1){
            bfos.write(bytes,0,tmp);
        }
        bfos.flush();
        bfos.close();
        bfis.close();
        System.out.println("copy成功!");
    }
}

运行结果(成功拷贝到src路径下):
Java基础IO(流的概念)_第5张图片



有无缓冲效率对比

package com.bit;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferRate {
    public static void main(String[] args) throws IOException {
        File file=new File("bit.txt");

        //缓冲流
        BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
        int tmp=0;
        long time=System.currentTimeMillis();
        while((tmp=bfis.read())!=-1){
            //System.out.println((char)tmp);
        }
        time=System.currentTimeMillis()-time;
        bfis.close();
        System.out.println("缓冲流读取:"+time+"ms");


        //非缓冲流
        FileInputStream fin=new FileInputStream(file);
        int tmp1=0;
        time=System.currentTimeMillis();
        while((tmp1=fin.read())!=-1){
            //System.out.println((char)tmp1);
        }
        time=System.currentTimeMillis()-time;
        fin.close();
        System.out.println("非缓冲流读取:"+time+"ms");
    }
}

运行结果:
Java基础IO(流的概念)_第6张图片



二.字符流

1.字符流FileReader和FileWriter

public class FileReader extends InputStreamReader

方法 解释
FileReader(File file) 创建一个新的FileReader,给出File读取
FileReader(String fileName) 创建一个新的FileReader,给定要读取的文件的名称


public class FileWriter extends OutputStreamWriter

方法 解释
FileWriter(File file) 给一个File对象构造一个FileWiter对象
FileWriter(String fileName) 构造一个给定文件名的FileWriter对象



复制文件代码示例:

package com.bit;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("E:\\icons\\icons\\bit.java");
        FileWriter fw=new FileWriter("E:\\icons\\bit.java");

        int ch;
        while((ch=fr.read())!=-1){
            fw.write(ch);
        }

       //释放资源
        fw.close();
        fr.close();
    }
}

运行结果(成功复制到指定路径):
Java基础IO(流的概念)_第7张图片



2.字符缓冲流BufferedReader和BufferedWriter

  为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。
  当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,之后使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,再次从文件中读取。

public class BufferedReader extends Reader

方法 解释
BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流
BufferedReader(Reader in,int size) 创建使用指定大小的输入缓冲区的缓冲字符输入流


public class BufferedWriter extends Writer

方法 解释
BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out,int size) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区



文件拷贝代码示例:

package com.bit;

import java.io.*;

public class CopyDemo {
    public static void main(String[] args) throws IOException {
        FileReader reader=new FileReader("E:\\icons\\icons\\bit.txt");
        BufferedReader breader=new BufferedReader(reader);

        FileWriter writer=new FileWriter("E:\\icons\\bit1.txt");
        BufferedWriter bwriter=new BufferedWriter(writer);

        String content="";
        while((content=breader.readLine())!=null){
            bwriter.write(content);
        }


        breader.close();
        reader.close();
        bwriter.close();
        writer.close();
    }
}

运行结果(成功拷贝):
Java基础IO(流的概念)_第8张图片

字节流和字符流对比

 1.字节流操作的基本单位是字节;字符流操作的基本单位为Unicode码元
 2.字节流在操作的时候本身不会用到缓冲区,是与文件本身直接操作的;而字符流在使用的时候使用到缓冲区
 3.所有文件的存储都是字节的存储,在磁盘上保留的是字节
 4.在使用字节流操作中,即使没有关闭资源,也能输出;而字符流不使用close方法不会输出任何内容


字符字节转换流

  转换的时候要用到OutputStreamWriter和InputStreamReader
InputStreamReader是Reader的子类,将输入的字节流转换成字符流

public class InputStreamReader extends Reader

·InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符

方法 解释
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in,Charset cs) 创建一个使用给定字符集的InputStreamReader



OutputStreamWriter是Writer的子类,将输出的字符流转换为字节流

public class OutputStreamWriter extends Writer

·OutputStreamWriter是字符流到字节流的桥:向其写入的字符编码成使用指定的字节charset

方法 解释
OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter
OutputStreamWriter(OutputStream out,Charset cs) 创建一个使用给定字符编集的OutputStreamWriter

你可能感兴趣的:(JavaWeb总结笔记)