目标:

1,掌握SYStem对IO的三种支持:

system.out

system.in

system.err

2,掌握system.out及system.err的区别。

3,掌握输入,输出重定向。

System类的常量

java给system类对IO有一定支持,预制了三个常量。

PrintStream out,PrintStream err,InputStream in。

使用static final 声明的变量是全局常量,只要是常量,所有单词字母必须全部大写。但是这里没有,是java历史遗留问题。

System.out

使用system.out输出就是将输出位置定义在显示器之中。

FilloutputStream输出位置定义在文件里,而System.out定位在屏幕上。

使用outputStream完成屏幕上输出。

PrintStream就是OutputStream子类。

package 类集;
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() ;
}
}
};

输出结果:

解读:

OutputStream正常来说是OutputStream out=new OutputStream(F f);其中f指定了文件输出路径,但是这里直接给out赋值System.out实例,因为这个

实例的输出对象是屏幕,所以out的输出路径就是屏幕。

很明显,这是对象多态的体现,根据实现的子类的不同。完成的功能也不同

注意:OutputStream的write方法的接收对象是byte[]数组。使用getBytes()转换成byte数组。以及关闭输出流。

System.err

错误的标准输出。如果程序出现错误,直接使用System.err打印输出即可。

package 类集;
public class SystemDemo01{
public static void main(String args[]){
String str = "hello" ; // 声明一个非数字的字符串
try{
System.out.println(Integer.parseInt(str)) ; // 转型
}catch(Exception e){
System.err.println(e) ;
}
}
};

输出结果:

java.lang.NumberFormatException: For input string: "hello"

如果此时不用system.err,用system.out不也一样吗?

err和out区别。

两者都能打印错误信息,但是一般来讲,system.out是将信息显示给用户,而system.err是不希望用户看到,后台显示的。专门显示错误的。

要想输出错误,最好不要使用system.out而直接使用system.err。

system.in

实际上是一个键盘的输入流,其本身是InputStream类型对象,那么可以利用此对象从磁盘读取数据信息

InputStream是一个输入流,输入流肯定可以从指定位置读取,之前的FillInputStream,是从文件中读取,

package 类集;
import java.io.InputStream; public class SystemDemo01{
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() ; // 关闭输入流
}
};

运行结果:

解读:首先定义一个InputStream对象input,赋值为system.in,使之可以从键盘接收对象,然后开辟一个byte数组,用来接收输入的数据,

input.read(数组),把输入的数据赋值给byte数组,最终返回输入的数组大小len,使用new String()方法,把byte数组转换成String类型输出。

需要注意的是,new String(b,o,len),必须指定输出的头和尾,如果不指定的话,就可能把没有数据的地方输出,如,我定义了一个36空间的数组,输入后,输出结果如下:

但是数据输入了,以上操作是否存在问题呢?

问题1:指定了数组的长度,如果现在输入的数据超过了长度范围,则只能输入部分数据。

问题2:byte数组长度是奇数的话,可能会出现中文字符乱码问题。因为一个中文字符占用两个字节。

那么,如果不知道byte数组长度呢,是否可以完成输入要求? 

只能通过判断标志位的方式完成。

package 类集;
import java.io.InputStream; public class SystemDemo01{
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() ; // 关闭输入流
}
};

思路:

定义一个StringBuffer类,用来接收保存字符串,对于每次输入字符,通过input.read()方法,读取一个字节,赋值给temp,当读取到回车键时候,temp的值为-1,

然后temp转换成char类型,char类型后,就可以拼接给StringBuffer对象了。

注意:因为回车也是一个字符,所以,如果获取的字符是回车的话,就退出循环,if(c=='\n') break;

但是,以上代码,输入中文的话就会报错

要想实现以上功能,只能通过下一节的BufferReader类。

输入输出重定向

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

setOut实例:

package 类集;
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.PrintStream ;
public class SystemDemo01{
public static void main(String args[]) throws Exception{
System.setOut(
new PrintStream(
new FileOutputStream("d:" + File.separator + "red.txt"))) ; // System.out输出重定向

System.out.print
("www.mldnjava.cn") ; // 输出时,不再向屏幕上输出
System.out.println(",李兴华") ;
}
};

此时输出不在在控制台,而在指定文件里输出了。

实际上可通过此操作完成错误的重定向。

System.out是希望用户看到的信息,一旦有错误,最好保存起来。

package 类集;
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.PrintStream ;
public class SystemDemo01{
public static void main(String args[]) throws Exception{
String str = "hello" ; // 声明一个非数字的字符串
try{
System.out.println(Integer.parseInt(str)) ; // 转型
}catch(Exception e){
try{
System.setOut(
new PrintStream( new FileOutputStream("d:"+ File.separator + "err.log"))) ; // 输出重定向
}catch(Exception e1){ }
System.out.println(e) ;
}
}
};

注意System.setOut方法的位置,放在try catch中间,这样,当发生错误的时候才会改变输出重定向

为System.err重定向。

利用System.err向屏幕输出信息。此时为了方便起见,使用内存操作流。

package 类集;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream ;
public class SystemDemo01{
public static void main(String args[]) throws Exception{
ByteArrayOutputStream bos = null ; // 声明内存输出流
bos
= new ByteArrayOutputStream() ; // 实例化
System.setErr(new PrintStream(bos)) ; // 输出重定向
System.err.print("www.mldnjava.cn") ; // 错误输出,不再向屏幕上输出
System.err.println("李兴华") ; // 向内存中输出
System.out.println(bos) ; // 输出内存中的数据
}
};

输出结果:

思路:重定向错误输出位置为内存,所以,打印错误的时候,会向已经重定向的内存对象实例里输入内存,输出的时候,输出对应的内存对象实例里面的数据。

建议:一般不建议修改system.err的输出位置。因为这些信息不希望用户看见。

System.in重定向

默认情况下,system.in是指向屏幕的,也可通过setin方法,改变输入的位置,例如现在从文件中读取。

package 类集;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class SystemDemo01{
public static void main(String args[]) throws Exception{
System.setIn(new FileInputStream("d:" + File.separator + "red.txt")) ; // 设置输入重定向
InputStream input = System.in ; // 从文件中接收数据
byte b[] = new byte[1024] ;// 开辟空间,接收数据
int len = input.read(b) ; //接收
System.out.println("输入的内容为:" + new String(b,0,len)) ;
input.close() ; // 关闭输入流
}
};

这样就不用键盘输入了,直接从目标文件中读取数据,赋值给byte数组中,然后把数组输出。

java的IO操作:System类对IO的支持。的更多相关文章

  1. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO

    (三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...

  2. JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

    基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...

  3. Java IO 之 System类

    1.使用System.in.read读取,使用System.out.println 输出 package org.zln.io; import java.io.IOException; /** * C ...

  4. 09、IO流—File类与IO流

    目录 一.File类 基本认识 实用方法 获取功能 重命名功能(包含剪切) 判断功能 创建.删除文件 实际小案例 二.IO流 1.认识IO流 2.IO流基类介绍 字节流基类介绍 字符流基类介绍 三.节 ...

  5. Java 基础 常用API (System类,Math类,Arrays, BigInteger,)

    基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...

  6. java常用API之System类

    System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作.System类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象.System类中的都是static方法,类 ...

  7. java学习笔记之System类

    System类常用总结 System类概述 java.lang.System类,系统属性信息工具类 常用静态方法: 1. public static long currentTimeMillis() ...

  8. Java的IO操作---File类

    目标 1)掌握File类作用 2)可以使用file类中方法对文件进行读写操作. File类 唯一与文件有关的类.使用file类可进行创建或删除操作,要想使用File类,首先观察File类的构造方法. ...

  9. 吴裕雄--天生自然JAVAIO操作学习笔记:System类对IO的支持和BuffereRead

    import java.io.OutputStream ; import java.io.IOException ; public class SystemDemo01{ public static ...

随机推荐

  1. Ajax 生成流文件下载(实现代码)

    // 绑定导出按钮    $("#btnExport").clickCheckLogin(function () { var form = $("<form> ...

  2. EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别

    在使用EntityFramework开发时,.NET的System.Linq.Enumerable类为我们提供了许多Linq方法. 给大家分享一下关于First.FirstOrDefault.Sing ...

  3. ubuntu 18.04下编译最新版本的KMS

    KMS:kurento媒体服务,即 kurento media server 很庞大的一个WEBRTC项目,GIT库主项目:https://github.com/Kurento 基础实现,修改了gst ...

  4. 【Ubuntu】使用root账户登录ubuntu

    由于经常使用,所以写个博客记下来以便后来查看. 1.修改root账户密码:sudo passwd root,输密码 2.修改/usr/share/lightdm/lightdm.conf.d/50-u ...

  5. 谜题8:Dos Equis

    这个谜题将测试你对条件操作符的掌握程度,这个操作符有一个更广为人知的名字:问号冒号操作符.下面的程序将会打印出什么呢? public class DosEquis{ public static voi ...

  6. 【博弈论】【SG函数】【找规律】Gym - 101147A - The game of Osho

    以后这种题还是不能空想,必须打个表看看,规律还是比较好找的……具体是啥看代码.用SG函数暴力的部分就不放了. #include<cstdio> using namespace std; i ...

  7. 【dfs】【高斯消元】【异或方程组】bzoj1770 [Usaco2009 Nov]lights 燈 / bzoj2466 [中山市选2009]树

    经典的开关灯问题. 高斯消元后矩阵对角线B[i][i]若是0,则第i个未知数是自由元(S个),它们可以任意取值,而让非自由元顺应它们,得到2S组解. 枚举自由元取0/1,最终得到最优解. 不知为何正着 ...

  8. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  9. 【暴力】【推导】bzoj1088 [SCOI2005]扫雷Mine

    考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响. 也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了. 因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可. ...

  10. 6.3(java学习笔记)缓冲流

    一.缓冲流 使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出. 避免程序频繁的和文件直接操作,这样操作有利于提高读写效率. 缓冲流是构建在输入输出流之上的,可以理 ...