黑马程序员 IO流(二)

  

 ----------android培训java培训、java学习型技术博客、期待与您交流! -----------

1,DataInputStream,DataOutputStream

              直接在文件上对基本数据类型操作,否则用fielInputstream,fileoutputstream,filereader,filewriter读基本类型时,还要很多转换,但是 需要写入顺序和读取顺序一致才可以

DataOutputStream写入操作:

public static void writeData() throws IOException{
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
		dos.writeInt(234);
		dos.writeBoolean(true);
		dos.writeDouble(456.823);
		dos.close();
	}

验证结果:


从结果可以看出,用DataOutputStream写数据时,编码方式不是普通编码了,这是特定的编码,可以有效的保护数据的安全性。

DataInpputStream读入操作:

public static void readData() throws IOException{
		DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
		int num = dis.readInt();
		boolean b = dis.readBoolean();
		double d = dis.readDouble();
		System.out.println(num);
		System.out.println(b);
		System.out.println(d);
		dis.close();
	}

验证结果:

从结果中看出,数据可以完整的读取出来。

2,DataInputStream,DataOutputStream处理文字:

为了解决字符问题,DataInputStream,DataOutputStream加入了两个方法readUTF,writeUTF来处理字符

public static void writeUTFDemo() throws IOException{
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("utfdata.txt"));
		dos.writeUTF("你好");
		dos.close();
	}

验证结果:

用readUTF读取数据

public static void readutfDemo() throws IOException{
		DataInputStream dis = new DataInputStream(new FileInputStream("utfdata.txt"));
		String str = dis.readUTF();
		System.out.println(str);
		dis.close();
	}

验证结果:


3,PipedInputStream,PipedOutputStream管道流

         管道流的特点是它具有将一个程序的输出当作另一个程序的输入的能力。在Java中,可以使用管道流进行线程之间的通信,输入流和输出流必须相连接,这样的通信有别于一般的Shared Data通信,其不需要一个共享的数据空间。

public class pipeStreamDemo {

	public static void main(String[] args) throws IOException {
		PipedInputStream in = new PipedInputStream();
		PipedOutputStream out = new PipedOutputStream();
		in.connect(out);//连接管道
		Read r = new Read(in);
		Write w = new Write(out);
		new Thread(r).start();
		new Thread(w).start();
	}
}
class Read implements Runnable{

	private PipedInputStream in;
	
	public Read(PipedInputStream in) {
		super();
		this.in = in;
	}

	@Override
	public void run() {
		try {
			byte[] buf = new byte[1024];
			System.out.println("读取前,没有数据阻塞");
			int len =in.read(buf);//阻塞式读取数据
			System.out.println("读到数据,");
			String s = new String(buf, 0,len);
			System.out.println(s);
			in.close();
			
		} catch (Exception e) {
			throw new RuntimeException("管道读取流失败");
		}
	}
}
class Write implements Runnable{
	private PipedOutputStream os;
	
	public Write(PipedOutputStream os) {
		super();
		this.os = os;
	}

	@Override
	public void run() {
		try {
			System.out.println("开始写数据,等待6秒后...");
			Thread.sleep(6000);
			os.write("piped lai le".getBytes());
			os.close();
		} catch (Exception e) {
			throw new RuntimeException("管道输出流失败");
		}
		
	}
}

验证结果:

4,PrinterWriter的使用

          在前面的学习中,一般用BufferedWriter写入数据,现在用PrinterWriter来写入数据,不管是在本地的数据传送,还是在网络中,PrinterWriter应用范围很广。

public class printer {
	public static void main(String[] args) throws IOException {
		method();
	}
	
	public static void method() throws IOException{
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		//打印流的基本设置,加true自动刷新,一般的输出用打印流,不用bufferedwriter了
		PrintWriter pw = new PrintWriter(System.out,true);
		String str = null;
		while((str = bufr.readLine())!=null){
			if("over".equals(str)){
				break;
			}
			pw.println(str.toUpperCase());
		}
		bufr.close();
		pw.close();
	}
}

验证结果:



5,RandomAccessFile

        基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。

public static void wrriteFile() throws IOException{
		RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");
		raf.write("李四".getBytes());
		raf.writeInt(97);
		raf.write("王五".getBytes());
		raf.writeInt(99);
		raf.close();
	}
	
	public static void wrriteFile_2() throws IOException{
		RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");
		raf.seek(10*2);//选择写入的位置
		raf.write("周七".getBytes());
		raf.writeInt(103);
		raf.close();
	}

验证结果:


读取文件:

public static void readFile() throws IOException{
		RandomAccessFile raf = new RandomAccessFile("ran.txt", "r");
		byte[] buf = new byte[6];
		//raf.seek(10);
		raf.skipBytes(10);//跳过10个字节
		raf.read(buf);
		String name = new String(buf);
		int age = raf.readInt();
		System.out.println(name);
		System.out.println(age);
		raf.close();
	}

验证结果:



6,ObjectInputStream,ObjectOutputStream

          ObjectInputStream,ObjectOutputStream的作用主要用于本地对象的持久化,读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入

要持久化的类:

class Person implements Serializable{
	public static final long serialVersionUID = 42L;
	String name;
	transient int age;
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String toString(){
		return name+" : "+age;
	}
}

对象持久化写入操作:

public class ObjectInputStreamDemo {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		writeObj();
		readObj();
	}
		
	public static void writeObj() throws FileNotFoundException, IOException{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
		oos.writeObject(new Person("chenlong",25));
		oos.close();
	}

}

验证结果

;

对象持久化读出操作:

public class ObjectInputStreamDemo {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		writeObj();
		readObj();
	}
	
	public static void readObj() throws FileNotFoundException, IOException, ClassNotFoundException{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
		Person p = (Person) ois.readObject();
		System.out.println(p);
		ois.close();
	}
	
}

验证结果;


对象持久化小知识点:

          1,write(int) --8位
              writeInt(int)--32位
          2,初始化需要传入一个流对象fileinputstream,fileoutputstream
          3,实现的 Serializable{接口为标记接口,没有实现方法,产生的id号是根据成员方法和成员属性计算出来的

7,Properties操作

           properties是hashtable的子类,作用是配置软件的一些信息

public static void setandGet(){
		//properties是hashtable的子类,作用是配置软件的一些信息
		Properties p = new Properties();
		p.setProperty("chenlong", "25");
		p.setProperty("wangjie", "24");
		
		System.out.println(p);
		//因为p中的键值对是唯一的,所以可以用set集合存储
		Set<String> names = p.stringPropertyNames();
		for(String s : names){
			System.out.println(s+":"+p.getProperty(s));
		}
	}

验证结果:



           从文本中读取配置文件

public static void method_1() throws IOException{
		//配置文件以文本的形式存储在文本中,当软件 启动时
		//就直接从配置文件中读取,文本文件是以键值对的形式存在
		BufferedReader bufr = new BufferedReader(new FileReader("propert.txt"));
		String line = null;
		Properties prop = new Properties();
		while((line = bufr.readLine())!=null){
			String[] arr = line.split("=");
			prop.setProperty(arr[0], arr[1]);
		}
		bufr.close();
		System.out.println(prop);
	}

源文件:


打印的结果:


          配置文件的读写操作(在文本中操作)

public static void method_2() throws IOException{
		//初始化配置文件同样需要IO操作,需要
		FileReader fr =new FileReader("propert.txt");
		Properties prop = new Properties();
		prop.load(fr);
		prop.setProperty("chenlong", "27");
		FileWriter fw =new FileWriter("propert.txt");
		prop.store(fw, null);
		fr.close();
		fw.close();
		prop.list(System.out);
	}

原来的文件:

修改后的文件:


 

 ----------android培训java培训、java学习型技术博客、期待与您交流! -----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值