关于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();
}
}
注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。