[Java IO]04_系统标准IO

简介:

 

System表示系统类,它有3个与 Java IO 有关的常量。

  • System.out——系统标准输出
  • System.in——系统标准输入
  • System.err——错误信息输出  

 


System.out

 

System.out 是 PrintStream 的对象,在 PrintStream 中定义了一些了的 print() 和 println() 方法。

所以,常见的 System.out.print() 或 System.out.println() 语句调用的实际上是 PrintStream 类的方法。

例 使用 OutputStream 向屏幕上输出

复制代码
import java.io.OutputStream;
import java.io.IOException;

public  class SystemDemo01 {
     public  static  void main(String args[]) {
        OutputStream out = System.out;  //  此时的输出流是向屏幕上输出
         try {
            out.write("hello world!!!".getBytes());  //  向屏幕上输出
        }  catch (IOException e) {
            e.printStackTrace();  //  打印异常
        }
         try {
            out.close();  //  关闭输出流
        }  catch (IOException e) {
            e.printStackTrace();
        }
    }
};
复制代码

 

System.in

 

System.in 是 InputStream 类型的对象,可以利用它完成从键盘读取数据的功能。

例 从键盘读取数据

复制代码
import java.io.InputStream;

public  class SystemInDemo {
     public  static  void main(String args[])  throws Exception {
        InputStream input = System.in;
        
         byte b[] =  new  byte[5];  //  开辟空间,接收数据
        System.out.print("请输入内容:");
        
         int len = input.read(b);  //  接收数据
        System.out.println("输入的内容为:" +  new String(b, 0, len));
        
        input.close();  //  关闭输入流
    }
};
复制代码

运行结果

请输入内容:Good Bye
输入的内容为:Good

上述结果中,输入内容并没有被完整打印出来。

这是因为代码中限制了存储数据的 byte 数组的大小。

如果不知道要输入的数据的实际长度,如何处理呢?

例 不指定大小,从键盘读取数据

复制代码
import java.io.InputStream;

public  class SystemInDemo2 {
     public  static  void main(String args[])  throws Exception {  //  所有异常抛出
        InputStream input = System.in;  //  从键盘接收数据

        StringBuffer buf =  new StringBuffer();  //  使用StringBuffer接收数据
        System.out.print("请输入内容:");

         int temp = 0;
         while ((temp = input.read()) != -1) {  //  接收内容
             char c = ( char) temp;
             if (c == '\n') {  //  退出循环,输入回车表示输入完成
                 break;
            }
            buf.append(c);  //  保存内容
        }
        System.out.println("输入的内容为:" + buf);

        input.close();  //  关闭输入流
    }
};
复制代码

运行结果

请输入内容:To be or not to be, that's a question.
输入的内容为:To be or not to be, that's a question.

但是,如果输入的是中文,则会出现乱码,如下:

请输入内容:计算机软件
输入的内容为:?????ú?í??

这是因为汉字一个字符占两个字节,而数据却一个一个字节的方式读进来的,所以造成了乱码。

最好的输入方式是将全部输入数据暂时存放在一块内存中,然后一次性从内存中读取出数据。

这样,既不会造成乱码,也不受长度限制。要完成这样的操作可以使用 BufferedReader 类去完成。

 

System.err

 

System.err 表示的是错误信息输出,如果程序出现错误,则可以直接使用 System.err 进行输出。

例 打印错误信息

复制代码
public  class SystemErrDemo {
     public  static  void main(String args[]) {
        String str =  null;
         try {
            System.out.println(Integer.parseInt(str));  //  转型
        }  catch (Exception e) {
            System.err.println(e);
        }
    }
};
复制代码

运行结果

java.lang.NumberFormatException:  null

 

IO 重定向

System 类可以改变 System.in 的输入流来源以及 System.out 和 System.err 两个输出流的输出位置。

复制代码
import java.io.*;

public  class RedirectDemo {
     public  static  void main(String[] args)  throws IOException {
        PrintStream console = System.out;
        BufferedInputStream in =  new BufferedInputStream( new FileInputStream("d:\\in.txt"));  //  绑定输入文件
        PrintStream out =  new PrintStream( new BufferedOutputStream( new FileOutputStream("d:\\out.txt")));  //  绑定输出文件

        
//  设置重定向
        System.setIn(in);
        System.setOut(out);
        System.setErr(out);

        BufferedReader br =  new BufferedReader( new InputStreamReader(System.in));
        String s;
         while ((s = br.readLine()) !=  null) {
            System.out.println(s);
            out.close();
            System.setOut(console);
        }
    }
}
复制代码

需要注意的是,I/O重定向操纵的是字节流,而不是字符流。

 本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/4582641.html,如需转载请自行联系原作者

相关文章
|
11月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
509 7
|
10月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
9月前
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
684 24
|
9月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
655 8
|
9月前
|
安全 前端开发 Java
使用Java编写UDP协议的简易群聊系统
通过这个基础框架,你可以进一步增加更多的功能,例如用户认证、消息格式化、更复杂的客户端界面等,来丰富你的群聊系统。
327 11
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
432 10
|
9月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
1098 4
|
9月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
342 1
|
10月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
656 1
|
9月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
716 0