java的IO操作:System类对IO的支持。

目标:

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数组中,然后把数组输出。

时间: 2024-10-06 09:23:14

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

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

基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import java.io.IOException; /** * java标准IO(input/output)操作 * 输入流InputStrean:用于从数据源读取数据到程序中 * 输出流OutputStream:用于将数据发送至目标 * * 流划分为:节点流,处理流 * 节点流:又叫做低级流,特点:数据源明确,

Java IO 之 System类

1.使用System.in.read读取,使用System.out.println 输出 1 package org.zln.io; 2 3 import java.io.IOException; 4 5 /** 6 * Created by coolkid on 2015/6/21 0021. 7 */ 8 public class TestSystemInReadString { 9 public static void main(String[] args) throws IOExcept

java常用API之System类

System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作.System类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象.System类中的都是static方法,类名访问即可. 常用方法: l  currentTimeMillis() 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值 l  exit(int status) 用来结束正在运行的Java程序.参数传入一个数字即可.通常传入0记为正常状态,其他为异常状态 l  gc() 用来运行J

java 静态导入、System类、Date类、Runtime类、Calendar类、Collections类中的shuffle方法、Math类

/* JDK1.5版本新特性(续):静态导入 注意:当类名重名时,需要指定具体的包名: 当方法名重名时,需要指定具体的类名. */ import java.util.*; import static java.util.Arrays.*;//导入Arrays工具类中的所有静态成员. import static java.lang.System.*;//导入了System类中所有的静态成员,注意System类中的成员都是静态的. class StaticImport { public static

Java的IO操作---File类

目标 1)掌握File类作用 2)可以使用file类中方法对文件进行读写操作. File类 唯一与文件有关的类.使用file类可进行创建或删除操作,要想使用File类,首先观察File类的构造方法. public File(String pathname);实例化File类的时候,必须设置好路径. 常量:: public staitc final String pathSeparator: 明明使用了static final定义的常量,这里为什么使用了小写方式.实际上这属于JAVA的历史遗留问题

java基础之IO操作

IO操作 ·文件类的使用(File) ·IO中流的基本使用(字符流.字节流.内存流.打印流) ·System类对IO的支持 ·对象序列化的问题 在整个的IO操作中,流的操作分为两种: ·字节流 字节输出流:OutputStream 字节输入流:InputStream ·字符流 字符输出流:Writer 字符输入流:Reader IO操作的基本步骤: 在Java的使用io的话,必须要按照以下的几个步骤进行(对文件操作来说): ·使用File找到一个文件 ·使用字节流或者字符流的子类为OutputS

python之协程与IO操作

协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕. 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序. 子程序调用总是一个入口,一次返回,调用顺序是明确的.而协程的调用和子程序不同. 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,

cocos2d-x android环境中lua脚本的io操作

因为android的安装包安装之后,是以压缩文件的形式存储.故在lua脚本中,直接使用io操作(如:io.open等)是无法找到文件的(ios和windows平台无此问题). 在论坛中找到一个解决办法http://www.cocoachina.com/bbs/read.php?tid=198542 原理是在lua中调用CCString:createWithContentsOfFile方法,使用c++代码去打开文件.具体代码: local str = CCString:createWithCont

IO操作与IO模型

目录 一 .IO操作本质 二. IO模型 BIO – 阻塞模式I/O NIO – 非阻塞模式I/O IO Multiplexing - I/O多路复用模型 AIO – 异步I/O模型 三.同步I/O与异步I/O 四. IO设计模式 Reactor模式 Proactor模式 对比分析 一 .IO操作本质 数据复制的过程中不会消耗CPU # 1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作.网络请求加载到内存的数