java IO流总结
程序员文章站
2024-03-04 21:48:48
...
流:流是一组有序的,有起点、终点的字节集合,是对数据传输的总称和抽象。即数据在两设备间的传输称为流,流的本质是数据传输。根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
根据处理数据类型不同分类:字符流和字节流
根据数据流向不同分为:输入流和输出流
根据是否直接连接数据源分为:节点流和处理流(装饰流)
字符流和字节流的区别:
字节流:一次读入或读出8位二进制(一个字节),能处理所有类型的数据。
字符流:因为数据编码的不同,为了对字符进行更高效操作,产生了字符流,其本质基于字节流。一次读入或读出16位二进制(一个字符),根据码表映射字符,一次可读取多个字节,只能处理字符类型数据。
节点流:直接连接数据源的流类,实现将数据源转换为流对象,实体流类可单独使用,例如:FileInputStream/FileOutputStream和FileReader/FileWriter。
装饰流:不直接连接数据源,而是以其他流对象为基础建立的流类,实现将实体流中数据进行转换,增强流对象的读写能力,必须配合实体流或装饰流进行使用。被称为“流的嵌套”,它不改变原来流对象中数据的内容,只是进行了一些功能的增强。例如:DataInputStream/DateOutputStream、BufferReader和BufferWriter和ObjectInputStream/ObjectOutputStream。
下面给出FileInputStream、BufferInputStream、BufferReader读写文件的例子:
package stream;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class StreamTest {
public static void main(String[] args) {
String fileName = "L:\\Workspace\\Test\\src\\stream\\StreamTest.java";
String result = null;
result = readByFileInputStream(fileName);
System.out.println("result1: " + result);
result = readByBufferInputStream(fileName);
System.out.println("result2: " + result);
result = readByBufferedReader(fileName);
System.out.println("result3: " + result);
}
/**
* 使用BufferInputStream读取文件
* @param fileName
*/
public static String readByBufferInputStream(String fileName) {
BufferedInputStream bufferInputStream = null;
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File(fileName));
bufferInputStream = new BufferedInputStream(inputStream);
int size = bufferInputStream.available();
byte[] tmpArr = new byte[size];
bufferInputStream.read(tmpArr);
return new String(tmpArr);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != bufferInputStream) {
try {
bufferInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 使用FileInputStream读取文件
* @param fileName
*/
public static String readByFileInputStream(String fileName) {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File(fileName));
int size = inputStream.available();
byte[] tmpArr = new byte[size];
inputStream.read(tmpArr);
return new String(tmpArr);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 使用BufferedReader读取文件
* @param fileName
*/
public static String readByBufferedReader(String fileName) {
FileReader reader = null;
BufferedReader bufferReader = null;
String result = null;
try {
reader = new FileReader(new File(fileName));
bufferReader = new BufferedReader(reader);
String line = null;
StringBuilder builder = new StringBuilder();
while (null != (line = bufferReader.readLine())) {
builder.append(line).append('\n');
}
result = builder.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != bufferReader) {
try {
bufferReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
}
参考:http://blog.csdn.net/zhaoyanjun6/article/details/54292148