在Java中进行文件的读写,Java IO流是必备的知识。
IO流指 的是输入输出流,用来处理设备上的数据。这里的设备指硬盘,内存,键盘录入,网络传输等。
按处理数据类型来分:字节流和字符流。
按流的方向来分:输入流和输入流。
简单来说,当需要读数据的时候,需要使用输入流,当需要写数据的时候,需要使用输出流。
什么时候使用字节流?什么时候使用字符流?
首先,任何数据存在硬盘上时,都是以二进制的形式存储的。而通过使用字节流,可以读取任意文件。字节流一次读取一个字节,而字符流使用了字节流读到一个或者多个字节时,去查找指定的编码表,返回对应的编码。所以字符流只能处理纯文本字符数据,而字节流可以处理更多类型的数据,比如图片,视频,音频文件等。因此,只要是纯文本数据处理,优先考虑使用字符流。其他情况就使用字节流。
学习对象的序列化和反序列化的意义?
在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输。序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或保存在文件、数据库里,并在需要时把该流读取出来重新构造一个相同的对象。
比如在Java编程中,对象的序列化可以将Java的对象转化为以byte为单位存储的文件,这种文件可以通过网络传输达到各个网络,然后通过反序列化解析成Java对象,是实现网络编程的基础。
字符流(Reader Writer)
字符的处理,一次处理一个字符;
字符的底层依然是基本的字节序列;
字符流的基本实现
InputStreamReader:完成byte流解析成char流,按照编码解析。
OutputStreamWriter:提供char流到byte流,按照编码处理。
注意:
- 字符流操作的是文本文件,不能操作其他类型的文件!!
- 默认按照GBK编码来解析(项目默认编码),操作文本文件的时候,要写文件本身的编码格式(在构造函数时在后面加上编码格式)!!
- 字符流和字节流的区别主要是操作的对象不同,还有字符流是以字符为单位来读取和写入文件的,而字节流是以字节或者字节数组来进行操作的!!
- 在使用字符流的时候要额外注意文件的编码格式,一不小心就会造成乱码!
字符流的文件读写流FileWriter和FileReader
字符流的文件读写流FileWriter和FileReader类,这两个类主要是对文本文件进行读写操作。
1 FileReader fr = new FileReader("C:\\Users\\acer\\workspace\\encode\\new4\\test1"); //输入流 2 FileWriter fw = new FileWriter(C:\\Users\\acer\\workspace\\encode\\new4\\test2");//输出流 1 char[] buffer=new char[8*1024]; 2 int c; 3 while((c=fr.read(buffer, 0, buffer.length))!=-1){ 4 fw.write(buffer, 0, c); 5 fw.flush(); 6 } 7 fr.close(); 8 fw.close();
字符流的过滤器BufferedReader&BufferedWriter
字符流的过滤器有BufferedReader和BufferedWriter/PrintWriter
除了基本的读写功能外,它们还有一些特殊的功能。
- BufferedReader----->readLine 一次读一行,并不识别换行
- BufferedWriter----->write 一次写一行,需要换行
- PrintWriter经常和BufferedReader一起使用,换行写入比BufferedWriter更方便
定义方式:
BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream(目录的地址))) BufferedWriter br =new BufferedWriter(new InputStreamWriter(new FileOutputStream(目录的地址))) PrintWriter pw=new PrintWriter(目录/Writer/OutputStream/File);
使用方法:
//对文件进行读写操作 String file1="C:\\Users\\acer\\workspace\\encode\\new4\\test1"; String file2="C:\\Users\\acer\\workspace\\encode\\new4\\test2"; BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(file1))); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file2))); String line; while((line=br.readLine())!=null){ System.out.println(line);//一次读一行,并不能识别换行 bw.write(line); //单独写出换行操作 bw.newLine(); bw.flush(); } br.close(); bw.close(); }
注意:
- 可以使用BufferedReader的readLine()方法一次读入一行,为字符串形式,用null判断是否读到结尾。
- 使用BufferedWriter的write()方法写入文件,每次写入后需要调用flush()方法清空缓冲区;PrintWriter在构造时可以指定自动flush,不需要再调用flush方法。
- 在写入时需要注意写入的数据中会丢失换行,可以在每次写入后调用BufferedReader的newLine()方法或改用PrintWriter的println()方法补充换行。
- 通常将PrintWriter配合BufferedWriter使用。(PrintWriter的构造方法,及使用方式更为简单)。
引自:http://www.cnblogs.com/hysum/p/7225762.html