您的位置:首页 > 编程语言 > Java开发

java文件IO流体系

2017-01-12 13:59 190 查看
字符流的体系;

----------| Reader  抽象类 , 所有输入字符流的基类。

---------------| FileReader 读取文件字符数据的输入字符流.

---------------| BufferedReader  该类出现的目的:提高读取文件字符数据的效率,对FileReader的功能进行了拓展---readLine()。    缓冲输入字符流 

 

--------| Writer  抽象类      所有输出字符流的基类。 

-----------| FileWriter  向文件输出数据的输出字符流.

-----------| BufferedWriter  缓冲输出字符流,  目的: 为了提高写文件数据的效率以及拓展FileWriter的功能。

像BufferedWriter缓冲类它的底层维护了一个缓冲字符数组,当数组中的存储满了才会传输出去,当没满时,需要调用flush或者是close方法数据才会真正的写出去。 或者字符数组已经存储满了,数据也一样会写出去。

例子:

File file = new File("F:/test.txt");

//建立数据的输入输出通道
FileWriter fileWriter = new FileWriter(file);
//相当于封装了FileWriter类
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("test");
//若不关闭或者flush刷新字符数组,它的test字符串不会输入到test.txt文件中去
bufferedWriter.close();

输入字节流的体系:

----------| InputStream 抽象类   所有输入字节流的基类

--------------| FileInputStream 读取文件数据的输入字节流

--------------|BufferedInputStream  缓冲输入字节流     该类的本质其实只是在内部维护了一个8kb的字节数组而已。   主要是为了提高我们的读取文件 的效率。

输出字节流:

----------| OutputStream  抽象类   所有输出字节流的基类。

----------------| FileOutputStream  向文件写出的数据的输出字节流

----------------| BufferedOutputStream  缓冲输出字节流
本质是在内部维护了一个8kb的字节数组。主要是为了提高我们的读取文件 的效率。

读取文件顺序:
//建立文件的输入通道。
FileReader fileReader = new FileReader(file);
//缓冲输入字符流
BufferedReader  bufferedReader = new BufferedReader(fileReader);
String line = null;(字符流的时候用它读取)
while((line = bufferedReader.readLine())!=null){
System.out.println(Arrays.toString(line.getBytes())); 
}

序列流:

SequenceInputStream(序列流)可以用于将多个文件合并到一起;
其若要合并个文件以上则需要通过Vector集合来接收再得到迭代器。

//找到目标文件对象
File inFile1 = new File("F:\\day01.txt");
File inFile2 = new File("f:\\day02.txt");
File inFile3 = new File("f:\\day03.txt");
File outFile = new File("f:\\总结.txt");

//建立数据的输入输出通道
FileOutputStream fileOutputStream = new FileOutputStream(outFile);

FileInputStream fileInputStream1 = new FileInputStream(inFile1);
FileInputStream fileInputStream2 = new FileInputStream(inFile2);
FileInputStream fileInputStream3 = new FileInputStream(inFile3);

Vector<FileInputStream> v = new Vector<FileInputStream>();   //Vector 是一个线程安全的类,操作效率低。 我想使用ArrayList
v.add(fileInputStream1);
v.add(fileInputStream2);
v.add(fileInputStream3);
Enumeration<FileInputStream> e = v.elements();  //通过Vector得到一个迭代器。

//创建一个序列流对象
SequenceInputStream inputStream = new SequenceInputStream(e);

若想用ArrayList集合则需要利用匿名内部类:
final Iterator<FileInputStream> it = list.iterator();

//创建一个序列流对象
SequenceInputStream inputStream = new SequenceInputStream(new Enumeration<FileInputStream>() {

@Override
public boolean hasMoreElements() {
return it.hasNext();
}

@Override
public FileInputStream nextElement() {

return it.next();
}
});

 PrintStream 打印流: 

打印流的好处:

  1. 打印流可以打印任意类型的数据。

  2. 打印流打印任意类型数据之前,会先把数据转成字符串然后再打印出去。

作用2: 收集日志信息

FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\\20150519.log"), true);
PrintStream printStream = new PrintStream(fileOutputStream);

try{
String str=null;
System.out.println("字符个数:"+ str.length());
int result  = 4/0; 
}catch(Exception e){

e.printStackTrace(printStream);
}

//标准的输出流默认是指控制台,可以进行修改。这样写后System.out.println的语句是录入文件中。
PrintStream printStream = new PrintStream(new File("F:\\b.txt"));
//修改标准的输出流
System.setOut(printStream);
System.out.println("hehe");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: