(八)“标准”的输入流与输出流
2017-03-13 本文已影响86人
黒猫
1、基本介绍
在IO流基础中的第2部分,有关设备 的内容中提到了键盘(标准输入)、控制台(标准输出),下面就详细的介绍一下什么是标准的输入与输出:
标准的输入流与输出流都属于System类的静态成员。
其中in代表的是已经创建好的可以直接从键盘读取的InputStream类型的流对象;
public static final InputStream in
out代表的是已经创建好的可以直接写入数据到控制台的PrintStream类型的流对象;
public static final PrintStream out
对于简单独立的 Java 应用程序,编写一行输出数据的典型方式是:
System.out.println(data)
2、使用标准的输入流
import java.io.IOException;
import java.io.InputStream;
public class Test1 {
public static void main(String[] args) throws IOException {
Demo1();
}
public static void Demo1() throws IOException{
//使用标准输入流,即从键盘直接输入
InputStream is = System.in;
/*
* in是System类的一个静态成员
* 因此可以通过类名直接访问,即System.in
* in又是InputStream对象的引用
* 因此创建InputStream对象is指向in
*/
int num = is.read();//每次读取单个字符,返回字节
//read()方法被称为阻塞式方法,只要没有输入,就会一直等待
System.out.println((char)num);
}
}
3、使用标准的输入流实现简单功能
import java.io.IOException;
import java.io.InputStream;
public class Test2 {
public static void main(String[] args) throws IOException {
Demo2();
}
public static void Demo2() throws IOException{
/*
* 实现如下功能:
* 循环读取键盘输入的数据
* 满一行之后输出大写字符
* 不满一行进行存储
*/
InputStream in = System.in;
int num;
//从键盘输入的都是字符,因此使用StringBuilder处理进行存储
StringBuilder sb = new StringBuilder();
while(true){
num = in.read();
if(num=='\r'){//windows下换行符为"\r\n"两个字符
continue;//如果是'\r'就继续
}else if(num=='\n'){//如果是'\n'则表示已满一行
if("over".equals(sb.toString())){
break;//如果输入"over"结束循环
}
System.out.println(sb.toString().toUpperCase());//获得输入的字符串并调用转大写方法
//在下次输出前清除StringBuilder中存储的字符串
sb.delete(0, sb.length());//删除从下标0开始到字符串全长也就是末尾的字符
}else{
sb.append((char)num);//不满一行就存储数据
}
}
}
}
4、优化上述功能
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
public class Test3 {
public static void main(String[] args) throws IOException {
Demo3();
}
public static void Demo3() throws IOException{
//使用ReadLine优化Demo2()
/*
* 转换流:
* 可以把字节输入流转换成字符输入流的类:InputStreamReader
* 可以把字节输出流转换成字符输出流的类:OutputStreamWriter
*/
//定义标准的字节输入流
InputStream in = System.in;
//把字节输入流转换成字符输入流
InputStreamReader isr = new InputStreamReader(in);
//为了提高效率,使用BufferedReader
BufferedReader br = new BufferedReader(isr);
//定义标准的字符输出流
PrintStream out = System.out;
//把字节输出流转换成字符输出流
OutputStreamWriter osw = new OutputStreamWriter(out);
//为了提高效率,使用BufferedWriter
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
//每次从键盘读取一行
while((line=br.readLine())!=null){
if("over".equals(line)){//如果输入"over"结束循环
break;
}
//使用字符流输出
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
5、进一步精简上述代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test4{
public static void main(String[] args) throws IOException {
Demo4();
}
public static void Demo4() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
//直接使用标准字节流输出
System.out.println(line.toUpperCase());
/*
* 与in类似,out也是定义在System类中的静态成员,所属类型为printStream
* out就是字节输出流对象,对象可调用println方法,即out.println
* 对比可见直节使用字节输出流仅需要一行代码
* 同时也不再需要定义更多的变量
* 因此在平时使用时常用字节流输出
*/
}
br.close();
}
}
6、优化标准的输入与输出
之前标准的输入流与输出流是指从键盘直接读取并且写入到控制台,如下:
源(从哪读):键盘
目的(往哪写):控制台
现在要实现从键盘读取,直接写入到文件中,如下:
源(从哪读):键盘
目的(往哪写):文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
public class Test5 {
public static void main(String[] args) throws IOException {
Demo5();
}
public static void Demo5() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\Demo5.txt"));
String line = null;
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
接着要实现从文件读取,写入到控制台,如下:
源(从哪读):文件
目的(往哪写):控制台
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Test6 {
public static void main(String[] args) throws IOException {
Demo6();
}
public static void Demo6() throws IOException{
BufferedReader br = new BufferedReader(new FileReader("F:\\Demo5.txt"));
String line = null;
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
System.out.println(line.toUpperCase());
}
br.close();
}
}
7、改变标准的输入与输出
改变标准的输入:System.setIn();
改变标准的输出:System.setOut();
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
public class Test7 {
public static void main(String[] args) throws IOException {
Demo7();
}
public static void Demo7() throws IOException{
System.setIn(new FileInputStream("F:\\Demo5.txt"));//改变标准的输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.setOut(new PrintStream("F:\\Demo5_copy.txt"));//改变标准的输出
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作! ↓↓↓