黑马程序员_JAVA之IO流(其他IO流)

------- android培训java培训、期待与您交流!----------

一:转换流

转换流实际上就是字符流

OutputStreamWriter:输出转换流

构造方法:

传入一个相应的字节流,返回一个相应的字符流    而这个字符流就是转换流对象

注意:

在使用过程中:将字节流对象转成字符流对象

在本质上:字符流通向字节流的桥梁

InputStreamReader:输入转换流

构造方法:

传入一个相应的字节流,返回一个相应的字符流    而这个字符流就是转换流对象

注意:

在使用过程中:将字节流对象转成字符流对象

在本质上:字节流通向字符流的桥梁

代码实现:

package cn.itcast2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class Demo5 {

	public static void main(String[] args) throws IOException {
		method();
	}
	
	//转换流作为字符流完成文件复制
	public static void method() throws IOException {
		
		InputStream is = new FileInputStream("g.txt");
		InputStreamReader isr = new InputStreamReader(is);
		
		OutputStream os = new FileOutputStream("h.txt");
		OutputStreamWriter osw = new OutputStreamWriter(os);
		
		int c;
		while((c=isr.read())!=-1) {
			osw.write(c);
		}
		
		osw.close();
		isr.close();
	}
}

二:字节输入输出流

System.in:字节输入流   从控制台读入   名为标准输入流

System.out: 字节输出流     输出到控制台    名为标准输出流

代码实现:

package cn.itcast2;

import java.io.IOException;
import java.io.InputStream;

public class Demo6 {

	public static void main(String[] args) throws IOException {
		
//		OutputStream os = System.out;
//		os.write(97);
//		os.write(98);
//		os.close();
		
		InputStream is = System.in;
		
		int b;
		while((b=is.read())!=-1) {
			System.out.println(b);
		}
		
		is.close();
	}

}

结合前面的IO流,完成需求:从控制台读取,再写到控制台中去

package cn.itcast2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class Demo7 {

	public static void main(String[] args) throws IOException {

		//创建字节流对象
		InputStream is = System.in;
		OutputStream os = System.out;
		//创建字符流对象
		InputStreamReader isr = new InputStreamReader(is);
		OutputStreamWriter osr = new OutputStreamWriter(os);
		
		//创建高效字符流对象
		BufferedReader br = new BufferedReader(isr);
		BufferedWriter bw = new BufferedWriter(osr);
		
		//读
		String line;
		while((line=br.readLine())!=null) {
			//定义停止输入的标记字符串
			if("byebye".equals(line)) {
				break;
			}
			
			//写
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		
		//关闭流
		osr.close();
		isr.close();
	}

}

三:数据输入输出流

DataOutputStream:数据输出流

public final void writeXxx(xx x) throws IOException  写出XXX类型的数据

DataInputStream:数据输入流

public final byte readXxx(xx x) throws IOException  读入Xxx类型的数据

注意:

在数据输入输出流的操作过程中,必须按照写入顺序读取,否则由于读取规则的不同,会造成乱码。

代码实现:

package cn.itcast;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

public class Demo {

	public static void main(String[] args) throws IOException {
		
//		FileWriter fw = new FileWriter("a.txt");
//		fw.write("10");
//		fw.close();
		
		int a = 983;
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("a.txt"));
		
		dos.writeInt(a);
		dos.writeBoolean(true);
		dos.writeChar('a');
		dos.writeDouble(365);
		dos.writeUTF("i love java 中国");
		
		dos.close();
		
		DataInputStream dis = new DataInputStream(new FileInputStream("a.txt"));
		
		System.out.println(dis.readInt());
		System.out.println(dis.readBoolean());
		System.out.println(dis.readChar());
		System.out.println(dis.readDouble());
		System.out.println(dis.readUTF());
		
		dis.close();
	}

}

四:内存操作流

不需要调用底层资源的IO流

ByteArrayOutputStream:字节数组输出流     即将数据写到数组中

ByteArrayInputStream:字节数组输入流    即从数组中读取

CharArrayReader:从数组中读去字符

CharArrayWriter:将字符写到数组中

StringWriter:将字符写到字符串中

StringReader:从字符串中读取数据

注意:

有些IO操作流流关闭无效,不会产生IO异常。如ByteArray操作流与String操作流

代码实现:

package cn.itcast;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;

public class Demo2 {

	public static void main(String[] args) {
		/*
		 * CharArrayReader:从数组中读去字符
		 * CharArrayWriter:将字符写到数组中
		 * StringWriter:将字符写到字符串中
		 * StringReader:从字符串中读取数据
		 */
		//创建IO流对象
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		//向缓冲区中写出3个字节
		baos.write('a');
		baos.write('b');
		baos.write('c');
		//返回缓冲区中的字节数组
		byte[] byteArray = baos.toByteArray();
		//使用数组工具类打印字节数组内容
		System.out.println(Arrays.toString(byteArray));
		//创建IO流对象,指定一个字节数组为数据源
		ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
		//读取数组中的每一个字节
		int b;
		while((b=bais.read())!=-1) {
			System.out.println((char)b);
		}
	}

}

五:打印流

专门用来输出的IO流

特点:

专注于输出,不关心数据输入。

可以打印任意类型。

PrintStream :字节打印流

PrintWriter :字符打印流

可以作为普通的输出流。

public void print(char c)

public PrintWriter printf(String format, Object... args) 

public void println()

printf与println方法支持自动刷新

代码实现:

package cn.itcast;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

public class Demo3 {

	public static void main(String[] args) throws IOException {

		PrintWriter pw = new PrintWriter(new FileOutputStream("b.txt"),true);
		
		pw.println(200.0);
		pw.println(false);
		pw.print(100.0);
		pw.print(true);
		pw.println("i love java");
		
		pw.printf("我是前边的参数%d%d%.2f", 10,20,10.1);
//		pw.flush();
		
//		pw.close();
	}

}

六:随机访问流

RandomAccessFile:对文件进行随机访问

特点:

同时支持读与写。

需要指定模式。使用“rw”模式。

随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组,即文件是由字节字节组成的,随机访问流将整个文件看做一个byte数组了;

存在指向该隐含数组的光标或索引,称为文件指针;

该指针可以设置或者获取;

设置指针:public void seek(long pos) throws IOException

获取指针:public long getFilePointer() throws IOException

构造方法:

public RandomAccessFile(File file,  String mode) throws FileNotFoundException  需要配合读写模式

EOFException:相当于数组角标越界,即索引的访问异常

代码实现:

package cn.itcast;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Demo4 {

	public static void main(String[] args) throws IOException {

		myWrite();
		myRead();
	}

	public static void myWrite() throws IOException {
		RandomAccessFile raf = new RandomAccessFile("c.txt", "rw");
		
		System.out.println(raf.getFilePointer());
		raf.writeInt(998);
		System.out.println(raf.getFilePointer());
		raf.writeDouble(10.1);
		System.out.println(raf.getFilePointer());
		raf.writeUTF("abc中");
		System.out.println(raf.getFilePointer());
		
		raf.close();
	}
	
	public static void myRead() throws IOException {
		RandomAccessFile raf = new RandomAccessFile("c.txt", "rw");
		
		System.out.println(raf.readInt());
		raf.seek(8);
		System.out.println(raf.readDouble());
		System.out.println(raf.readUTF());
		
		raf.close();
	}
}

七:对象序列化流

ObjectOutputStream:序列化流

public final void writeObject(Object obj) throws IOException

ObjectInputStream:反序列化流

public final Object readObject() throws IOException, ClassNotFoundException

被序列化的对象必须可序列化,即实现序列化接口作为可序列化的标记。


Serializable:序列化接口

无方法,仅作为可序列化标记使用

写出与读入时,序列化ID必须相同

代码实现:

package cn.itcast;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Demo5 {

	public static void main(String[] args) throws IOException, ClassNotFoundException {

//		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d.txt"));
//		
//		Person p = new Person("唐嫣",26);
//		oos.writeObject(p);
//		
//		oos.close();
		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d.txt"));
		Object readObject = ois.readObject();
		Person p2 = (Person)readObject;
		
		System.out.println(p2.getName());
		System.out.println(p2.getAge());
		
		System.out.println(p2);
		
		ois.close();
	}

}

八:Properties

该类是Hashtable的子类。用于存储属性键值对,通常作为配置文件来使用。

特点:

键值对均为字符串

可以直接操作IO流

Properties没有泛型,但是一般情况下,该集合中的键与值均为字符串。

代码实现:

package cn.itcast;

import java.util.Properties;
import java.util.Set;

public class Demo6 {

	public static void main(String[] args) {

		//创建集合对象
		Properties p = new Properties();
		//创建元素对象
		//将元素放到集合中
		p.put("呼保义", new Person("宋江",28));
		p.put("玉麒麟", new Person("卢俊义",32));
		p.put("九纹龙", new Person("史进",24));
		//迭代集合
		Set<Object> keySet = p.keySet();
		
		for (Object key : keySet) {
			Object value = p.get(key);
			System.out.println(key+":"+value);
		}
	}

}

Properties特有方法:

Properties一般作为属性集。里边存储的都为字符串。

public Object setProperty(String key,String value)  为某个属性赋值,即添加元素

public String getProperty(String key)  通过键获取值

public String getProperty(String key, String defaultValue)用指定的键在属性列表中搜索属性。如果没有,就返回默认值

代码实现:

package cn.itcast;

import java.util.Properties;

public class Demo7 {

	public static void main(String[] args) {
		
		Properties p = new Properties();
		
		p.setProperty("智多星", "吴用");
		p.setProperty("入云龙", "公孙胜");
		p.setProperty("大刀", "关胜");
		
		System.out.println(p.getProperty("智多星"));
		System.out.println(p.getProperty("大刀"));
		
		System.out.println(p.getProperty("豹子头"));
		System.out.println(p.getProperty("霹雳火"));
		System.out.println(p.getProperty("霹雳火","梁山好汉"));
	}
}

Properties与IO相关的方法:

public void list(PrintStream out)  将属性列表输出到指定的输出流。通常用于调试。

public void store(OutputStream out, String comments) throws IOException 将属性列表输出到指定的输出流。

public void load(InputStream inStream)throws IOException 从输入流中读取属性列表(键和元素对)。

代码实现:

package cn.itcast;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class Demo8 {

	public static void main(String[] args) throws IOException {

		Properties p = new Properties();
		
		p.setProperty("是否隐身", "在线");
		p.setProperty("在线状态", "忙碌");
		p.setProperty("是否记住密码", "否");
		
//		PrintWriter pw = new PrintWriter("e.txt");
//		p.list(pw);
//		pw.close();
		
//		FileOutputStream fos = new FileOutputStream("e.txt");
//		p.store(fos, "hello");
//		fos.close();
		
//		FileWriter fw = new FileWriter("e.properties");
//		p.store(fw, "hello");
//		fw.close();
		
		Properties p2 = new Properties();
		
		FileReader fr = new FileReader("e.properties");
		p2.load(fr);
		fr.close();
		
		System.out.println(p);
	}

}

完成需求:复制多级文件夹

代码实现:

package cn.itcast;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {

	public static void main(String[] args) throws IOException {
		
		File srcDIR = new File("a");
		File destDIR = new File("b");
		
		method(srcDIR,destDIR);
	}

	//声明函数定义
	public static void method(File srcDIR,File destDIR) throws IOException {
		//获取源文件夹下的所有文件对象
		File[] listFiles = srcDIR.listFiles();
		//遍历数组,依次获取每一个文件对象
		for (File fileorDIR : listFiles) {
			//判断是否为文件
			if(fileorDIR.isFile()) {
				File oldFile = fileorDIR;
				File newFile = new File(destDIR,oldFile.getName()); //新文件所在目录即目标目录,文件名称与老文件名称相同
				//复制文件
				//创建流对象
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oldFile));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
				//读写
				int b;
				while((b=bis.read())!=-1) {
					bos.write(b);
				}
				//关闭
				bos.close();
				bis.close();
			} else {  //文件对象为文件夹
				File oldDIR = fileorDIR;
				File newDIR = new File(destDIR,oldDIR.getName()); //新文件夹所在目录即目标目录,文件夹名称与老文件夹名称相同
				//复制文件夹
				//创建文件夹
				newDIR.mkdir();
				//递归调用method完成文件夹复制
				method(oldDIR,newDIR);
			}
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值