简介
字节输入流的抽象基类是InputStream,常用子类是FileInputStream和BufferedInputStream。
字符输入流抽象基类是Reader,常用的子类是BufferReader,InputStreamReader,FileReader。
二 普通输入流和带缓存的字节输入流区别
字节流
1.FileInputStream
一切文件在系统中都是以字节形式保存的,需要用FileInputStream从磁盘中读取字节序列。
对应的方法有:
- read():从输入流中读取单个字节数据;如果已经到达文件末尾,则返回-1;
- read(byte[] byte):从输入流中将最多byte.length个字节的数据读入到一个byte数组,以整数形式返回存入数组中的实际字节个数;如果已经到达文件末尾,则返回-1;
- read(byte[] byte,int begin,int end)
- FileOutputStream.flush():刷新字节输出流并强制写出缓存内所有字节数据。
2.BufferedInputStream
带缓冲的字节输入流:文件字节输入流的读取时,是直接同字节流中读取的。由于字节流是硬件(存储介质)进行读取的,所以速度比较慢。cpu需要使用read()…读取数据时就要受到硬件IO的慢速度限制。
cpu与内存的读写速度比IO快,所以,在内存中建立缓存区,先把存储介质的字节读取到缓存区中。cpu需要数据时直接从缓存中读取,缓存区要足够大,在读完后又触发fill()函数自动从存储介质的文件字节内容中读取字节存储到缓存区数组。
BufferedInputStream内部有一个缓存区,默认是8M。
字符流
1 FileReader
int readLine():
int read():
int read(char[] buf):
itn read(char[] buf,int off,int len):
void close():
2 BufferedReader
转换流
inputStreamReader
BufferedReader,BufferedWrite
以上是输入流,输出流类似。下边是实例代码分享:
实例代码
package com.souche;
import java.io.*;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) {
File file = new File("/Users/hh/Desktop/1234hh");
File fileout = new File("/Users/hh/Desktop/1234hh");
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
fileInputStream = new FileInputStream(file);
fileOutputStream = new FileOutputStream(fileout);
//1.FileInputStream
//read()
/*
int read;
while (-1 != (read = fileInputStream.read())){
fileOutputStream.write(read);
}
*/
//read(byte[])
/*
byte[] bytes = new byte[2];
int read;
while(-1 !=(read = fileInputStream.read(bytes))){
fileOutputStream.write(bytes);
}
fileOutputStream.flush();
*/
//read(byte[], int begin , int len)
//2.BufferInputStream
/*
bufferedInputStream = new BufferedInputStream(fileInputStream);//默认是8M
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[2];
int read;
while (-1 != (read = bufferedInputStream.read(bytes))){
bufferedOutputStream.write(bytes);
}
bufferedOutputStream.flush();
*/
//3.InputStreamReader,来进行转码
String line = null;
//字节流不存在乱码,所以可以确保读入流的文件是什么编码,转换的时候用什么编码,否则默认是平台编码
//输出流的编码是根据写入流的编码
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("/Users/hh/Desktop/1234hh));
while(null != (line = bufferedReader.readLine())){
bufferedWriter.write(line);
bufferedWriter.newLine();
}
bufferedWriter.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(null != fileInputStream){
fileInputStream.close();
}
if(null != fileOutputStream){
fileOutputStream.close();
}
if(null != bufferedInputStream){
bufferedInputStream.close();
}
if(null != bufferedOutputStream){
bufferedOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}