【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();
        }
      }
    }

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

相关文章
|
7天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
39 16
|
2月前
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
3月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
70 10
|
4月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
55 1
[Java]线程生命周期与线程通信
|
3月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
3月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
55 3
|
4月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
3月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
43 1
|
3月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
4月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
135 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)

热门文章

最新文章