IO流相关类


代码:

package io;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;
import java.util.Random;
import java.util.StringTokenizer;

public class MyTestIO {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		//----FileInputStream/FileOutputStream---文件字节输入/输出流
		InputStream is = new FileInputStream("E:\\IO_resouce\\a.txt");
		OutputStream os = new FileOutputStream("E:\\IO_resouce\\b.txt",true);
		int c ;
		byte [] b = new byte[100];
		while((c = is.read(b,0,2))!=-1){//汉子占两个字节,所以如果读取汉字,每次至少读两个字节到缓冲中,c是返回读取的字节数
			os.write(b,0,c);
			String s = new String(b,0,20);
			System.out.println(s);
		}
		
		//----FileReader/FileWriter--文件字符输入流/输出流
		FileReader fr = new FileReader("E:\\IO_resouce\\a.txt");
		File file = new File("E:\\IO_resouce\\c.txt");
		FileWriter fw = new FileWriter(file,true);
		int ch ;
		char[] s = new char[20];
		Random ran = new Random();
		int dom = ran.nextInt(100);
		fw.write(dom);
		fw.write("|");
		fw.flush();
		while((ch = fr.read(s,0,2)) != -1){
			fw.write(s);
		}
		fw.flush();
		fw.close();
		
		//----BufferedReader/BufferedWriter:缓冲流,两者的源和目的流必须是字符数据流和字符输出流
		Reader fileR = new FileReader("E:\\IO_resouce\\stu.txt");
		BufferedReader br = new BufferedReader(fileR);
		
		Writer filew = new FileWriter("E:\\IO_resouce\\stucopy.txt",true);
		BufferedWriter bw = new BufferedWriter(filew);
		
		String str ;
		while((str = br.readLine())!=null){//每次读一行
			
			/*StringTokenizer st = new StringTokenizer(str);
			int count = st.countTokens();*/
			int count = str.length();
			bw.write(str + "**句子中字符个数为:" + count);//每次写一行
			bw.newLine();//新起一行
		}
		
		bw.flush();//刷新缓存,将缓冲区数据刷到硬盘
		bw.close();//关闭缓冲输出流
		br.close();//关闭缓冲输入流
		
		fileR = new FileReader("E:\\IO_resouce\\stucopy.txt");
		br = new BufferedReader(fileR);
		String st =  null;
		while ((st = br.readLine()) != null){
			System.out.println(st);
		}
		
		br.close();
		fr.close();
		
		//----RandomAccessFile:随机流
		
		//--ByteArrayInputStream/ByteArrayOutputStream --字节数组流,源和目的是计算机内存,写到缓冲区。
		ByteArrayOutputStream outbyte = new ByteArrayOutputStream();
		byte [] byteContent = " Happy New Year ".getBytes();
		outbyte.write(byteContent);
		
		ByteArrayInputStream inbyte = new ByteArrayInputStream(outbyte.toByteArray());
		byte[] backdata = new byte[byteContent.length];
		inbyte.read(backdata);
		System.out.println(new String(backdata));//String s = new String(byte[]),或者new String(byte[],'Gb2312'),使用当前机器的默认编码将字节数组转化为字符串。
		
		byte[] demobyte = " 测试 123 !".getBytes();
		ByteArrayInputStream demo = new ByteArrayInputStream(demobyte);
		byte[] backdata2 = new byte[demobyte.length];
		demo.read(backdata2);
		System.out.println(new String(backdata2));
		
		//--CharArrayWriter/CharArrayReader--
		CharArrayWriter outchar = new CharArrayWriter();
		char[] chContent = " 新年快乐 ".toCharArray();
		outchar.write(chContent);
		//outchar.write(" 新年快乐 ");
		
		CharArrayReader inchar = new CharArrayReader(outchar.toCharArray());
		char[] backinfo = new char[chContent.length];
		inchar.read(backinfo);
		System.out.println(new String(backinfo));
		
		
		//----DataInputStream/DataOutputStream---文件字节输入/输出流
		FileOutputStream x = new FileOutputStream("E:\\IO_resouce\\apple.txt");
		DataOutputStream dos = new DataOutputStream(x);
		dos.writeInt(100);
		dos.writeLong(123456);
		dos.writeFloat(3.1415926f);
		dos.writeDouble(98765.4321);
		dos.writeBoolean(true);
		dos.writeShort('x');
		dos.writeUTF(" 我是英雄rom .");
		dos.writeChars(" how are you ! ");
		
		FileInputStream y = new FileInputStream("E:\\IO_resouce\\apple.txt");
		DataInputStream dis = new DataInputStream(y);
		System.out.println(dis.readInt());
		System.out.println(dis.readLong());
		System.out.println(dis.readFloat());
		System.out.println(dis.readDouble());
		System.out.println(dis.readBoolean());
		System.out.println(dis.readShort());
		System.out.println(dis.readUTF());
		char cc = '\0'; //'\0'表示空字符
		/*while((cc = dis.readChar()) != '\0'){
			System.out.println(cc);
		}*/
		
		//--ObjectInputStream/ObjectOutputStream--对象输入/输出流
		TV tv = new TV();
		tv.setName("changhong");
		tv.setPrice(1200);
		
		File f = new File("E:\\IO_resouce\\television.txt");
		FileOutputStream fos = new FileOutputStream(f);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(tv);
		oos.close();
		
		FileInputStream fis = new FileInputStream(f);
		ObjectInputStream ois =  new ObjectInputStream(fis);
		TV tv2 = (TV) ois.readObject();
		System.out.println(tv2.getName());
		ois.close();
		
		tv2.setName("xinfei");
		tv2.setPrice(2300);
		System.out.println(tv2.getName());
		
		
		//继承自InputStream/OutputStream的类操作字节流,继承自Writer/Reader的类操作字符流。
	}

	
}


class TV implements Serializable{
	
	private String name ;
	private int price;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
}

知识点:

1.inputstream /outputstream  是抽象类,其内部 read/write方法只写低8位,高24位忽略。
fileinputstream /fileoutputstream 继承 inputstream /outputstream 类  ,其中write()方法 的参数是byte[].
DataOutputStream extends FilterOutputStream implements DataOutput. 它的写读方法是若参数是int类型(即writeInt()),调用inputstream /outputstream的
读写方法--读4次,若是long则读8次,writeChar(int v)则需要读2次。
read()方法返回的整数范围是0-255的原因,一个字符8位最大长度是Unicode编码是255。
程序结束时会自动关闭所有打开的流,但是显示的关闭仍是好习惯,如果打开的流没有被关闭,则不允许另外的程序操作这些流中所用到的资源。
2.输出流指向的文件若不存在则创建,若存在则刷新该文件,使文件的长度为0.可以使用 FileOutputStream(String name, boolean append),如果文件已存在
,则 append 为true时,输出流不会刷新所指的文件,只是从文件末尾向文件写入数据。
一般inputstream中read(byte b[])/read(byte b[], int off, int len)返回的为字节数,而read()则返回的为输入流的下一个字节。
每次调write()方法 顺序的 向目的文件写数据,直到输出流被关闭。
显示的调close()可以保证把操作系统流缓冲区的内容写到目的地(输出文件),关闭输出流可以把该流所用到的缓冲区的内容冲洗掉(通常冲洗到硬盘文件上)。
3.当使用对象输入输出流时,要保证对象是可序列化的,这是为了保证能把对象写到文件,并能再把对象正确的读回到程序中;需注意,不仅该对象,而且该对象的成员对象也必须是序列化的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值