> 文档中心 > Java基础篇IO流总结[补充]

Java基础篇IO流总结[补充]

IO流总结目录

  • 1. 转换流
    • 1.1 转换流概述
    • 1.2 转换流典型使用
    • 1.3 标准的输入输出过程
  • 2. 其他流的使用
    • 2.1 标准的输入输出流
    • 2.2 打印流
    • 2.3 数据
  • 3. 对象
    • 3.1 对象流的概述
    • 3.2 对象流的使用

1. 转换流

1.1 转换流概述

说明
①转换流提供了在字节流和字符流之间的转换
②转换流使用的两个类:
    InputStreamReader:将字节输入流转换为字符输入流,解码:字节、字节数组 —> 字符数组、字符串
    OutputStreamReader:将字符输出流转换为字节输出流,编码:字符数组、字符串 —> 字节、字节数组编码决定了解码
③作用:
    (1)很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。
    (2)字节流中的数据都是字符时,转成字符流操作更高效。
④图示方式
Java基础篇IO流总结[补充]

1.2 转换流典型使用

使用说明
转换流在使用转换流和缓冲流的时候,在创建转换流和缓冲流流对象的时候,new使用的参数用的都是FileInputStream、FileOutputStream
实现的步骤就是标准的四步(下方阐述):

@Test    public void testInputStreamOutputStream() { InputStreamReader isr = null; OutputStreamWriter osw = null; try {     //创建操作的对象     File srcfile = new File("hello.txt");     File destfile = new File("hello4.txt");     //在使用转换流的时候,是在节点流的基础之上的,所以首相要先建立节点流     FileInputStream fis = new FileInputStream(srcfile);     FileOutputStream fos = new FileOutputStream(destfile);     isr = new InputStreamReader(fis);     osw = new OutputStreamWriter(fos);     //对数据进行操作     char[] cbuf = new char[20];     int len;     while ((len = isr.read(cbuf)) != -1){  osw.write(cbuf,0,len);     } } catch (IOException e) {     e.printStackTrace(); } finally {     if (isr != null){  //由于上方流资源关闭的时候,下方对应的流资源也会关闭,所以在操作的时候只需要关注上方的流资源就可以了  try {      isr.close();  } catch (IOException e) {      e.printStackTrace();  }     }     if (osw != null){  try {      osw.close();  } catch (IOException e) {      e.printStackTrace();  }     } }    }

在指明编码的方式的情况下,在进行解码时也需要使用相同的方式

isr = new InputStreamReader(fis,"UTF-8");//     osw = new OutputStreamWriter(fos,"GBK");//GBK会出现乱码     osw = new OutputStreamWriter(fos,"UTF-8");

1.3 标准的输入输出过程

标准输入过程

① 创建File类的对象,指明读取的数据来源。(此文件一定存在)
② 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③具体的读入过程
     创建相应的byte[] 或 char[]
     使用while循环,完成读取
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally来进行处理。

标准输出过程

输出过程
① 创建File类的对象,指明写出的数据位置。(此文件不一定存在)
② 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
③具体的写出过程
     创建相应的byte[] 或 char[]
     使用while循环,完成写出
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally来进行处理。

2. 其他流的使用

2.1 标准的输入输出流

了解内容
说明

①System.in和System.out分别代表了系统标准的输入和输出设备
默认输入设备是:键盘,输出设备是:显示器
② System.in的类型是InputStream
③System.out的类型是PrintStream
④重定向:通过System类的setIn,setOut方法对默认设备进行改变

典型使用:
题目描述
     从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续进行输入操作,直至当输入“e”或者“exit”时,退出程序

代码实现

public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); while (true) {     System.out.println("请输入字符串:");     String data = br.readLine();//读取一行数据     if (data.equalsIgnoreCase("e") || data.equalsIgnoreCase("exit")) {  System.out.println("程序结束");  break;     }     String s = data.toUpperCase();     System.out.println(s); } br.close();    }

2.2 打印流

了解内容
说明

①提供了一系列重载的print()和println()方法,用于多种数据类型的输出
②System.out返回的是PrintStream的实例

使用样例
     在使用时为了方便查看步骤这里使用的是throws的方式处理异常,在真正的开发过程中使用的是try-catch-finally的方式处理

@Test    public void test2() throws FileNotFoundException { FileOutputStream fos = new FileOutputStream("E:\\io\\test.txt");//指明打印位置 PrintStream ps = new PrintStream(fos); if (ps != null) {     System.setOut(ps);//把标准输出流改成文件 } for (int i = 1; i <= 255; i++) {     System.out.print((char) i);     if (i % 50 == 0) {  System.out.println();     } } ps.close();    }

2.3 数据流

了解内容
说明
     ①为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流
     ②数据流有两个类:(用于读取和写出基本数据类型、String类的数据)DataInputStream 和 DataOutputStream, 分别“套接”在 InputStream 和 OutputStream 子类的流上

使用举例:

//实现写的过程    @Test    public void test3() { DataOutputStream dos = null; try {     dos = new DataOutputStream(new FileOutputStream("text.txt"));     dos.writeUTF("黎明");     dos.flush();     dos.writeInt(22);     dos.flush();     dos.writeBoolean(true);     dos.flush(); } catch (IOException e) {     e.printStackTrace(); } finally {     if (dos != null) {  try {      dos.close();  } catch (IOException e) {      e.printStackTrace();  }     } }    }    //实现读的过程    //读取的顺序要和写入的顺序一致    @Test    public void test4() { DataInputStream dis = null; try {     //造数据流     dis = new DataInputStream(new FileInputStream("text.txt"));     //2.操作数据     String name = dis.readUTF();     int age = dis.readInt();     boolean isMale = dis.readBoolean();     System.out.println("neme = " + name + ",age = " + age + ",isMale = " + isMale); } catch (IOException e) {     e.printStackTrace(); } finally {     if (dis != null) {  try {      dis.close();  } catch (IOException e) {      e.printStackTrace();  }     } }    }

3. 对象流

3.1 对象流的概述

说明

①使用到的类:ObjectInputStream和OjbectOutputSteam
②用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
③涉及到了序列化
     序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
     反序列化:用ObjectInputStream类读取基本类型数据或对象的机制(在使用的过程中,需要先进行序列化,保存到硬盘中才可以进行反序列化,进行读取
④对象的序列化:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。

3.2 对象流的使用

序列化过程
实现样例:
在这里直接创建了一个String类型的对象,没有另外创建别的对象

@Test    public void testObjectOutputStream(){ ObjectOutputStream oos = null; try {     //创建流和对象     oos = new ObjectOutputStream(new FileOutputStream("Object.dat"));     //实现数据的操作(创建对象并且添加进去)     oos.writeObject(new String("我学到对象流了")); } catch (IOException e) {     e.printStackTrace(); } finally {     //实现关闭操作     if (oos != null){  try {      oos.close();  } catch (IOException e) {      e.printStackTrace();  }     } }    }

反序列化过程
将磁盘层面的对象还原到内存层面的对象,可以输出到控制台,查看保存的内容
实现样例:

@Test    public void testObjectInputStream()  { ObjectInputStream ois = null; try {     //创建流和对象     ois = new ObjectInputStream(new FileInputStream("Object.dat"));     //分开写的步骤如下:// File file = new File("Object.dat");// FileInputStream fis = new FileInputStream(file);// ObjectInputStream ois = new ObjectInputStream(fis);     //操作数据     Object object = ois.readObject();     System.out.println(object); } catch (IOException e) {     e.printStackTrace(); } catch (ClassNotFoundException e) {     e.printStackTrace(); } finally {     //关闭流资源     if (ois != null){  try {      ois.close();  } catch (IOException e) {      e.printStackTrace();  }     } }    }

三国人物百科