zoukankan      html  css  js  c++  java
  • Java IO操作


    分类

    1. 输入流:将存储设备中的数据写入内存中。

    2. 输出流:将内存中的数据写入存储设备中。

    3. 字节流:以字节为单位,可以读写所有文件

    4. 字符流:以字符为单位,只能读写文本文件。

    字节流

    1. InputStream:所有输入字节流的超类
      主要方法

      1. close();
      2. mark();在此输入流中标记当前位置
      3. markSupported();测试此输入流是否支持mark
      4. read();从输入流中读取下一个字节,该方法还有其他参数
      5. reset();将此流重新定位到上一次调用mark方法的地方
      6. skip(long n)跳过或者丢弃此流中的N个字节
    2. OutputStream:所有输出字节流的超类
      主要方法:

      1. close();
      2. flush();刷新此输入流并写出缓存中的数据
      3. write();写入操作

    字符流

    1. Reader:所有输入字符流的基类
      主要方法:

      1. read(),读取一个字符,返回值为读取的字符
      2. read(char[] a)throws IOException,读取一系列的字符到a中,返回值为读取的字符的数量。
      3. abstract read(char[] a,int off,int len),读取len个字符,从a的off下标处开始写入
    2. Writer:所有输出字符流的基类

      主要方法:

      1. write(),写单个字符

    Java的IO流根据是否直接处理数据,又分为节点流和处理流。节点流直接处理数据,处理流是对一个已存在的节点流的连接和封装。

    节点流

    1. 文件流:FieInputStream,FileOutputStream,FileWriter,FileReader. 他们都会直接操作文件,和OS底层互动,在使用完成之后,需要关闭流对象,因为Java垃圾回收机制不会主动回收。
    2. 数组流:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter,对数组进行处理的节点流。
    3. 字符串流:StringWriter,StringReader,其中StringReader能够从String字符串中读取字符然后保存在char数组中。
    4. 管道流:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter,对管道进行处理的管道流。

    处理流

    处理流的构造方法中总是要带一个节点流的对象作为参数

    1. 缓冲流:BufferedImputStrean,BufferedOutputStream,BufferedReader ,BufferedWriter,需要父类作为构造参数,增加缓冲功能,避免频繁读写硬盘。可以初始化缓冲数据的大小。另外,BufferedReader提供了一次读一行的方法radeLine(),而FileInputStream和FileReader只能读取一个字符或者一个字。

    2. 转换流:InputStreamReader,OutputStreamWriter,要inputStream或者OutputStream作为参数,实现从字节流到字符流的转换

    3. 数据流:DataInputStream,DataOutputStream,提供将基础数据类型写入到文件中,或者读取出来。

    常见用法

    1. 读取键盘输入,打印到控制台
    PrintWriter out = null;
     BufferedReader br = null;
     try{
     System.out.println("请输入:");
     out = new PrintWriter(System.out, true);
     br = new BufferedReader(new InputStreamReader(System.in));
     String line = null;
     while ((line = br.readLine()) != null) {
     if (line.equals("exit")) {
     System.exit(1);
     }
     out.println(line);
     }
     } catch (IOException e) {
     e.printStackTrace();
     }finally{
     out.close();
     br.close();
     }
    
    1. 用字节流读写文件

    因为是用字节流来读媒介,所以对应的流是 InputStream 和 OutputStream,并且媒介对象是文件,所以用到子类是 FileInputStream 和 FileOutputStream,这里还可以通过 BufferedInputStream 用缓冲流来读取文件。

    InputStream is =null;
     OutputStream os = null;
     try {
     // 在try()中打开文件会在结尾自动关闭
     is = new FileInputStream("D:/FileInputStreamTest.txt");
     os = new FileOutputStream("D:/FileOutputStreamTest.txt");
     byte[] buf = new byte[4];
     int hasRead = 0;
     while ((hasRead = is.read(buf)) > 0) {
     os.write(buf, 0, hasRead);
     }
     System.out.println("write success");
     } catch (Exception e) {
     e.printStackTrace();
     }finally{
     os.close();
     is.close();
     }
    
    1. 用字符流读写文件

    使用FileReader和FileWriter

    // 在try() 中打开的文件, JVM会自动关闭
     public static void readAndWriteCharToFile() throws IOException{
     Reader reader = null;
     Writer writer =null;
     try {
     File readFile = new File("d:/FileInputStreamTest.txt");
     reader = new FileReader(readFile);
     File writeFile = new File("d:/FileOutputStreamTest.txt");
     writer = new FileWriter(writeFile);
     char[] byteArray = new char[(int) readFile.length()];
     int size = reader.read(byteArray);
     System.out.println("大小:" + size + "个字符;内容:" + new String(byteArray));
     writer.write(byteArray);
     } catch (Exception e) {
     e.printStackTrace();
     }finally{
     reader.close();
     writer.close();
     }
     }
    

    使用StringReader和StringWriter

    StringReader sr =null;
     StringWriter sw =null;
     try {
     String str = "学习不刻苦
    " + "不如卖红薯;
    ";
     char[] buf = new char[32];
     int hasRead = 0;
     // StringReader将以String字符串为节点读取数据
     sr = new StringReader(str);
     while ((hasRead = sr.read(buf)) > 0) {
     System.out.print(new String(buf, 0, hasRead));
     }
     // 由于String是一个不可变类,因此创建StringWriter时,实际上是以一个StringBuffer作为输出节点
     sw = new StringWriter();
     sw.write("黑夜给了我黑色的眼睛
    ");
     sw.write("我却用它寻找光明
    ");
     // toString()返回sw节点内的数据
     System.out.println(sw.toString());
     } catch (Exception e) {
     e.printStackTrace();
     }finally{
     sw.close(); 
     sr.close(); 
     }
    
    1. 字节流转化为字符流

    在3中使用字符流读文件时打印到控制台会产生乱码,但是使用转化流可以解决这个问题。

    InputStream is =null;
     Reader reader = null;
     try {
     File file = new File("d:/FileInputStreamTest.txt");
     is = new FileInputStream(file);
     reader = new InputStreamReader(is,"gbk");
     char[] byteArray = new char[(int) file.length()];
     int size = reader.read(byteArray);
     System.out.println("大小:" + size + ";内容:" + new String(byteArray));
     } catch (Exception e) {
     e.printStackTrace();
     }finally{
     reader.close();
     is.close();
     }
    

    以上参考自https://www.cnblogs.com/CQqf/p/10795656.html

  • 相关阅读:
    在Visual Studio中使用层关系图描述系统架构、技术栈
    在Visual Studio中使用活动图描述业务流程
    在Visual Studio中使用类图描述领域模型
    在Visual Studio中使用用例图描述参与者与用例的关系
    在Visual Studio中使用用例图描述系统与参与者间的关系
    并行编程中的取消任务、共享状态,等等
    等待所有或任意异步任务完成,以及异步任务完成时的处理方案
    使用IProgress实现异步编程的进程通知
    Task.FromResult应用场景举例
    Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
  • 原文地址:https://www.cnblogs.com/charlottepl/p/13099022.html
Copyright © 2011-2022 走看看