今天总算把二进制的输入输出流的基础看完了。说一下总结:
一.各种流类的区别。
FileOutputStream对文件输出write函数的参数是int,或者byte[]。
而DataOutputStream支持对各种基本类型的读写。
在创建PrintWriter对象时把对应的new FileOutputStream作为参数,因为FileOutputStream是针对二进制文件,而PrintWriter则是文本文件,所以会出现问题。问题程序如下:
package textFileStream;
import java.io.*;
public class TextFileStream {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("TT3.txt");
FileOutputStream output = new FileOutputStream("c:/tt.dat",true);
byte[] s = {'a'};
output.write(s);
//output.close();
PrintWriter out = new PrintWriter(output);
out.print("Ssss");
out.flush();//如果没有这一句的话文件是不会出Ssss的,但出现这句话之后文件就正常了。
output.flush();
output.close();//如果不出现这一句,也即不关闭文件流对象时,文件内容也正常。
out.close();
}
//综上原因可能是因为out以output为参数,所以当output关闭时,输出到tt.dat的文件输出流也就停止了,再向里面print也没用了,而如果先out.close();那么文件中也会出现Ssss.这就是因为调用close()
}时强制刷新流,把输出流写到文件中。如果在output.close();之前调用out.flush();强制流刷新那么文件内容也正常。
二.说下对象流类。
1. 在用到对象类流时,有两个必检异常,一个是IOException,另外一个是在用到readObject();时会可能会抛出一个ClassNotFoundException.所以,在main函数中必须声明这两种异常,或者在程序中对他们进行try-catch。否则会出错。
2. 在用到readObject();时因为返回的是Object类型的对象,所以必须对之进行强制类型转换。否则会出错!
三.判断文件结尾。
目前我所知道判断文件是否到尾有三种方法
1. 文本文件的呢,可以通过判断input.hasNext();判断是否到了结尾。
1.
try
{
PrintWriteroutput = new PrintWriter("test.dat");
"Ssss");
output.close();
Scannerinput = new Scanner("test.dat");
while(input.hasNext())
System.out.println(input.nextLine());
}
catch(Exception ex)
{
System.out.println("All read!");
}
第二种方法是,因为文本文件的流类PrintWriter是强制必须写抛出异常,所以通过是否出现异常进行判断。两种方法代码如下:(程序中用到PrintWriter必须在main函数后声明throws Exception,或者在程序中写入try-catch,否则会报错)。
2.
try
{
PrintWriteroutput = new PrintWriter("test.dat");
"Ssss");
output.close();
Scannerinput = new Scanner("test.dat");
while(true)//this line haschanged!
System.out.println(input.nextLine());
}
catch(Exception ex)
{
System.out.println("All read!");
}
3.第三钟方法是用FileInputStream和BufferedInputStream的read()!=-1,这两种流的结尾都是-1.
使用如下:
BufferedInputStream input = new BufferedInputStream(...);
int value;
while((value=input.read())!=-1)
//process
三.读取文本文件存储到二进制文件的问题
RandomAccessFileinout = new RandomAccessFile("c:/t.txt", "rw");
inout.setLength(0);
for(int i = 0;i < 200;i++)
inout.writeInt(i);
inout.seek(0);
System.out.println("The first numberis: "+inout.readInt()+" "+inout.getFilePointer());
System.out.println("The first numberis: "+inout.readInt()+" "+inout.getFilePointer());
inout.close();
}
如上,假设t.txt其实是一个文本文件,那么在其中的一个整数就是一个字节,而二进制读取整数时是读取4个字节,所以会出错。而且如果t.txt中已经有4个整数,刚好四个字节,这个时候是可以读取头四个字节的,但显示的数字却跟我们想的不一样。目前还不知道那个显示的数字是怎么来的。希望知道的能告诉下我。