------- android培训、java培训、期待与您交流! ----------
第一部分:
/*
读取键盘录入。
System.out:对应的是标准输出设备(屏幕),控制台(dos控制台)。
System.in:对应的标准输入设备:键盘。
需求:
通过键盘录入数据。
当录入一行数据后,就将该行数据进行打印。
如果录入的数据是over,那么停止录入。
*/
import java.io.*;
class ReadIn
{
public static void main(String[] args) throws IOException
{
InputStream in = System.in; //定义输入流对象in,读取从键盘录入的数据,system.in就是一个输出流
StringBuilder sb = new StringBuilder(); //定义一个容器,可变长度装存数据
while(true)
{
int ch = in.read(); //读取单个字节
if(ch=='\r') //如果是\r
continue; //结束本次循环,不存储\r,回到循环开始出,继续下次while循环
if(ch=='\n') //如果是\n
{
String s = sb.toString(); //返回此对象本身(它已经是一个字符串)
if("over".equals(s)) //如果输入的是否是over
break; //结束while循环
System.out.println(s.toUpperCase()); //将所有字符(字符串)转换成大写并打印
sb.delete(0,sb.length()); //经过上一步打印之后要把容器sb里面的内容清空,以免影响下次操作
}
else
sb.append((char)ch); //将读取到的单个字符依次都装入到容器sb中进行存储
}
}
}
/*
注意:
(1)read()方法:从输入流中读取数据的下一个字节,每次只能读取一个字节;
public abstract int read()
throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。
返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
(2)Ctrl+C:结束输入;
直接输入-1是不能结束输入的,Ctrl+C就是在往里面加上一个结束标记,这个结束标记返回来的就是-1;
(3)不需要进行close()关闭操作,因为结束输入后,系统自动就会关闭;
(4)键盘录入结束的两种方式:(否则停不下来!)
Ctrl+C;
定义一个结束标记;
*/
第二部分:
/*
字符流:
FileReader
FileWriter。
BufferedReader
BufferedWriter
字节流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法。
能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法,不能拿字节流去用字符流的方法。
思考:
那么能不能将字节流转成字符流在使用字符流缓冲区的readLine方法呢?
*/
import java.io.*;
class InputStreamReaderDemo
{
public static void main(String[] args) throws IOException
{
//获取键盘录入对象。
InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去
InputStreamReader isr = new InputStreamReader(in); //对象in由字节流变成了字符流isr
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
BufferedReader bufr = new BufferedReader(isr); //创建缓冲区对象,将字符流对象isr传入
String line = null; //使用readLine()方法之前要先定义一个空字符串对象,以便将缓冲区中读到的行字符串对象地址赋给它
while((line=bufr.readLine())!=null) //判断循环条件
{
if("over".equals(line)) //定义结束标记
break;
System.out.println(line.toUpperCase()); //将行字符串的所有字符转换成大写并输出
}
bufr.close(); //关闭缓冲区资源,录入流不用关,因为键盘录入结束,系统会自动关闭
}
}
/*
(1)类 InputStreamReader(转换流):将字节流转换成字符流,是字节流通向字符流的桥梁;
构造方法:InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
*/
第三部分:
/*
将字符流转换成字节流:OutputStreamWriter
*/
import java.io.*;
class OutputStreamWriterDemo1
{
public static void main(String[] args) throws IOException
{
//获取键盘录入对象。
InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去
InputStreamReader isr = new InputStreamReader(in); //对象in由字节流变成了字符流isr
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
BufferedReader bufr = new BufferedReader(isr); //创建缓冲区对象,将字符流对象isr传入
OutputStream out = System.out; //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句
OutputStreamWriter osw = new OutputStreamWriter(out); //对out对象进行包装,osw是字符流
BufferedWriter bufw = new BufferedWriter(osw); //创建缓冲区对象,将字符流对象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)类 InputStreamReader:将字节流转换成字符流,是字节流通向字符流的桥梁;
构造方法:InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
(2)类OutputStreamWriter:将字符流转换成字节流,是子字符流通向字节流的桥梁;
构造方法:OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
(3)system.in是输出流
system.out是输出流
(4)PrintStream是OutputStream的子类,可以使用父类接收子类对象;
(5)理解:字符转字节
我们往文件中录入的都是字符,但写入文件的字符都是以字节的形式存在的,即录入的是字符,但在硬盘上保存的是字节,这就是
字符转字节;
(6)录入和输出的数据都要是字节流,缓冲区存储的可以是字符流;
(7)本例实质上就是自己定义了一个输出的操作方法;
*/
第四部分(第三部分代码修改,使其更简洁)
/*
将字符流转换成字节流:OutputStreamWriter
*/
import java.io.*;
class OutputStreamWriterDemo2
{
public static void main(String[] args) throws IOException
{
//获取键盘录入对象。
//InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去
//InputStreamReader isr = new InputStreamReader(in); //对象in由字节流变成了字符流isr
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
//创建缓冲区对象,将字符流对象isr传入
//键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
//OutputStream out = System.out; //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句
//OutputStreamWriter osw = new OutputStreamWriter(out); //对out对象进行包装,osw是字符流
//BufferedWriter bufw = new BufferedWriter(osw); //创建缓冲区对象,将字符流对象osw传入
BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase()); //将每行字符串(字符流)转换成字节(字节流),并变成大写
bufw.newLine(); //进行换行操作
bufw.flush(); //将缓冲区数据进行刷新操作,输出结果
}
bufr.close(); //关闭缓冲区资源
}
}
/*
(1)类 InputStreamReader:将字节流转换成字符流,是字节流通向字符流的桥梁;
构造方法:InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
(2)类OutputStreamWriter:将字符流转换成字节流,是子字符流通向字节流的桥梁;
构造方法:OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
理解:实质上OutputStreamWriter就是一个转换流(将字符流转换成字节流),就是对输出流System.in的一个包装,
System.in 一次只能读一个字节,而进行包装之后,一次可以读一行,非常方便;
(3)system.in是输出流
system.out是输出流
(4)PrintStream是OutputStream的子类,可以使用父类接收子类对象;
(5)理解:字符转字节
我们往文件中录入的都是字符,但写入文件的字符都是以字节的形式存在的,即录入的是字符,但在硬盘上保存的是字节,这就是
字符转字节;
(6)录入和输出的数据都要是字节流,缓冲区存储的可以是字符流;
(7)本例实质上就是自己定义了一个输出的操作方法;
*/
第五部分
/*
1,
源:键盘录入
目的:控制台
2,需求:想把键盘录入的数据存储到一个文件中。
分析:
源:键盘
目的:文件
*/
import java.io.*;
class OutputStreamWriterDemo3
{
public static void main(String[] args) throws IOException
{
//键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in)); //键盘录入,是源
BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"))); //文件,是果,数据目的
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase()); //将每行字符串(字符流)转换成字节(字节流),并变成大写
bufw.newLine(); //进行换行操作
bufw.flush(); //将缓冲区数据进行刷新操作,输出结果
}
bufr.close(); //关闭缓冲区资源
}
}
/*
总结:
(1)new OutputStreamWriter()传入的应该是字符流对象(将字符流变为字节流),字节输出流中能操作文件的是:FileOutputStream(String name)
(2)new InputStreamReader()传入的应该是字节流对象(将字节流变为字符流)
*/
/*
3,需求:想要将一个文件的数据打印在控制台上。
源:文件。
目的:控制台。
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。*/
import java.io.*;
class OutputStreamWriterDemo4
{
public static void main(String[] args) throws IOException
{
//键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)
BufferedReader bufr =
new BufferedReader(new InputStreamReader(new FileInputStream("CopyMp3.java"))); //文件,是源
BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out)); //控制台,是果,数据目的
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase()); //将每行字符串(字符流)转换成字节(字节流),并变成大写
bufw.newLine(); //进行换行操作
bufw.flush(); //将缓冲区数据进行刷新操作,输出结果
}
bufr.close(); //关闭缓冲区资源
}
}
/*
总结:
(1)new OutputStreamWriter()传入的应该是字符流对象(将字符流变为字节流),字节输出流中能操作文件的是:FileOutputStream(String name)
(2)new InputStreamReader()传入的应该是字节流对象(将字节流变为字符流)字符流中中能操作文件的是:FileInputStream(String name)
*/
流操作的基本规律(4个明确) |
||
明确1:源和目的 |
源(输入流) |
目的(输出流) |
|
字节输入流InputStream 字符输入流Reader |
字节输出流OutputStream 字符输出流Writer |
明确2:操作的是否是纯文本 |
输入流 |
输出流 |
|
(是)字符输入流:Reader (否)字节输入流:InputStream |
(是)字符输出流:Writer (否)字节输出流:OutputStream |
明确3:使用的具体对象 |
源设备 |
目的设备 |
|
内存 硬盘FileReader 键盘System.in(键盘录入一定是纯文本) |
内存 硬盘FileWriter 控制台System.out |
明确4:读取效率提升 |
提升 |
提升 |
|
字符输入流:Reader体系中缓冲区BufferedReader 字节输入流:InputStream体系中缓冲区BufferedInputStream |
字符输出流:Writer体系中缓冲区BufferedWriter 字节输出流:OutputStream体系中缓冲区BufferedOutputStream |
注意: (1) 键盘录入(System.in)对应的是字节流,如果要操作字符流文件,必须要转换成字符流:用Reader体系中转换流InputStreamReader(将字节流转换成字符流) (2) 键盘输出(System.out)对应的也是字节流,如果字符流要进行输出,必须要先转换成字节流:用OutputStream体系中转换流OutputStreamWriter(将字符流转换成字节流) |
||
|
|
|
练习1:将一个文本文件中数据存储到另一个文件中(复制文件)
源:InputStream或者 Reader 是不是操作文本文件。 是,字符流,选择Reader 这样体系就明确了。
接下来明确要使用该体系中的哪个对象。 明确设备:硬盘上一个文件。 Reader体系中可以操作文件的对象是 FileReader
是否需要提高效率:是!。加入Reader体系中缓冲区 BufferedReader. FileReader fr = new FileReader("a.txt"); BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer 是否是纯文本。 是!Writer。 设备:硬盘上一个文件。 Writer体系中可以操作文件的对象FileWriter。 是否需要提高效率:是!加入Writer体系中缓冲区 BufferedWriter FileWriter fw = new FileWriter("b.txt"); BufferedWriter bufw = new BufferedWriter(fw); |