常用I/O流类型

尽管JDK中提供了众多的IO流类型,但是在开发使用的时候,经常用到的也不过是十余个。

在这里,做一下简单介绍。

  • FileInputStream / FileOutputStream

        java.io.FileInputStream用于从本地磁盘文件中读取字节数据。一般用法,先创建一个FileInputStream对象关联到要读取的文件,然后调用read方法读取字节数据到程序中,再进行其他处理。

         FileInputStream的构造方法中允许使用File或String类型的参数指定要读取的文件, 该文件必须存在,否则运行出错。 切记,FileInputStream的功能有其局限性,它并不适合获取文本文件中的字符信息。如:读取显示文件中如果含有双字节字符,则会显示乱码,此时应该选用字符流类型。

           FileOutputStream与FileInputStream相对应,用于将字节数据写出到文件中,两者均为节点流。如果进行写操作的目标文件不存在,则自动创建该文件,但是如果目标文件所在路径也不存在,则运行出错而不会自动创建该目录。

 

public class CopyFile {	
	public static void main(String args[]){
		try {
			FileInputStream fis = new FileInputStream("a.txt");
			FileOutputStream fos = new FileOutputStream("b.txt");
			
			 int b =  fis.read();
			 print("Copy...start:");
			 while(-1 != b){
				 fos.write(b);
				 b = fis.read();
			 }
			 fis.close();
			 fos.close();
			 print("Copy...finished!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public  static void print(Object o){
	System.out.println(o);
	}
}

  程序以字节为单位,读取指定文件中数据并写出到目标文件中,实现文件复制的功能。这种方式可以复制任何格式的 文件(如文本文件,音/视频文件以及可执行文件等其他二进制文件),因为其以字节为单位进行数据复制时并不对文件内容进行解析。

  • FileReader/FileWriter

      java.io.Reader用于以字符为单位读取文本文件,而java.io.Writer类用于将字符数据写出到文本文件中,两者均为节点流,可以在这两个类的构造方法中以String或File类型参数的指定存取文件。

public class Test {
	public static void main(String args[]){
		FileReader reader;
		FileWriter writer = null;
		try {
			reader = new FileReader("a.txt");
			writer = new FileWriter("c.txt");
		int read = reader.read();
		print("Copy... start:");
		while(-1 != read){
			writer.write(read);
			read = reader.read();
		}
		reader.close();
		writer.close();
		print("Copy...finish!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public  static void print(Object o){
		System.out.println(o);
	}
}

 本示例实现了以字符(char)为单位的文件复制功能,其中FileWriter还可以在构造方法中指明是否以追加的方式写文件(默认为覆盖方式),该重载方法的格式如下:

public FileWriter(String fileName,boolean append)

其中,如调用方法时指定boolean类型参数append的值为true,则新写入的内容将不会覆盖目标文件原有内容而是追加到其尾部。

 

  • BufferedReader/BufferedWriter

          java.io.BufferedReader属于处理流,用于从其他的字符输入流读取文本,它将多个字符存入缓存以提供读取字符,字符数组或行的有效方法。采用缓冲处理是为了提高效率,如果没有缓存,如FileReader对象,每次都调用read()方法进行读操作时,都会直接去文件中读取字节,转换为字符并返回,这样频繁的读取文件效率很低。

         BufferedReader所封装的字节输入流对象需要在构造方法中指定。缓冲区的容量也可以在一个构造方法中指定,但一般使用默认值,默认值也足够大能够满足多种用途。

           public BufferedReader(Reader in)

           public BufferedReader(Reader in, int size)

            java.io.BufferedWriter与java.io.BufferedReader相对应,提供字符的缓冲写出功能。当频繁的执行字符写操作时,可使用BufferedWriter对相关的字符输出流(如:FileWriter)进行封装以提高运行效率。

            BufferedWriter类中的newLine()方法写出平台相关的行分隔符来标记一行的终止,此行分隔符由系统属性“line.separator”确定,下面是一个BufferedReader 与 BufferedWriter的示例。

 

public class Test2 {
	public static void main(String[] args) {
		FileReader fs = null;
		FileWriter fw = null;
	try {
		fs = new FileReader("a.txt");
		fw = new FileWriter("d.txt");
		BufferedReader reader = new BufferedReader(fs);
		BufferedWriter writer = new BufferedWriter(fw);
		print("Copy...start:");
		String content = reader.readLine();
		while(null != content){
			writer.write(content);
			writer.newLine();
			content = reader.readLine();
		}
		reader.close();
		writer.close();
		print("Copy...finish!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void print(Object o){
		System.out.println(o);
	}
}
 
  • InputStreamReader/OutputStreamWriter

        java.io.InputStreamReader属于处理流,是从字节流到字符流的转换桥梁,用于封装其他的字节输入流并从中读取字节数据,然后将之按照特定的字符编码规则转换为字符,其所使用的字符编码可以在构造函数中指定,也可以使用平台的默认字符编码。其构造方法格式为:

   public InputStreamReader(InputStream in)

   public InputStreamReader(InputStream,String enc)

       InputStreamReader 对象每次调用read()方法时,都会导致它从所封装的字节输入流中读取一个或多个字节。为提高效率,通常将InputStreamReader与BufferedReader封装在一起使用,如:使用BufferedReader封装InputStreamReader,进而读取InputStream中的数据是很普遍的做法。

        java.io.OutputStreamWriter与InputStreamWriter,可按照特定的字符编码规则把字符转换为字节并写出到它所封装的字节输出流 。为提高效率,通常把OutputStreamWriter封装在BufferedWriter中。

       除了读取键盘输入的传统方法中使用了InputStreamReader外,一般不直接使用这个两个类。

  • DataInputStream/DataOutputStream

          java.io.DataInputStream属于处理流,它能够以一种与机器无关的方式,直接从底层字节输入流中读取Java的基本类型和String类型的数据,而相应的java.io.DataOutputStream则能够则能够直接将Java基本类型数据写出其他的字节输出流,随后可以使用DataInputStream输入流读取这些数据。

         DataInputStream类中定义了多个方法,用以实现读取Java基本数据类型及String类型数据,其中常用的有:

     public DataInputStream(InputStream in)

     public final int read(byte b[])

     public final int read(byte b[],int off,int len)

     public final  boolean readBoollean()

     public final byte readByte()

     public final char readChar()

     public double readDouble()

     public float readFloat()

     public int readInt()

     public final long readLong()

     public final short readShort()

     public final String readUTF()

    从所包含的输入流中读入一个使用UTF-8修改版格式编码的字符串。

public class Test3 {
	public static void main(String[] args) {
		 FileOutputStream fos;
		 DataOutputStream dos;
		 FileInputStream fis;
		 DataInputStream dis;
		 try {
			fos = new FileOutputStream("myfile.data");
			dos = new DataOutputStream(fos);
			dos.writeUTF("休.格兰特");
			dos.writeInt(40);
			dos.close();
			fis = new FileInputStream("myfile.data");
			dis = new DataInputStream(fis);
			print(" name:" + dis.readUTF());
			print("  age:" + dis.readInt());
			dis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void print(Object o){
		System.out.println(o);
	}
}
 

需要注意的是,程序运行时用于保存数据的文件myfile.data并不是文本文件,其中数据的存储格式与JVM内存中数据的存储格式相同。

可以看出DataInputStream与DataOutputStream传输数据时数据的格式是平台无关的,这一特性用在跨平台的数据通信时是非常有效的,将来我们在基于socket技术实现不同计算机/平台的Java应用程序间的数据传输时就会用到这个两个类。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值