[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重定向操纵的是字节流,而不是字符流。
参考资料
Java 编程思想
Java 开发实战经典
[Java IO]04_系统标准IO的更多相关文章
- 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口
最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...
- 【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket
简介 Java NIO从JDK1.4引入,它提供了与标准IO完全不同的工作方式. NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题. 1. ...
- 文件IO函数和标准IO库的区别
摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...
- 标准io与文件io
A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...
- linux标准io的copy
---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...
- (九)errno和perror、标准IO
3.1.6.文件读写的一些细节3.1.6.1.errno和perror(1)errno就是error number,意思就是错误号码.linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会 ...
- 标准IO操作
前言 本文介绍使用java进行简单的标准IO操作. 操作步骤 1. 定义一个Scanner对象 2. 调用该对象的input函数族 (参见下面代码) 3. input函数的返回结果即是获取到的输入 示 ...
- 18、标准IO库详解及实例
标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...
- 为什么需要标准IO缓冲?
(转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...
随机推荐
- CSS基础篇之选择符3
border(边框) 如何用CSS调出边框 我们给p标签加一个边框试一下 p{ border:1px solid #ccc:/*这是缩写*/ } 第一个值是为边框的宽度 第二个值是为边框线样式为直线 ...
- XMLHTTPRequest对象的创建与浏览器的兼容问题
MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...
- ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
症状: 类似上面的警告提示,运行程序不会有任何错误,但若干地方都提示警告,并且明明dll的引用都是正确的. 解决方案: 删除:C:\Users\{your computer name}\AppData ...
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
- 如何在没有域的环境中搭建AlwaysOn(二)
对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 上篇博客 ...
- Module Zero之权限管理
返回<Module Zero学习目录> 概览介绍 角色权限 用户权限 概览介绍 Module-Zero实现了ABP授权系统的IPermissionChecker接口.这篇文章中,我们将会看 ...
- Java邮件发送与接收原理
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项
我们都知道,当一条记录进入审批流程以后会自动加锁,apex提供Approval类的lock和unlock方法可以让我们使用代码对记录进行加锁和解锁. 项目中遇到一个需求,需要当某种情况下对记录进行先解 ...
- 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)
文章转载地址 http://www.vxzsk.com/87.html 设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...
- The replication agent has not logged a progress message in 10 minutes.
打开Replication Monitor,在Subscription Watch List Tab中,发现有大量的status= “Performance critical” 的黄色Warning, ...