【Java筑基】IO流基础之常见工具流和进程通信

简介: 【Java筑基】IO流基础之常见工具流和进程通信

1.转换流

字符流比字节流在操作上更加方便,Java提供了转换流来实现字节流向字符流的转换。

    public class KeyinTest {
      public static void main(String[] args) {
        try (InputStreamReader reader = new InputStreamReader(System.in);
                  //BufferedReader has readLine() to read by Line
            BufferedReader br = new BufferedReader(reader)) {
          String line = null;
          while ((line = br.readLine()) != null) {
            if (line.equals("exit")) {
              System.exit(1);
            }
            ;
            System.out.println("输出的内容是:" + line);
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

2.推回输入流

PushbackInputStream和PushbackReader是推回输入流,它们有一片推回缓冲区域,在读取数据时,会优先从推回缓冲区域读取,只有推回缓冲区域的内容没有装满read()所需数组的大小时才会去流中读取。

    public class PushbackTest {
      public static void main(String[] args) {
        // 指定推回缓冲区长度为64.
        try (PushbackReader pr = new PushbackReader(new FileReader(
            "src/inputandoutput/PushbackTest.java"), 64)) {
          char[] buff = new char[32];
          String lastContent = "";
          int hasRead = 0;
          while ((hasRead = pr.read(buff)) > 0) {
            String content = new String(buff, 0, hasRead);
            int targetIndex = 0;
            if ((targetIndex = (content + lastContent)
                .indexOf("new PushbackIndex")) > 0) {
              pr.unread((lastContent + content).toCharArray());
              if (targetIndex > 32) {
                buff = new char[targetIndex];
              }
              pr.read(buff, 0, targetIndex);
              System.out.print(new String(buff, 0, targetIndex));
              System.exit(0);
            } else {
              System.out.println(lastContent);
              lastContent = content;
            }
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

3.标准输入、输出流

System类中提供了重定向标准输入、输出的方法。

public class RedirectOut {
  public static void main(String[] args) {
    try (PrintStream ps = new PrintStream(new FileOutputStream("out.txt"))) {
      // redirect the output to ps
      System.setOut(ps);
      System.out.println("hello");
      System.out.println(new RedirectOut());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
    public class RedirectIn {
      public static void main(String[] args) {
        try (FileInputStream in = new FileInputStream(
            "src/inputandoutput/RedirectIn.java")) {
          System.setIn(in);
          Scanner scan = new Scanner(System.in);
          // only use \n as Delimiter
          scan.useDelimiter("\n");
          while (scan.hasNext()) {
            System.out.println("content:" + scan.next());
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

4.进程通信

Runtime对象的exec()方法可以运行平台上其它程序,该方法产生一个Process()对象代表子进程,Process类中就提供了进程通信的方法。

    public class ReadFromTest {
      public static void main(String[] args) throws IOException {
        Process p = Runtime.getRuntime().exec("javac");
        try (BufferedReader br = new BufferedReader(new InputStreamReader(
            p.getErrorStream()))) {
          String buff = null;
          while ((buff = br.readLine()) != null) {
            System.out.println(buff);
          }
        }
      }
    }

上述代码获取了javac进程的错误流,进行了打印。在下列代码中可以在Java程序中启动Java虚拟机运行另一个java程序,并向另一个程序中输入数据。

    public class WriteToProcess {
      public static void main(String[] args) throws IOException {
        Process p = Runtime.getRuntime().exec("java ReadStandard");
        try (
        // 以p进程的输出流创建PrintStream,该输出流对本进程为输出流,对p进程则为输入流
        PrintStream ps = new PrintStream(p.getOutputStream())) {
          ps.println("normal string");
          ps.println(new WriteToProcess());
        }
      }
    }
    class ReadStandard {
      public static void main(String[] args) throws FileNotFoundException {
        try (Scanner scan = new Scanner(System.in);
            PrintStream ps = new PrintStream(
                new FileOutputStream("out.txt"))) {
          scan.useDelimiter("\n");
          while (scan.hasNext()) {
            ps.println("KeyBoards input:" + scan.next());
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

这篇文章就介绍到这里了。

相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
27天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
138 83
|
24天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
27天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
54 26
|
28天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
50 24
|
13天前
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
28天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
50 9
|
27天前
|
数据采集 存储 监控
Java爬虫:数据采集的强大工具
在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。
|
2月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
42 1
[Java]线程生命周期与线程通信
|
1月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
39 3