今天总算把二进制的输入输出流的基础看完了。说一下总结:

一.各种流类的区别。

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个整数,刚好四个字节,这个时候是可以读取头四个字节的,但显示的数字却跟我们想的不一样。目前还不知道那个显示的数字是怎么来的。希望知道的能告诉下我。