@[toc]
处理流之三标准输入、输出流
关于System类可参考文章:Java中System类、Math类、BigInteger与BigDecimal分别是什么?
- System.in和System.out分别代表了系统标准的输入和输出设备(控制台的输出输入)
- 默认输入设备是:键盘,输出设备是:显示器
- System.in的类型是InputStream
- System.out的类型是PrintStream,其是OutputStream的子类 FilterOutputStream 的子类
重定向:通过System类的setIn,setOut方法对默认设备进行改变。
- public static void setIn(InputStream in)
- public static void setOut(PrintStream out)
练习题引入:
题目:从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续 进行输入操作,直至当输入“e”或者“exit”时,退出程序。
方法一:用Scanner类实现,调用next()返回一个字符串
/*
从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续
进行输入操作,直至当输入“e”或者“exit”时,退出程序。
*/
public class LxtTest {
public static void main(String[] args) {
while (true){
System.out.print("请输入:");
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
if (next.equals("e")||next.equals("exit")){
System.out.println("程序终止!");
break;
}else {
System.out.println(next.toUpperCase());
}
}
}
}
方法二:用System.in实现。System.in--->转换流--->bufferedReader的readLine()
package com.jsm.IO_05;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class OtherStreamTest {
public static void main(String[] args) {
/*
标准的输入、输出流
System.in:标准的输入流,默认从键盘输入
System.out:标准的输出流,默认从控制台输出
*/
BufferedReader br = null;
try {
InputStreamReader isr = new InputStreamReader(System.in);
br = new BufferedReader(isr);
while (true) {
System.out.println("请输入字符串:");
String data = br.readLine();
if ("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)) {
System.out.println("输入终止!");
break;
}
String s = data.toUpperCase();
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
处理流之四打印流
- 实现将基本数据类型的数据格式转化为字符串输出
打印流:PrintStream和PrintWriter
- 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
- PrintStream和PrintWriter的输出不会抛出IOException异常
- PrintStream和PrintWriter有自动flush功能
- PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。 在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
- System.out返回的是PrintStream的实例
- 打印流都是输出没有输入
- println()其实就是打印流的方法
package com.jsm.IO_05;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintlnTest {
public static void main(String[] args) {
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream(new File("D:\\text.txt"));
// 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)
ps = new PrintStream(fos, true);
if (ps != null) {// 把标准输出流(控制台输出)改成文件
System.setOut(ps);
}
for (int i = 0; i <= 255; i++) { // 输出ASCII字符
System.out.print((char) i);
if (i % 50 == 0) { // 每50个数据一行
System.out.println(); // 换行
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
}
}
}
处理流之五数据流
- 为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流
- 数据流有两个类:(用于读取和写出基本数据类型、String类的变量或字符串)
DataInputStream 和 DataOutputStream
分别“套接”在 InputStream 和 OutputStream 子类的流上
- DataInputStream中的方法:
- DataOutputStream中的方法
将上述的方法的read改为相应的write即可
- 练习:将内存中的字符串、基本数据类型的变量写出到文件中
注意:处理异常的话仍然使用try—catch—finally(这里直接抛异常是方便看过程)
代码:
@Test
public void test1() throws Exception {
//1.
DataOutputStream dos = new DataOutputStream(new FileOutputStream("hello111.txt"));
//2.
dos.writeUTF("金士曼");
dos.flush();//刷新操作,一旦执行就会将内存中的数据写入文件
dos.writeInt(19);
dos.flush();
dos.writeBoolean(true);
dos.flush();
//3.
dos.close();
}
运行结果:生成的文件
解释:这个并不是乱码,这个文件不是直接双击打开,而是用DataInputStream去读,代码如下
代码:(读文件)
@Test
public void test2() throws IOException {
//1.
DataInputStream dis = new DataInputStream(new FileInputStream("hello111.txt"));
//2.
String name=dis.readUTF();
int age=dis.readInt();
boolean isMale =dis.readBoolean();
System.out.println(name);
System.out.println(age);
System.out.println(isMale);
}
运行结果:
注意:读取数据的时候需要按写入的顺序去读,不然会报异常