Java基础总结七之IO流(二)

关于IO流的一些“远亲近邻”知识:

(1)打印流:

字节打印流:PrintStream         字符打印流:PrintWriter

打印流的特点:

A:只有写数据的,不能读数据,可以操作目的地,不能操作数据源;

B:可以操作任意类型的数据;

C:如果启动了自动刷新,就可以自动刷新;

D:该流是直接可以操作文本文件的。

(2)随机访问流:RandomAccessFile实际上是类不是流,但是该类的实例支持读取和写入随机访问文件

public RandomAccessFile(String name, String mode):第一个参数是文件,第二个参数是操作文件的模式

模式有四种,我们最常用的一种是rw,这种方式可读可写,其余三种分别是r,rwd,rws

(3)序列化流和反序列化流:

序列化流:把对象按照流一样的方式存入文本文件,或者在网络中传输。对象--流数据(ObjectOutputStream)

反序列化流:把文本文件中的流对象数据或网络中的流对象数据还原成对象。流数据--对象(ObjectInputStream)

类通过实现java.io.Serializable接口以启用序列化功能。未实现此接口的类将无法使用其任何状态序列化或反序列化。 该接口中没有任何的方法,类似于这种没有方法的接口被称为标记接口。看到类实现了序列化接口后,要想解决黄色警告线问题,就可以自动产生一个序列化id,而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。

注意:我一个类中可能有很多的成员变量,有些我不想进行序列化,即不想被记住,该怎么办?

使用transient关键字申明不需要被序列化的成员变量。

(4)SequenceInputStream:表示其他输入流的逻辑级联。 它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。

(5)异常:程序出现了不正常的情况

程序的异常:Throwable:

严重问题:Error :我们不处理。这种问题一般是很严重的问题,比如说内存溢出。

问题:Exception:1、编译期问题:不是RuntimeException的异常都是该编译期异常,这个使我们一定要处理的,因为你不处理,编译就不可以通过。2、运行期问题:RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类。这个问题出现肯定是我们的代码不够严谨,需要修正代码的 。

如果程序出了问题,我们没有做任何处理,最终jvm会作出默认处理:把异常的名称,原因及出现的问题等信息输出到控制台同时会结束程序。

处理异常的方式:

 * 如何处理异常?
 * (1)try...catch...finally
 * 		try{
 * 			可能出现问题的代码
 * 		}catch(异常名  变量){
 * 			针对问题的处理
 * 		}finally{
 * 			释放资源;
 * 		}
 * 注意的是try里面的代越少越好,catch必须要有内容,哪怕是一个简单的提示,千万不可以不写,可能会隐藏问题
 * 两个异常的处理:
 * 		(1)为每一个异常写一个try...catch...
 * 		(2)或者是和在一块写
 * 			try{
 * 				...
 * 			}catch{
 * 				...	
 * 			}catch{
 * 				...
 * 			}
 * 				...
 * 注意:
 * 1、异常类型能明确的尽量明确,不要用大的Exception来处理
 * 2、平级关系的异常谁前谁后无所谓,如果出现了父子关系,父亲必须写在后面
 * 这里需要注意的是当try语句中的某一条语句出现了问题,就会抛出和catch中的问题进行匹配,
 * 一旦有匹配的就执行catch里面的操作,然后就结束try...catch...直接执行之后的语句
 * 即当一个try里面会出现两个异常,那么只会处理第一个出现的异常,第二个异常的语句都不会执行
 * 就让程序接着往try...catch...外的语句接着执行了
 * (2)throws 抛出
 *

自定义异常类:要继承Exception类,然后重写方法,通过throws抛出异常类对象。例子如下:

public class MYException extends Exception {

	public MYException() {
		
	}
	public MYException(String string) {
		super(string);
	}
	
}
public class Teacher {

	public void check(int score) throws MYException {
		if(score<0||score>100) {
			throw new MYException("输入的分数应该在0-100之间");
		}else {
			System.out.println("分数没有问题");
		}
	}
}
	public static void main(String[] args) throws MYException {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入学生的分数:");
		int score=sc.nextInt();
		Teacher t=new Teacher();
		t.check(score);
	}

(6)NIO:nio在JDK4出现,提高了IO的操作效率。

JDK7之后的nio:A:path:路径;

B:Paths:有一个静态方法返回一个路径public static Path get(URI uri)将给定的URI转换为Path对象。 

C: Files:提供了静态方法供我们使用,是操作文件的工具类

public static long copy(Path source, OutputStream out)throws IOException将文件中的所有字节复制到输出流。

public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options)throws IOException:将文本行写入文件。简单使用如下:

public static void main(String[] args) throws IOException {
		System.out.println(Files.copy(Paths.get("IO流总结.txt"), new FileOutputStream("copy.txt")));
		//Files类的写到文本文件方法
		ArrayList<String> array=new ArrayList<>();
		array.add("Hello");
		array.add("world");
		array.add("XiaoGeGe");
		Files.write(Paths.get("array.txt"), array, Charset.forName("UTF-8"));
	}

(7)Properties:是一个属性集合类,是一个可以和IO流结合使用的集合类。

Properties:可以保存在流中或从流中加载属性;列表中的每个键及其对应的值都是一个字符串。Properties是Hashtable的子类,说明是一个Map集合。

 public void load(Reader reader):把文件中的数据读取到集合中;

 public void store(Writer writer,String comments):把集合中的数据存储到文件。

/*
 * public void load(Reader reader):把文件中的数据读取到集合中
 * public void store(Writer writer,String comments):把集合中的数据存储到文件
 * 
 * 这两个方法就可以实现游戏进度的保存和加载
 * 
 */
public class PropertiesDemo3 {
	public static void main(String[] args) throws IOException {
		//myLoad();
		myStore();
	}

	private static void myStore() throws IOException {
		// TODO Auto-generated method stub
		Properties prop = new Properties();
		// 写数据
		prop.setProperty("h005", "X");
		prop.setProperty("Is-Me-HL", "G");
		prop.setProperty("h007", "J");
		Writer writer = new FileWriter("prop2.txt");
		prop.store(writer, "测试想文件中写入键值对数据");
		writer.close();
	}

	private static void myLoad() throws FileNotFoundException, IOException {
		Properties prop = new Properties();

		// Reader inStream=new InputStreamReader(new FileInputStream("prop.txt"));
		Reader inStream = new FileReader("prop.txt");
		// 把文件中的数据读取到集合中load(Reader reader)
		// 注意的是这个文件必须是键值对存储的
		prop.load(inStream);

		System.out.println("prop:" + prop);
		inStream.close();
	}
}

注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。

猜你喜欢

转载自blog.csdn.net/m0_37265215/article/details/81563968