博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO流(四)
阅读量:4569 次
发布时间:2019-06-08

本文共 7674 字,大约阅读时间需要 25 分钟。

登录注册IO版本案例(掌握) 

要求,对着写一遍。		cn.itcast.pojo User	cn.itcast.dao UserDao	cn.itcast.dao.impl UserDaoImpl(实现我不管)	cn.itcast.game GuessNumber	cn.itcast.test	UserTest

数据操作流(操作基本类型数据的流)(理解) 

1、可以操作基本类型的数据	2、流对象名称			DataInputStream			A:创建数据输出流对象				DataOutputStream dos = new DataOutputStream(new FileOutputStream(				"dos.txt"));			B:写数据				dos.writeByte(10);				dos.writeShort(100);				dos.writeInt(1000);				dos.writeLong(10000);				dos.writeFloat(12.34F);				dos.writeDouble(12.56);				dos.writeChar('a');				dos.writeBoolean(true);			C:释放资源				dos.close();		DataOutputStream			A:创建数据输入流对象				DataInputStream dis = new DataInputStream(				new FileInputStream("dos.txt"));			B:读数据				byte b = dis.readByte();				short s = dis.readShort();				int i = dis.readInt();				long l = dis.readLong();				float f = dis.readFloat();				double d = dis.readDouble();				char c = dis.readChar();				boolean bb = dis.readBoolean();			C:释放资源				dis.close();

内存操作流(理解) 

1、有些时候我们操作完毕后,未必需要产生一个文件,就可以使用内存操作流。	2、三种		A:操作字节数组			ByteArrayInputStream					//将写入的流转化为字符数组					byte[] bys = baos.toByteArray();					//创建对象					ByteArrayInputStream bais = new ByteArrayInputStream(bys);					//读数据					int by = 0;					while ((by = bais.read()) != -1) {						System.out.print((char) by);					}			ByteArrayOutputStream					// 创建对象					ByteArrayOutputStream baos = new ByteArrayOutputStream();					// 写数据					for (int x = 0; x < 10; x++) {						baos.write(("hello" + x).getBytes());					}					// 释放资源					// 通过查看源码我们知道这里什么都没做,所以根本需要close()					// baos.close();		B:操作字符数组			CharArrayReader			CharArrayWriter		C:操作字符串			StringReader			StringWriter

打印流(掌握) 

1、字节打印流 PrintStream,字符打印流 PrintWriter	2、特点:		A:只操作目的地,不操作数据源(只能写不能读)		B:可以操作任意类型的数据		C:如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新		D:可以直接操作文件			问题:哪些流可以直接操作文件呢?						FileInputStream						FileOutputStream						FileReader						FileWriter						PrintStream						PrintWriter			流分为基本流(能直接读写文件)和高级流(在基本流基础上提供一些其它功能)			看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的	3、复制文本文件		BufferedReader br = new BufferedReader(new FileReader("a.txt"));		PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);	//第二参数启动刷新				String line = null;		while((line=br.readLine())!=null) {			pw.println(line);	//println自动刷新功能		}				pw.close();		br.close();

标准输入输出流(理解) 

1、System类下面有这样的两个字段		in 标准输入流		out 标准输出流	2、三种键盘录入方式		A:main方法的args接收参数		B:System.in通过BufferedReader进行包装			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		C:Scanner			Scanner sc = new Scanner(System.in);	3、输出语句的原理和如何使用字符流输出数据		A:原理			System.out.println("helloworld");						PrintStream ps = System.out;			ps.println("helloworld");		B:把System.out用字符缓冲流包装一下使用			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

随机访问流(理解) 

RandomAccessFile类不属于流,是Object类的子类。	但它融合了InputStream和OutputStream的功能。	支持对文件的随机访问读取和写入。	1、可以按照文件指针的位置写数据和读数据。	2、案例:				A:创建随机访问流对象				RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");	//第一个参数是文件路径,第二个参数是操作文件的模式。				//模式有四种,我们最常用的一种叫"rw",这种方式表示我既可以写数据,也可以读取数据 		B:写数据				raf.writeChar('a');		C:读数据				char ch = raf.readChar();		D:获取和改变文件指针的位置				raf.getFilePointer();		E:设置指针位置				raf.seek(4);

合并流(理解) 

1、把多个输入流的数据写到一个输出流中。	2、构造方法:		A:SequenceInputStream(InputStream s1, InputStream s2) 		B:SequenceInputStream(Enumeration
e) 3、例子: public class SequenceInputStreamDemo2 { public static void main(String[] args) throws IOException { // 需求:把下面的三个文件的内容复制到Copy.java中 // ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java // SequenceInputStream(Enumeration e) // 通过简单的回顾我们知道了Enumeration是Vector中的一个方法的返回值类型。 // Enumeration elements() Vector v = new Vector(); InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("CopyFileDemo.java"); InputStream s3 = new FileInputStream("DataStreamDemo.java"); v.add(s1); v.add(s2); v.add(s3); Enumeration en = v.elements(); SequenceInputStream sis = new SequenceInputStream(en); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("Copy.java")); // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写 byte[] bys = new byte[1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); sis.close(); } }

序列化流(理解) 

1、可以把对象写入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)	2、如何实现序列化呢(NotSerializableException:未序列化异常)?		implements Serializable	让被序列化的对象所属类实现序列化接口。		该接口是一个标记接口。没有功能需要实现。	3、注意问题(InvalidClassException):		把数据写到文件后,在去修改类,不写再读,会产生一个问题。		如何解决该问题呢?			实际开发中,需要修改类但还需要使用以前写过的数据,不能重新写入。怎么办呢?			在类文件中,给出一个固定的序列化id值。			点击黄色警告线 Add generated serial version ID, 这样也可以解决黄色警告线问题		我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?			使用transient关键字声明不需要序列化的成员变量(private transient int age;)	4、面试题:		什么时候序列化?		如何实现序列化?		什么是反序列化?			反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

Properties(理解) 

1、 属性集合类。是一个可以和IO流相结合使用的集合类。		可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。		是Hashtable的子类,说明是一个Map集合。			Properties prop = new Properties();			// 添加元素			prop.put("it002", "hello");			prop.put("it001", "world");			prop.put("it003", "java");			// System.out.println("prop:" + prop);			// 遍历集合	2、特有功能		A:public Object setProperty(String key,String value);	//添加元素		B:public String getProperty(String key);	//获取元素		C:public Set stringPropertyNames();	//获取所有键的集合		D:例子			public class PropertiesDemo2 {			public static void main(String[] args) {				// 创建集合对象				Properties prop = new Properties();				// 添加元素				prop.setProperty("张三", "30");				prop.setProperty("李四", "40");				prop.setProperty("王五", "50");				// public Set stringPropertyNames():获取所有的键的集合				Set set = prop.stringPropertyNames();				for (String key : set) {					String value = prop.getProperty(key);					System.out.println(key + "---" + value);				}			}			}	3、和IO流结合的方法		把键值对形式的文本文件内容加载到集合中		public void load(Reader reader)		public void load(InputStream inStream)		把集合中的数据存储到文本文件中		public void store(Writer writer,String comments)		public void store(OutputStream out,String comments)		注意:这里的集合指的是properties集合		例子:			public class PropertiesDemo3 {			public static void main(String[] args) throws IOException {				// myLoad();				myStore();			}			private static void myStore() throws IOException {				// 创建集合对象				Properties prop = new Properties();				prop.setProperty("林青霞", "27");				prop.setProperty("武鑫", "30");				prop.setProperty("刘晓曲", "18");								//public void store(Writer writer,String comments):把集合中的数据存储到文件				Writer w = new FileWriter("name.txt");				prop.store(w, "helloworld");				w.close();			}			private static void myLoad() throws IOException {				Properties prop = new Properties();				// public void load(Reader reader):把文件中的数据读取到集合中				// 注意:这个文件的数据必须是键值对形式				Reader r = new FileReader("prop.txt");				prop.load(r);				r.close();				System.out.println("prop:" + prop);			}			}	4、案例:		A:根据给定的文件判断是否有键为"lisi"的,如果有就修改其值为100		B:写一个程序实现控制猜数字小游戏程序不能玩超过5次

NIO(了解) 

1、JDK4出现的NIO,对以前的IO操作进行了优化,提高了效率。但是大部分我们看到的还是以前的IO。	2、JDK7的NIO的使用			Path:路径		Paths:通过静态方法返回一个路径			public static Path get(URI uri)		Files:提供了常见的功能			复制文件:				public static long copy(Path source,OutputStream out)			把集合中的数据写到文本文件:				public static Path write(Path path,Iterable
lines,Charset cs,OpenOption... options) 3、例子: public class NIODemo { public static void main(String[] args) throws IOException { // public static long copy(Path source,OutputStream out) // Files.copy(Paths.get("ByteArrayStreamDemo.java"), new // FileOutputStream( // "Copy.java")); ArrayList array = new ArrayList(); array.add("hello"); array.add("world"); array.add("java"); Files.write(Paths.get("array.txt"), array, Charset.forName("GBK")); } }

转载于:https://www.cnblogs.com/zhanwang/p/7669247.html

你可能感兴趣的文章
Scala
查看>>
Android 中LinearLayout控件属性
查看>>
面向对象之多态性
查看>>
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>
底层原理
查看>>
21. Merge Two Sorted Lists
查看>>
创建数组
查看>>
dict使用
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>
[转载,感觉写的非常详细]DUBBO配置方式详解
查看>>
linux Valgrind使用说明-内存泄漏
查看>>