Java IO 流 结构图:https://www.cnblogs.com/cangsir/p/5397619.html
Java流操作有关的类或接口:
字节流的输入与输出的对应
字符流的输入与输出的对应
InputStreamReader 解码 (看不懂得字节翻译成看得懂字符)
1.字节流+编码表 2. 内部方法是操作字符的方法。
//字节流-----字符流
public static void inputstreamReader(){
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str =null;
while (true){
try {
if (((str=br.readLine())!=null))
System.out.println("读取:"+str );
if(str.equals("over")) break;
} catch (IOException e) {
e.printStackTrace();
}
}
}
OutputStreamWriter 编码(看不懂得字符翻译成看得懂字节)
字符流到字节流的转换,关闭流前先刷新
FileWriter 的父类
转换流图解
public static void outputStreamdemo(){
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out)) ;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str =null;
while (true){
try {
System.out.print(" 请输入:");
if (((str=br.readLine())!=null))
bw.write(str.toUpperCase());//字符流----》字节流
bw. newLine();
bw.flush();
if(str.equals("over")) {
System.out.println(" 退出");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.转换流操作 练习
/****
//需求1 将键盘录入的内容写入到文件中。
// 1.字节流到字符流的转换: System.in 字节流--->IntputStreamReader--->BufferedReader---String 字符
//String--- OutputStreamWriter-----BufferedWriter----FileOutputStream-字节流
****/
public static void fileWriter(){
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=null;
try{
bw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("字节流.txt")));
}catch ( FileNotFoundException e){
e.printStackTrace();
}
String str=null;
try{
while (true){
System.out.println("请输入:");
if ((str=br.readLine())!=null){//readLine() 读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任何一个或随后的换行符终止。
//
if(str.equals("over")){
System.out.println("退出");
break;
}
bw.write(str);
bw.newLine();
bw.flush();
}
}
}catch ( IOException e){
e.printStackTrace();
}finally {
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
//需求2:将一个文本文件显示在控制台上。
FileinputStream --字节流--> InputStreamReader--字符流-->缓冲区-BufferedReadder--BufferWriter-Sysstem.out
***/
public static void fileReader(){
BufferedReader br= null;
BufferedWriter bw=null;
try{
bw= new BufferedWriter(new OutputStreamWriter(System.out));//输出控制台
try {
br= new BufferedReader(new InputStreamReader(new FileInputStream("神回复.txt"),"GB2312"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}catch ( FileNotFoundException e){
e.printStackTrace();
}
String str=null;
try{
while((str=br.readLine())!=null){//readLine() 读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任何一个或随后的换行符终止。
bw.write(str);
bw.newLine();
bw.flush();
}
}catch ( IOException e){
e.printStackTrace();
}finally {
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*** 改变源和目的
* 需求3.将一个文件的内容复制到另外一个文件。
* BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(new FileInputStream("文件1.txt"))) ;
*BufferedReader br=new BufferedReader(new InputStreamReader(new FileOutputStream("文件.txt")));
*
* */
流的操作规律:
转换流
InputStreamReader :字节到字符的桥梁 解码
OutputStreamWriter :字符到字节的桥梁。编码
流操操作的对象太多。明确四个:
1.明确源和目的
源:InputStream Reader
目的: Outputstream Writer
2.数据是否是纯文本数据
源: 是纯文本 :Reader 否:InputStream
目的是否是: 纯文本 Writer 否:OutputStream
到这里,可以明确需求中国具体要使用哪个体系。
3.明确具体的设备(对象)
源:硬盘( File) 键盘(System.in ) 内存( 数组) 网络:Socket 流
目的:硬盘 File ,控制台System.out) 内存( 数组) 网络:Socket 流
4.是否需要额外功能:
1.是否需要高效(缓冲区)是: 加上 Buffer :BufferedWriter BufferedReader
2.是否需要转换:是 InputStreamReader , OutputStreamWriter.