目录
转换流什么时候使用?
涉及到字符编码转换时,需要用到转换流
键盘的录入
读取键盘录入
System.out:对应的是标准输出设备:控制台
System.in:对应的标准输入设备
需求:
当录入一行数据后,就将该行数据进行打印,
如果录入的数据是over,那么停止录入
import java.io.*;
class ReadIn
{
public static void main(String[] args) throws IOException
{
InputStream in = System.in;
//敲一个存一个,等你敲回车在一块打印出来
StringBuilder sb = new StringBuilder();
while(true)
{
int ch = in.read();
if(ch ='/r')
continue;
if(ch ='/n')
{
String s= sb.toString();
if("over".equals(s))
break;
//将用户输入的结果返回大写
System.out.println(s.toUpperCase())
sb.delete(0,sb.length());
}
else
sb.append((char)ch);
}
}
}
通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法
能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法
那么能不能将字节流转成字符流在使用字符流缓冲区中的readLine方法呢?
用类InputStreamReader(Reader的子类):是字节流通向字符流的桥梁
转换流的出现:
//获取键盘录入对象
class TransStreamDemo
{
public static void main(String[] args)throws IOException
{
//获取键盘录入对象
InputStream in =System.in;
//将字节流对象转成字符流对象,使用转换流
InputStreamReader isr = new InputStreamReader (in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr = new BufferedReader(isr);
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line));
break;
System.out.println(line.toUpperCase());
}
bufr.close();
}
}
//获取键盘写入对象
class TransStreamDemo
{
public static void main(String[] args)throws IOException
{
//获取键盘录入对象
InputStream in =System.in;
//将字节流对象转成字符流对象,使用转换流
InputStreamReader isr = new InputStreamReader (in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr = new BufferedReader(isr);
//以上可以何合为一行代码,这时键盘最常见的写法
//BufferedReader bufr = new BufferedReader(new InputStreamReader (System.in));
//获取键盘写入对象
OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferWriter bufw = new BufferdWriter(osw);
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line));
break;
bufw.write(line.toUpperCase());
//换行
bufw.newLine();
//刷新到控制台
bufw.flush();
}
bufr.close();
}
}
流操作的基本规律:
通过三个明确来完成
1.明确源和目的
- 源:输出流:InputStream、Reader
- 目的:输出流:OutputStream、Writer
2.操作的数据是否是纯文本
- 是:字符流
- 不是:字节流
3.当体系明确后,在明确要使用哪个具体的对象
- 通过设备来进行区分
- 源设备:内存,硬盘,键盘
- 目的设备:内存,硬盘,控制台
示例:
需求:将键盘录入的数据保存到一个文件中
源:InputStream、Reader
是不是纯文本?是 Reader
设备:键盘,对应的对象是System.in
为了操作键盘的文本数据方便,转成字符流按照字符串操作是最方便的,所以既然明确了Reader,那么就将System.in转换成Reder,用到了Reader体系中转换流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率么?需要,BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream、Write
是否是纯文本?是,Writer
设备:硬盘,一个文件,使用FileWriter
FileWriter fw = new FileWriter("c.txt");
需要提高效率么?需要
BufferedWriter bufw = new BufferedWriter (fw);
扩展:
想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中
OutputStreamReader osw = new OutputStreamReader(new FileOutputStream("d.txt"),"UTF-8");