关于流的转换主要涉及到的类是InputStreamReader字节流到字符流的桥梁,它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。 OutputStreamWriter字符流到字节流的桥梁,使用指定的字符集将写入其中的字符编码为字节。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
JAVA——IO流 篇四简单的提到过流的转换,通过标准输入流读取字节转换为字符流,结合上面的例程,我们也可以添加输出流的转换,将读取到的字符流转换成字节流,在进行输出。
public static void readKeyOver() throws IOException
{
//获取标准输入流对象(获取键盘输入内容)
InputStream in = System.in;
//将输入字节流转化为输入字符流对象
InputStreamReader inputStreamReader = new InputStreamReader(in);
//创建输入字符流缓冲区对象
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//获取标准输出流对象
PrintStream out = System.out;
//将输出字符流装换成输出字节流对象
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out);
//创建字符流缓冲区
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
String lineString;
//读取输入的每一行数据
while((lineString = bufferedReader.readLine()) != null)
{
//判断每行的数据是否为over
if(lineString.equals("over"))
{
break;//跳出循环
}
//将字符数据写入字符缓冲区
bufferedWriter.write(lineString);
//换行
bufferedWriter.newLine();
//刷新流
bufferedWriter.flush();
}
}
上述代码经分析,其流程如下所示:
将上述代码在进一步的封装:
public static void readKeyOver() throws IOException
{
//输入流缓冲区对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//输出流缓冲区对象
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
String lineString;
//读取输入的每一行数据
while((lineString = bufferedReader.readLine()) != null)
{
//判断每行的数据是否为over
if(lineString.equals("over"))
{
break;//跳出循环
}
//将字符数据写入字符缓冲区
bufferedWriter.write(lineString);
//换行
bufferedWriter.newLine();
//刷新流
bufferedWriter.flush();
}
}
则可进行高质量的复用,如下所示:
将键盘路的的数据写入一个文件中
public static void readKeyOver() throws IOException
{
//输入流缓冲区对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//输出流缓冲区对象
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt")));
String lineString;
//读取输入的每一行数据
while((lineString = bufferedReader.readLine()) != null)
{
//判断每行的数据是否为over
if(lineString.equals("over"))
{
break;//跳出循环
}
//将字符数据写入字符缓冲区
bufferedWriter.write(lineString);
//换行
bufferedWriter.newLine();
//刷新流
bufferedWriter.flush();
}
}
将一个文本文件内容显示在控制台上
public static void readKeyOver() throws IOException
{
//输入流缓冲区对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
//输出流缓冲区对象
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
String lineString;
//读取输入的每一行数据
while((lineString = bufferedReader.readLine()) != null)
{
//判断每行的数据是否为over
if(lineString.equals("over"))
{
break;//跳出循环
}
//将字符数据写入字符缓冲区
bufferedWriter.write(lineString);
//换行
bufferedWriter.newLine();
//刷新流
bufferedWriter.flush();
}
}
将一个文件总的内容复制到另一个文件中
public static void readKeyOver() throws IOException
{
//输入流缓冲区对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
//输出流缓冲区对象
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
String lineString;
//读取输入的每一行数据
while((lineString = bufferedReader.readLine()) != null)
{
//判断每行的数据是否为over
if(lineString.equals("over"))
{
break;//跳出循环
}
//将字符数据写入字符缓冲区
bufferedWriter.write(lineString);
//换行
bufferedWriter.newLine();
//刷新流
bufferedWriter.flush();
}
}
通过例程可知,操作流是具有一定的规律性:
总结其规律如下:
-
明确源和目的 源: Reader InputStream 目的: Writer OutputStream
-
明确数据是否是纯文本数据 源: 是 Reader 否 InputStream 目的: 是 Writer 否 OutputStream
-
明确具体的设备 源设备: 硬盘:File 键盘:System.in 内存:数组 网络:Socket流 目的设备: 硬盘:File 控制台:System.out 内存:数组 网络:Socket流
-
是否需要其他额外功能(比较繁多) 1.是否需要高效(缓冲区): 是: 加入 buffer …… …… ……