输入输出的内容是文本内容,考虑使用字符流。
输入输出的内容是二进制内容,考虑使用字节流。
凡是能用记事本打开并查看的内容称为文本文件,反之则为二进制文件。
package ch15;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
/**
* Created by Jiqing on 2016/12/30.
*/
public class StringNodeTest {
public static void main(String[] args) throws IOException{
String src = "从明天起,做一个幸福的人\n"
+ "喂马,劈柴,周游世界\n"
+ "从明天起,关心粮食和蔬菜\n"
+ "我有一所房子,面朝大海,春暖花开\n";
char[] buffer = new char[32];
int hasRead = 0;
try(StringReader sr = new StringReader(src)) {
// 采用循环读取的方式读取字符串
while ((hasRead = sr.read(buffer)) > 0) {
System.out.print(new String(buffer,0,hasRead));
}
}
try (
// 创建StringWriter
StringWriter sw = new StringWriter()) {
sw.write("有一个美丽的新世界,\n");
sw.write("她在远方等我!\n");
System.out.print(sw.toString());
}
}
}
敲代码的时候,可以把代码区域拎出来,简洁明了。
转换流
InputStreamReader将字节输入流转为字符输入流,OutputStreamWriter将字节输出流转化为字符输出流。
package ch15;
import ch4.While;
import java.io.*;
/**
* Created by Jiqing on 2016/12/30.
*/
public class KeyinTest {
public static void main(String[] args) {
try(
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader)) {
String line = null;
while ((line = br.readLine()) != null)
{
if (line.equals("exit")) {
System.exit(1);
}
System.out.println("输入内容为:" + line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
推回输入流
PushbackInputStream和PushbackReader,将字节字符推回缓冲区,允许重复读取刚刚读取的内容。
标准输入、输出
System.in System.out默认情况下分别代表键盘和显示器。
方法论:先看一遍,了解思路大概。尝试自己不看代码,写出来。那才是真正属于自己的知识。
package ch15;
import java.io.*;
/**
* Created by Jiqing on 2016/12/30.
*/
public class RedirectOut {
public static void main(String[] args) {
try(
PrintStream ps = new PrintStream(new FileOutputStream("out.txt"))) {
System.setOut(ps);
System.out.print("普通字符串");
System.out.print(new RedirectOut());
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
方法论:如果一时半会达不到自己独立写出来,那就重复重复再重复。书读百遍,其义自见。
上边的重定向,将内容写入了out.txt文档中了。而没有输出到显示器。
package ch15;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
/**
* Created by Jiqing on 2016/12/30.
*/
public class RedirectIn {
public static void main(String[] args) {
File file = new File(".");
try(FileInputStream fis = new FileInputStream(file.getAbsoluteFile().getParent()+"/src/ch15/RedirectIn.java")) {
System.setIn(fis);
Scanner sc = new Scanner(System.in);
sc.useDelimiter("\n");
while(sc.hasNext()) {
System.out.println("键盘输入的内容是:"+sc.next());
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
方法论:编程在于敲代码,感受代码。手感很重要。一方面能够增强信心,一方面能够增加记忆与乐趣。但是也没必要很死板,统统都敲一遍。挑一些代表性的,感受一下就行了。
读取进程数据
package ch15;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by Jiqing on 2016/12/30.
*/
public class ReadFromProcess {
public static void main(String[] args) throws IOException{
Process p = Runtime.getRuntime().exec("javac");
try(
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream(),"gbk"))
) {
String buff = null;
while ((buff = br.readLine()) != null) {
System.out.println(new String(buff));
}
}
}
}