首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java - IO System类支持和缓冲流

Java - IO System类支持和缓冲流

作者头像
Mirror王宇阳
发布2020-11-12 11:13:02
发布2020-11-12 11:13:02
6670
举报

System类的支持和缓冲流

System类对IO的支持

  • 在System类中,为了支持IO操作提供了三个常量:
    • 错误输出:
代码语言:javascript
复制
public static final PrintStream err;
代码语言:javascript
复制
public static final PrintStream out; 
代码语言:javascript
复制
public static final InputStream in;

错误输出

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

  • 几乎无用!

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

信息输出

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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));
	}
}
代码语言:javascript
复制
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数组接收输入数据,但是数组有长度限制,用户一旦不可控的输入过长的数据该如何?

  • 解决方法

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

代码语言:javascript
复制
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构造
代码语言:javascript
复制
public BufferedReader(Reader in);
读取一行数据
代码语言:javascript
复制
public String readLine() thows IOException;

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

  • InputStream 和 Reader 类之间的转换

引用:InputStreamReader类

代码语言:javascript
复制
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缓冲输入流不仅仅可以可以从键盘中获得,也可以从文件中获得

代码语言:javascript
复制
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();
	}
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • System类的支持和缓冲流
    • System类对IO的支持
      • 错误输出
      • 信息输出
      • 系统输入
    • 缓冲流
      • 缓冲操作流
      • 字符缓冲输入流
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档