System类的支持和缓冲流

System类对IO的支持

  • 在System类中,为了支持IO操作提供了三个常量:

    • 错误输出:
    public static final PrintStream err;
    • 输出到标准输出设备(显示器)
    public static final PrintStream out;
    • 从标准输入(键盘)设备输入
    public static final InputStream in;

错误输出

System.err 是 PrintStream 类对象,此对象专门负责进行错误信息的输出操作

  • 几乎无用!

system.err 和 System.out 的功能是完全一样的;之所以设计 System.err 主要目的就是 err 可以输出用户看不见的错误,而 System.out 输出用户可见的信息。

信息输出

System.out 是在Java中专门支持屏幕输出信息的操作对象(对象由系统赋值实例化

public class TestDemo {
public static void main(String [] args) throws IOException {
OutputStream out = System.out;
out.write("Hello,World!".getBytes());
}
}

上述程序:通过System.out实例对象,OutputStream out 转为了向屏幕输出

系统输入

System.in:键盘输入操作。Java并没有直接提供键盘输入功能;而System类中提供了 in 对象,此对象类型是 IntputStream

public class TestDemo {
public static void main(String [] args) throws IOException {
InputStream in = System.in ; // System.in对象是系统实例化,
byte [] data = new byte[1024];
int len = in.read(data); // 输入数据
System.out.println(new String(data,0,len));
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
//InputStream in = System.in ; // System.in对象是系统实例化,
byte [] data = new byte[1024];
int len = System.in.read(data); // 输入数据
System.out.println(new String(data,0,len));
}
}

System.out 和 System.in 都是系统实例化的对象,在程序中均是向上转型。

在系统输入中,利用byte数组接收输入数据,但是数组有长度限制,用户一旦不可控的输入过长的数据该如何?

  • 解决方法

通过接收单字符并不断追加的方式可以避免长度限制自由的输入数据

public class TestDemo {
public static void main(String [] args) throws IOException {
StringBuffer buf = new StringBuffer();
int temp = 0 ;
while ((temp = System.in.read()) != -1) {
// \n 换行也属于Char字符
if ( temp == '\n') {
break;
}
buf.append((char)temp);
}
System.out.println(buf);
}
}

如上,我们利用StringBuffer类对象 buf ,不断追加Char型字符;由此达到不受长度限制任意接收输入的字符。

  • 问题提出:

按照上述的方法,若是输入的数据为 中文 内容,则可能会导致乱码现象。

原因:

​ 中文汉字,每个汉字占用两个字节,而一个英文字符占用一个字节。

​ 而我们的方法中,是按照单个字节进行读取的,由此导致乱码。

缓冲流

  • 解决中文字符输入带来的诸多问题

处理中文输入的问题,由于中文单字符占两个字节,由此我们首先想到的是利用字符流处理中文数据。

缓冲操作流

字符缓冲区流:

  • BufferedReader:字符缓冲输入流
  • BufferedWriter:字符缓冲输出流

字节缓冲区流:

  • BufferedInputStream:字节缓冲输入流
  • BufferedOutputStream:字节缓冲输出流

字符缓冲输入流

BufferedReader构造

public BufferedReader(Reader in);

读取一行数据

public String readLine() thows IOException;

若是利用BufferedReader类来处理System.in操作,是不可直接的;因为System.in是InputStream的类型。

  • InputStream 和 Reader 类之间的转换

引用:InputStreamReader类

public class TestDemo {
public static void main(String [] args) throws IOException {
// System.in 是InputStream的类对象
// BufferedReader的构造方法接收的是Reader类对象
// 利用InputStreamReader将字节流变为字符流
BufferedReader buf =
new BufferedReader
(new InputStreamReader(System.in));
// 调用readLine()方法接收一行数据,以String数据返回,并且以 \n 作为分隔
String str = buf.readLine();
System.out.println(str);
}
}

BufferedReader类构造接收的数据是 Reader字符流对象;

利用InputStreamReader类将字节流类对象的Systen.in转为字符流的类对象Reader。

文件读取

BufferedReader缓冲输入流不仅仅可以可以从键盘中获得,也可以从文件中获得

public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
if (!file.exists()) {
file.mkdirs();
}
BufferedReader buf =
new BufferedReader
// FileReader():实例的为字符流数据,而BufferedReader接收Reader字符流
(new FileReader(file));
String str = null;
while ((str = buf.readLine()) != null) {
System.out.println(str);
}
buf.close();
}
}

Java - IO System类支持和缓冲流的更多相关文章

  1. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  2. [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类

    从本文开始,将正式进入JavaIO的简介 在继续javaIO系列的文章之前 可以过去看一下 本人博客上的设计模式中的 适配器模式和装饰器模式 这会对接下来的阅读大有帮助   本文是从逻辑上介绍整个的J ...

  3. java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例

    本章内容包括3个部分:BufferedInputStream介绍,BufferedInputStream源码,以及BufferedInputStream使用示例. 转载请注明出处:http://www ...

  4. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  5. Java IO: System.in, System.out, System.err

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) System.in, System.out, System.err这3个流同样是常见的数据来 ...

  6. java 的SYSTEM类【转】

    java 的SYSTEM类[转] Posted on 2009-12-03 16:46 火之光 阅读(728) 评论(0) 编辑 收藏 System类代表系统,系统级的很多属性和控制方法都放置在该类的 ...

  7. java.io.File类

    java.io.File类 1.凡是与输入.输出相关的类.接口等都定义在java.io包下 2.File是一个类.能够有构造器创建其对象.此对象相应着一个文件(.txt .avi .doc .ppt ...

  8. java.io.File类操作

    一.java.io.File类 String path="E:/222/aaa";//路径 String path1="aaa.txt"; File file= ...

  9. java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例

    本章内容包括3个部分:BufferedOutputStream介绍,BufferedOutputStream源码,以及BufferedOutputStream使用示例. 转载请注明出处:http:// ...

随机推荐

  1. linux系统centos7安装最新版本nginx

    一.准备环境 1.安装centos,一般买一个阿里云测试 2.下载nginx,链接http://nginx.org/download/nginx-1.10.2.tar.gz 二.开始安装 1.cent ...

  2. JS--- part6课程介绍 & part5复习

    part6 课程介绍 scroll系列:-----重点,每个属性是什么意思 封装scroll系列的相关的属性,固定导航栏案例---事件浏览器的滚动条事件--能够写出来 封装动画函数---缓动动画--- ...

  3. vue解惑之slot(插槽)

    一.插槽是个什么玩意,能吃吗 在vue中[插槽],从字面意思来看,插槽意味着[内容的增加],回到vue的使用场景,插槽就是[父组件调用子组件时,额外增加的内容]. 插槽显不显示.显示的内容是由父组件来 ...

  4. selenium的安装、报错和解决

      selenium是的作用是模拟点击浏览器上的按钮,配合一个无头浏览器就可以快速解决一些前端需要加解密的功能. 第一步pip install selenium安装的第一步就是用pip把模块下载回来. ...

  5. linux学习第一周

    1. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别 2. 安装Centos7.6操作系统,创建一个自己名字的用户名,并可以正常登录,将主要步骤截图. 3. 配置环境变量,实现执行hi ...

  6. 新手Linux之路之Deepin

    用了很久的Window,心血来潮想换个系统,于是就开始踩坑Linux之路. 系统为deepin 首先基本的 设置root密码 $:sudo passwd root [sudo] password fo ...

  7. Git常用进阶操作之一

    提起Git,经常做项目的我们都不陌生,我们常用的功能有哪些呢? 这里按个人使用情况简单总结一下. 像新建远程仓库.新建分支这些就不说了,不熟的同学可以翻看我前面写的git基本操作. 1.首先提一下为每 ...

  8. 对python函数后面有多个括号的理解?

    一般而言,函数后面只有一个括号.如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号,说明前面那个也返回了一个函数.以此类推. 比如fun()() def fun(): prin ...

  9. Java每日一面(Part1:计算机网络)[19/11/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[1] 1.1 HTTP简介 ​ HTTP协议,即超文本传输协议,属于应用层的协议,他是基于请求和响应模式的无状态的 应用层协议. ...

  10. win10下配置python环境变量(Python配置环境变量)

    从官网下载Windows下的python版本,一路按照默认进行安装. 安装之后配置环境变量的步骤如下: 1,点“我的电脑”,右键选“属性”. 2,选择“高级系统设置”--->选“环境变量”--- ...