概念
在上节中,我们只能往文件中读写二进制的数据,FileOutputStream和FileInputStream都只能进行单个字节的读写,可如果我们要写一些int类型类型的数据到文件中(4个字节),那我们就需要用到过滤器了。
实例
通过增加过滤器DataOutputStream可以处理基本数据类型
public class test {
public static void main(String[] args){
System.out.println("hello");
byte[] buffer = new byte[10];
for(int i=0; i<buffer.length; i++) {
buffer[i] = (byte)i;
}
try {//打开一个文件,在文件上面接了一个缓冲过滤器,缓冲上面接了一个可以写复杂数据的Data过滤器得到一个out对象
//可以用out向文件中写基础数据,当它写到流里面得过程中,它会被缓冲(buffered),最终会写到文件中(file)
DataOutputStream out = new DataOutputStream( //可以写复杂的数据
new BufferedOutputStream( //起到缓冲区的作用
new FileOutputStream("a.dat"))); //可以单个字节得写数据
int i = 0x12; //String i = "sun";
out.writeInt(i); //out.writeUTF(i);
out.close();
DataInputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("a.dat")));
int j = in.readInt(); //String j = in.readUTF();
System.out.println(j);
} catch (IOException e) {
e. printStackTrace();
}
}
}
结果
在工作目录下生成一个a.dat文件,里面会以二进制得形式存储你输入的数据
控制台结果:
hello
18
当我们要处理(输入输出)人可以读的文本,可以使用Reader/Writer
- 二进制采用InputStream/OutputStream
- 文本数据采用Reader/Writer
现在我们的文本一般都不是unicode的编码,就算是unicode,大部分也是utf8的编码形式。
当文件不是unicode时,我们借助流(Stream)来打开文件,在Stream的基础上以过滤器的方式去建立Reader/Writer来实现文本的输入和输出。
如果你想要产生相应的文本的内容,我们就去建立一个PrintWriter,这个PrinterWriter建立在OutputStreamWriter上,最终建立在FileOutputStream的基础上。这样写下来的文件是一个ascii码或国标码(GB2312或GBK)的文件,而这取决于你的系统。
public class test {
public static void main(String[] args){
byte[] buffer = new byte[10];
for(int i=0; i<buffer.length; i++) {
buffer[i] = (byte)i;
}
try {
//先用file打开a.dat文件,现在可以输入二进制数据;用output作为桥梁的连接Stream和Writer
//(输入的是Stream输出的是Writer)然后用buffered来缓冲Writer,最后得到一个Writer类型的out
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("a.txt"))));
int i = 0x12;
out.println(i);
out.close();
BufferedReader in = new BufferedReader(
new LineNumberReader(
new InputStreamReader(
new FileInputStream("src/hello/Main.java")/*"uft8"*/)));//本文件路径
//当文件的编码格式和默认的不同时,在InputStreamReader的括号中输入编码格式
String line;
while((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
} catch (IOException e) {
e. printStackTrace();
}
}
}
结果会在工作目录下生成一个a.txt的文件,在控制台输出如上的代码。
数据读取的选择
是二进制:
InputStream
如果你想读出Java的基本数据类型,则可以用DataInputStream来读
不是二进制:
Reader:把文本当成文章来读,在数据上面构建一个Reader,用Reader的readLine()获取它每一行的东西。
Scanner:把文本当数据来读,如用空格分隔等操作