黑马程序员_<<转换流(InputStreamReader,OutputStreamWriter)>>

时间:2021-08-08 22:42:42

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------



1.字节流转换成字符流(InputStreamReader)

            字节流:InputStream   -------读取

     字符流:Reader       ------读取

     在字节流读取的时候用的是一个一个字节的读取方式或者是字节数组的读取方式,

在字符流中读取的时候,除了有一个一个字符的读取方式和数组 的读取 方式外 ,在缓冲技术里面有一行一行的读取,这个方法在读取的时候很好用也很方面,那么我们就可以把字节流的转换成字符流,然后利用缓冲对象来使用读取一行的方法。

 

字符流要向获得从键盘录入的信息,那么必须使用字节流,然后把字节流准换成字符流

步骤:

   1.准备好一个字节流(InputStream  in)

   2.利用InputStreamReader(isr)把字节流对象作为其构造函数的参数,new InputStreamReader(in)

   3.然后使用缓冲技术(BufferedReader对象封装转换流)newBufferedReader(isr),然后就可以使用读取行的方法了。

   4.最后要关闭流

举例:读取键盘的录入的数据

InputStream in = System.in;

     InputStreamReader isr =new InputStreamReader(in);

    BufferedReader br =newBufferedReader(isr);

然后我们就可以使用br对象纪念性读取键盘录入的数据了。

我们也可以把这三句转换成一句。

BufferedReader bw = newBufferedReader (isr));

2. 字节输入流转换成字符输入流(OutputStreamWriter)

      字符流:Writer   -----写入流

字节流:OutputStream  ---写入流

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的charset 将要写入流中的字符编码成字节。

步骤:

1.准备一个字符流

2.利用OutputStreamWriter(OutputStream out)把其转换成字节流,

3.可以利用其缓冲对象对其进行封装。然后做相应的操作。

4.最后关闭流

 举例:

OutputStream out = System.out;

OutputStreamWriter osw = new OutputStreamWriter(out);

BufferedWriter bw = new BufferedWriter(osw);

也可以将这三句合成一句话

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

 

3.     流操作(转换流练习)

        1.   源:键盘录入  (输出)目的:控制台

 

 

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class ZhuanhuanDemo {

public static void main(String[] args) throws IOException {
/*InputStream in = System.in;//原始键盘
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);//封装类字符流*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

/*OutputStream out = System.out;//输出的目的是控制台
OutputStreamWriter osw = new OutputStreamWriter(out);//将字符流转换成字节流
BufferedWriter bw = new BufferedWriter(osw);*/

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write("输入的内容是:" + line);
bw.newLine();
bw.flush();
}

}

}结果:
张三
输入的内容是:张三
李四
输入的内容是:李四
abc
输入的内容是:abc
over

 

            2.  源:键盘  输出目的:文件

就是将键盘录入的数据写到了文件中

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ZhuanhuanDemo {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:键盘
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("F:\\demo.txt")));// 目的:文件

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write(line);//写入
bw.newLine();
bw.flush();
}
bw.close();// 关闭流
br.close();// 关闭流

}

}


    3. 源:文件  目的:控制台

将文件的内容打印在控制台上

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ZhuanhuanDemo {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\demo.txt")));// 源:文本
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));// 目的:控制台

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);//输出
bw.newLine();
bw.flush();
}
bw.close();// 关闭流
br.close();// 关闭流

}

}
结果:
张三
李四
王五


 

4. 流操作规律


1.明确源和目的

源:输入流:InputStream   Reader

目的:输出流:OutputStream Writer

2.操作的数据是否是纯文本

     是:字符流

     不是:字节流

3.当体系明确后,在明确要使用那个具体的对象。

通过设备来进行区分:

源设备:内存,硬盘,键盘

目的内存:内存,硬盘,控制台

 

需求:

1.将一个文件数据存储到另一个文件中,复制文件

 源:文件  使用读取流: InputStream Reader

            是否是文本文件: 是:用Reader

             明确对象:明确设备:硬盘中的文件FileReader对象

提高效率。利用缓冲区。BufferedReader。

FileReader fr=new FileReader(“a.txt”);

BufferedReader br=new BufferedReader(fr);

目的 :文件:OutputStream Writer

是否是纯文本:Writer

设备:硬盘中的文件

提高效率。利用缓冲区。BufferedWriter。

对象:FileWriter

FileWriter fw=new FileWriter();

BufferedWriter bw=new BufferedWriter(fw);

2.需求

将键盘录入的数据保存到另一个文件中。

源:InputStream Reader

纯文本:Reader

设备:键盘 对象 System.in

 InputStreamReader idr=new InputStreamReader(System.in);

 提高效率用BufferedReader

BufferedReader bufr=new BufferedReader(idr);

目的:OurStream ,Writer

     纯文本:Writer

 设备:硬件的文件

  FileWrite fw=new FileWriter(“文件”);

 BufferefWriter bufW=new BufferefWriter(fw);

 

  

要指定编码方式,必须使用转换流,OutputStreamWriter扩展:指定编码方式

OutputStreamWriter(OutputStream out,String charsetName)

 

OutputStreamWriter osw=new OutputStreamWriter(newFileOutputStream(“F:\\demo.txt”,”utf-8”))这制订了编码方式;

在转换流构造方法中指定。

 

当需要指定编码方式的时候,那么就需要此转换流OutputStreamWriter。

当需要指定编码方式的时候那么就需要转换流来操作。

当需要读取别的编码方式的文件的时候,也得需要使用转换流

字节流不用刷新缓冲区,字符流要刷新缓冲区

 

public class ZhuanhuanDemo {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:键盘
/*默认的编码是jbk。*/
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write(line);// 输出
bw.newLine();
bw.flush();
}
bw.close();// 关闭流
br.close();// 关闭流

}



当你输入两个汉字就结束的话,那么文件大小是8个字节,要是默认的话就是6个字节,指定GBK的话,那也是6个字节,所以可以确认默认的是GBK编码。



      

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ZhuanhuanDemo {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:键盘
/*默认的编码是jbk。*/
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write(line);// 输出
bw.newLine();
bw.flush();
}
bw.close();// 关闭流
br.close();// 关闭流

}

}

 

5. 改变标准输入输出设备

 

      

public static void main(String[] args) throws IOException {
/*
* static void setIn(InputStream in)改变输入设备
* static void setOut(PrintStream out)改变输出的设备目的
* */
System.setIn(new FileInputStream("F:\\demo.txt"));//把输入设备定义到了一个文件流上,就是源:文件
System.setOut(new PrintStream("F:\\demo1.txt"));//把输入设备定义到一个文件上,就是把内容输入到一个文件中
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 源:键盘
/*默认的编码是jbk。*/
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("F:\\demo1.txt"),"utf-8"));// 目的:控制台

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write(line);// 输出
bw.newLine();
bw.flush();
}
bw.close();// 关闭流
br.close();// 关闭流

}

6. 异常日志文件

      我们可以将程序中出现的异常保存到一个文件中,那么我就可以方便我们查看,在开发中也是把异常打印到文件中,不可能让用户看到异常。我们也可以下载logf4工具,这是专门处理异常的工具。

下面我们写一个字节的异常日志文件。


void   printStackTrace(PrintStream s)
          将此 throwable 及其追踪输出到指定的输出流。

public class ExceptionDemo {
public static void main(String[] args) {
try {
int a = 4 / 0;
} catch (Exception e) {
try {
PrintStream ps = new PrintStream("F:\\exception.log");
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-DDHH:mm:ss");
String s = sdf.format(new Date());
ps.println(s);//将日期传进入
e.printStackTrace(ps);// 将流传入,指定目的
} catch (FileNotFoundException e1) {
System.out.println("日志文件创建失败");
}

}

}

}

结果:


黑马程序员_<<转换流(InputStreamReader,OutputStreamWriter)>>

7.系统属性信息


系统日志

 

将系统的实现存到文件中

  

 import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Properties;

public class PropertiesDemo {

public static void main(String[] args) {
/*list(PrintStream out)将属性列表输出到指定的输出流。*/
Properties p=new Properties();
p=System.getProperties();
try {
p.list(new PrintStream("F:\\SystemInfo.txt"));
} catch (FileNotFoundException e) {
System.out.println("创建文件失败");
}
}

}


黑马程序员_<<转换流(InputStreamReader,OutputStreamWriter)>>



--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------