I/O流:主要操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...
处理流:
处理流就相当于外衣,每件衣服的作用不同,每个处理流的作用也不同,处理流可以实现多嵌套,即可以有多个处理流,每个处理流的功能不同!
上节我们学习了缓冲流和转换流,今天我们学习I/O流中的其他一些处理流,把思维放空。
输入、输出流:
实质上就是定义了流的不同方向,可以将数据写出到文件中;
并且使用System.in返回值对象就是InputStream,所以我们可以使用System.in,实现类似Scanner扫描数据的作用;
输入流:
/*** 输入流* 实现在控制台输入一个字符串,转换为大写;* 如果为e 或者 exit则退出*/publicstaticvoidprintStreamTest(){ InputStreamReaderisr=null; BufferedReaderbr=null; try { isr=newInputStreamReader(System.in); br=newBufferedReader(isr); while (true) { System.out.println("请输出一个字符串:"); Stringstr=br.readLine(); if ("e".equalsIgnoreCase(str) ||"exit".equalsIgnoreCase(str)){ System.out.println("程序结束"); break; } System.out.println(str.toUpperCase()); } } catch (IOExceptione) { e.printStackTrace(); } finally { if (br!=null) { try { br.close(); } catch (IOExceptione) { e.printStackTrace(); } } //使用处理流的话,只需要关闭最外层的流即可。if (isr!=null) { try { isr.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
输出流:
输出流的返回值类型PrintStream,所以我们在讲打印流的时候学习。
打印流:
既然是打印流,所以不论是字节流还是字符流只有单独的一只流,PrintStream/PrintWriter;
字节打印流:
System.setOut();//输出重定向System.setIn(); //输出重定向
publicstaticvoidprintStreamTest(Stringpath){ PrintStreamps=null; try { ps=newPrintStream(newFileOutputStream(path),true);//true,是设置是否自动刷新System.setOut(ps); //使用了System类中的setOut()方法,将数据的输出路径重定向为指定路径for (inti=0; i<=255; i++){ System.out.print((char)i); //此时的输出内容并没有在控制台打印,而是传送到指定的文件中if (i%50==0){//一行有50个内容换行System.out.println(); } } /*ps.write(1);ps.flush();ps.write(97);ps.flush();*/ } catch (FileNotFoundExceptione) { e.printStackTrace(); } finally { if (ps!=null) ps.close(); } }
数据流:
DataInputStream/DataOutputStream
能操作基本数据类型的值+String类型的值,其中定义了操作字符串的方法;
数据流的作用:
将数据持久化保存在文件中,我们在java类中定义的变量都是保存在内存中的,一旦JVM关闭/电脑断电数据都会损失;如果想要数据持久化的保存在文件中,就可以使用数据流进行存储。
数据流的注意事项:
- 数据流中写出的数据不能只能打开看,要是想要查看写出的顺序只需要使用读取操作,读取即可;
- 写出和读取的顺序必须相同。
数据流演示:
/*** 数据流只有针对字节的操作* 后续学习的对象流也是只能操作字节*/publicstaticvoiddataStreamTest(Stringpath){ DataOutputStreamdos=null; DataInputStreamdis=null; try { dos=newDataOutputStream(newFileOutputStream(path)); dis=newDataInputStream(newFileInputStream(path)); dos.writeUTF("小红"); dos.flush(); dos.writeInt(28); dos.flush(); dos.writeBoolean(true); dos.flush(); //写入的顺序和读取的顺序必须相同,否则会报错。Stringname=dis.readUTF(); intage=dis.readInt(); booleanisgirl=dis.readBoolean(); System.out.println("name:"+name+",age:"+age+",isgirl:"+isgirl); } catch (IOExceptione) { e.printStackTrace(); } finally { if (dis!=null) { try { dis.close(); } catch (IOExceptione) { e.printStackTrace(); } } if (dos!=null) { try { dos.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
注意:数据流是不能读取和写入对象的,要是对写入和读取对象只能使用对象流!后续进行学习。