1.定义:
Java中的I/O技术可以将数据文件保存到二进制文件中、二进制文件甚至于是ZIP压缩文件中,以至于达到永久保存数据的要求。在Java语言中,输入和输出流都被称为抽象的流,流可以看作是一组有序的字节集合。Java中的流分类如下:
2.分类:
- 字节流:以字节(8bit)为单位:InputStream 和 OutStream
- 字符流:以字符(16bit)为单位:Reader 和 Writer
两者最大的区别是:字符流在处理输入和输出的时候用到了缓存;而字节流没有。文件在存储在硬盘或者的网络传输时都是以为字节的方式进行存储的;而字符在内存中才会形成。
下图展示了,如何查看一个文件的字节大小(这不是非常普通的操作吗?)
3.输入流
3.1InputStream:
是字节输入流的抽象类,是所有字节输入流的父类。(该类中所有的方法都会引发OIException)
3.2Reader:
Java中的字符是Unicode编码,是双字节的。InputStream是用来处理字节的,并不合适字符文本。java为字符文本提供了一套单独的类Reader。
4.输出流
4.1OutputSteam:
是字节输出流的抽象类,此抽象类是输出字节流的所有类的超类。
4.2Writer
是字符输出流的抽象类,所有字符输出类型的实现都是它的子类。
5.File类
File类是java.io包中唯一代表磁盘文件本身的对象。数据流可以将数据写到文件中,文件也是数据流中最经常用得到的数据媒体。
FileInputStream 和 FileOutputStream
package com.dong.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
File file = new File("word.txt");
try {
//创建FileOutputStream对象,输出流:保存到文件中
FileOutputStream out = new FileOutputStream(file);
//创建byte数组
byte buy[] = "我有一只小毛炉。".getBytes();
out.write(buy);
//显示关闭输出流
out.close();
} catch (IOException e) {//Check Exception
e.printStackTrace();
}
try {
//输入流,从文件中读取
FileInputStream input = new FileInputStream(file);
//创建字节数组
byte byt[] = new byte[2014];
int len = input.read(byt);
System.out.println(new String(byt,0,len));
input.close();
} catch ( IOException e) {
e.printStackTrace();
}
}
}
运行结果:
我有一只小毛炉。
FileReader和FileWriter
使用FileOutputStream类向文件中写入数据,FileInputStream从文件中读取数据,这两个类都只是提供了对字节或者是字节数组的读取方法。
由于汉子在文件中存在着两个字节,这时候使用字节流,读取不好的时候有可能会出现乱码的情况。这时候使用Reader或者Writer类即可避免这种情况。
BufferedInputStream和BufferedOutputStream
BufferedReader 和 BufferedWriter
package com.dong.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
String content[] = {"好久不见","最近好吗","常联系!"};
File file = new File("Word.txt");
//写操作
try{
FileWriter fw = new FileWriter(file);
BufferedWriter bufw = new BufferedWriter(fw);
for(int i = 0;i<content.length;i++){
bufw.write(content[i]);
bufw.newLine();//写入一个行分隔符
}
bufw.close();
fw.close();
}catch(Exception e){
}
//读操作
try{
FileReader fr = new FileReader(file);
BufferedReader bufr = new BufferedReader(fr);
String s = null;
int i = 0;
while((s=bufr.readLine())!= null){
i++;
System.out.println("第"+i+"行:"+s);
}
bufr.close();
fr.close();
}catch(Exception e){
}
}
}
运行结果:
第1行:好久不见
第2行:最近好吗
第3行:常联系!
一个文件中的数据要在控制台上显示,首先需要:使用**FileInputStream** fin = new FileInputStream(this.filename);
工作中遇到的问题
1.写一个大文件的时候,写的文件内容不全,原因是少了 bufferedWriter.flush()
FileWriter fileWriter = new FileWriter("文件路径.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("中文A4");//此时数据还在缓存中
bufferedWriter.flush(); //FileWriter.write(),此時数据才真正的写入文件中
bufferedWriter.close();