字符流与字节流

OutputStreamWriter:将字节输出流转换为字符输出流

/*
 * 需求:读取项目根目录下的SystemInOutDemo.java,并输出到命令行
 * 
 * 数据源:项目根目录下的SystemInOutDemo.java	BufferedReader
 * 目的地:命令行	System.out
 * 
 * 
 * 由于标准输出流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读取到的数据则是字符串,如果想进行输出还需要转换成字节数组
 * 我们要想通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可,OutputStreamWriter
 * 
 * OutputStreamWriter(OutputStream out) :转换流,把字节输出流转换成字符输出流
 * 
 * 
 */
public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException   {
		//method2();
		
		//创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
		//创建字符输出流对象
		//OutputStream os = System.out;
		//Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象
		//BufferedWriter bw = new BufferedWriter(w);
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		
		//进行数据的读写
		String line;//用于存储读取到的数据
		while((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
		}
		
	
		
		//释放资源
		bw.close();
		br.close();
		
		
	}

	private static void method2() throws FileNotFoundException, IOException {
		//创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
		//创建输出流对象
		//OutputStream os = System.out;
		Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象
		
		//进行数据的读写
		String line;//用于存储读取到的数据
		while((line = br.readLine()) != null) {
			w.write(line);
			w.write("\r\n");
		}
		
	
		
		//释放资源
		w.close();
		br.close();
	}

	private static void method() throws FileNotFoundException, IOException {
		//创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
		//创建输出流对象
		OutputStream os = System.out;
		
		String line;//用于存储读取到的数据
		while((line = br.readLine()) != null) {
			os.write(line.getBytes());
			os.write("\r\n".getBytes());
		}
		
		//释放资源
		os.close();
		br.close();
	}
}

InputStreamReader:将字节输入流转换为字符输入流

/*
 * 需求:读取键盘录入的数据,并输出到项目根目录下的a.txt文件中
 * 
 * 数据源:读取键盘录入的数据	System.in
 * 目的地:项目根目录下的a.txt	FileWriter
 * 
 * 
 * 
 * 转换流:需要把字节输入流转换成字符输入流,InputStreamReader
 * InputStreamReader(InputStream in) 
 */
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException  {
		//创建输入流对象
		InputStream is = System.in;
		Reader r = new InputStreamReader(is);
		//创建输出流对象
		FileWriter fw = new FileWriter("a.txt");
		
		//读写数据
		char[] chs = new char[1024];
		int len;
		while((len = r.read(chs)) != -1) {
			fw.write(chs,0,len);
			fw.flush();
		}
		
		
		//释放资源
		fw.close();
		is.close();
		
	}

	private static void method() throws IOException {
		//创建输入流对象
		InputStream is = System.in;
		//创建输出流对象
		FileWriter fw = new FileWriter("a.txt");
		
		//读写数据
		byte[] bys = new byte[1024];
		int len;//用于存储读取到的字节个数
		while((len = is.read(bys)) != -1) {
			fw.write(new String(bys,0,len));
			fw.flush();
		}
		
		
		//释放资源
		fw.close();
		is.close();
	}

打印流

	//字符输出写入
	PrintWriter pw=new PrintWriter("D:\\a.txt");
	pw.write("nihao");
	
	pw.flush();
	pw.close();

打印流特有的功能:自动换行,自动刷新

/*
 * 打印流的特有功能:
 * 		自动换行 使用方法println()实现自动换行
 * 		自动刷新  创建PrintWriter对象时启动自动刷新开关,并且使用println等3个方法可以实现自动刷新
 * 
 * 注意:创建FileWriter对象时boolean参数是是否追加,new FileWriter("d.txt",boolean)
 * 		而创建打印流对象的boolean类型参数是是否自动刷新
 */
public class PrintWriterDemo2 {
	public static void main(String[] args) throws IOException  {
		
		//创建打印流对象
		//PrintWriter pw = new PrintWriter("d.txt");
		//构造方法里其中一个方法,(括号里面放基本流的匿名方法,不要放文件名)
		PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);
		
		//注意.如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
		pw.println("hello");
		pw.println("world");
		pw.println("java");
		
		//释放资源
		//pw.close();
				
	}

对象操作流

 //实现这个接口,不然后面调用会报错
    public class Student implements Serializable {

	String name;
	int age;

	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age +"]";
	}
}


/*	
 * 使用对象输出流和读对象输入流写对象
 * Exception in thread "main" java.io.NotSerializableException: com.itheima_07.Student
 * Serializable:序列号,是一个标识接口,只起标识作用,没有方法
 * 				当一个类的对象需要IO流进行读写的时候,这个类必须实现该接口
 * 
 * Exception in thread "main" java.io.EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。
 * 
 */
public class ObjectOutputStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException  {
		//method();
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
		//读取对象
		/*Object obj = ois.readObject();
		System.out.println(obj);
		
		Object obj2 = ois.readObject();
		System.out.println(obj2);
		
		Object obj3 = ois.readObject();
		System.out.println(obj3);*/
		
		try {
			while(true) {
				Object obj = ois.readObject();
				System.out.println(obj);
			}
		} catch(EOFException e) {
			System.out.println("读到了文件的末尾");
		}
		
		//释放资源
		ois.close();
	}

	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		//FileOutputStream fos = new FileOutputStream("a.txt");
		//ObjectOutputStream oos = new ObjectOutputStream(fos);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
		
		//创建学生对象
		Student s = new Student("zhangsan",18);
		Student s2 = new Student("lisi",19);
		//写出学生对象
		oos.writeObject(s);
		oos.writeObject(s2);
		
		//释放资源
		oos.close();
	}

}

针对上面那个需要try catch才能解决问题

/*
 * 解决对象输入流读取对象出现异常的问题
 * 
 */
public class ObjectOutputStreamDemo3 {
	public static void main(String[] args) throws IOException, ClassNotFoundException   {
		//method();
		
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
		//读取数据
		Object obj = ois.readObject(); 
		//System.out.println(obj);
		
		//向下转型,获取具体的子类对象,快捷ctrl+数字1,添加强制转换
		ArrayList<Student> list = (ArrayList<Student>) obj;
		for (Student student : list) {
			System.out.println(student);
		}
		
		//释放资源
		ois.close();
	}

	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
		//创建集合对象
		ArrayList<Student> list = new ArrayList<Student>();
		//添加学生对象
		list.add(new Student("wangwu",30));
		list.add(new Student("zhaoliu",28));
		//写出集合对象
		oos.writeObject(list);
		
		//释放资源
		oos.close();
	}
}

解决加了Serializable出现黄色感叹号的问题在这里插入图片描述

public class Student implements Serializable {


  	
   /*
 * 解决对实现序列化接口出现的黄色警告问题
 * Exception in thread "main" java.io.InvalidClassException
 * 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。 
		该类的序列版本号与从流中读取的类描述符的版本号不匹配 
		该类包含未知数据类型 
		该类没有可访问的无参数构造方法 
 * 
 */
 		//固定序列号解决黄色感叹号问题
    	private static final long serialVersionUID = 6361890890437825953L;
    	String name;
    	int age;
    	String gender;
    
	
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}


	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值