JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码( 三 )

字符输入流在读取数据时使用的是read()方法 , 该方法还有另外的重载方法:
int read(); // 每次读取一个字符 , 直至文件末尾 , 返回-1为止int read(char[] buffer); // 每次都能读物多个字符 , 并把读取到的字符存储到buffer中 
字符输出流 , FileWriter , 字符输出流的使用案例代码如下:
import java.io.*;/** * 文件的字符输出流案例 */public class FileWriterDemo {public static void main(String[] args) throws Exception {// 创建目标对象File target = new File("file_writer.txt");// 创建文件字符输出流Writer writer = new FileWriter(target);writer.write("dkgfkdsfowmsdfmowemfsdmfkemfkmfd");writer.flush();// 关闭字符输出流writer.close();}}字符输出流在读取数据时使用的是write()方法 , 该方法还有另外的重载方法:
void write(int c); // 向文件中写出一个字符void write(char[] buffer);// 向文件中写出多个字符(char[] buffer)void write(char[] buffer, int off, int len);// 向文件中写出多个字符(char[] buffer) , 从off位置开始 , 长度为lenvoid write(String str);// 向文字中写出一个字符串 
案例2 , 使用字符流完成文件拷贝任务
import java.io.*;/** * 案例:使用字符流完成文件拷贝任务 。*/public class FileCopyDemo {public static void main(String[] args) throws Exception {// 创建文件源对象和目标对象File src = https://www.isolves.com/it/cxkf/yy/JAVA/2020-05-03/new File("file_reader.txt");File target = new File("file_reader_copy.txt");// 创建输入流和输出流Reader reader = new FileReader(src);Writer writer = new FileWriter(target);// 文件读和写char[] buffer = new char[1024];int len = -1;while((len = reader.read(buffer)) != -1) {writer.write(buffer, 0, len);}// 关闭输入流和输出流reader.close();writer.close();}}

JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码

文章插图
文件拷贝
 
案例3 , 使用流完成Java 代码动态编译、运行
import java.io.*;/** * 案例3 , 使用流完成Java 代码动态编译、运行 */public class EvalDemo {public static void main(String[] args) {String code = "System.out.println("Eval Java");";try {// 构建java代码buildJavaCode(code);// 编译Java 代码compileJavaCode();// 运行Java 代码runJavaCode();} catch (Exception e) {e.printStackTrace();}}/*** 构建java代码*/ private static void buildJavaCode(String code) throws Exception {// 拼接Java 主函数StringBuilder builder = new StringBuilder(80);builder.Append("public class Eval {");builder.append("public static void main(String[] args) {");builder.append(code);builder.append("}");builder.append("}");// 保存拼接好的java代码到文件中OutputStream out = new FileOutputStream("Eval.java");out.write(builder.toString().getBytes("UTF-8"));out.close(); } /*** 编译Java 代码*/private static void compileJavaCode() throws Exception {// 调用javac 编译保存的java文件Process javacProcess = Runtime.getRuntime().exec("javac Eval.java");// 读取编译错误结果 , 并输出InputStream error = javacProcess.getErrorStream();byte[] buffer = new byte[1024];int len = -1;while ((len = error.read(buffer)) != -1) {String msg = new String(buffer, 0, len);System.out.println("Eval 编译:" + msg);}// 关闭javac 编译进程error.close();}/*** 运行Java 代码*/private static void runJavaCode() throws Exception {// 调用java 运行编译好的java字节码文件Process javaProcess = Runtime.getRuntime().exec("java Eval");// 读取java字节码文件的运行信息 。并打印输出InputStream info = javaProcess.getInputStream();len = -1;buffer = new byte[1024];while ((len = info.read(buffer)) != -1) {String msg = new String(buffer, 0, len);System.out.println("Eval 运行: " + msg);}info.close();// 删除java问价和class文件new File("Eval.java").delete();new File("Eval.class").delete();}} 
缓冲区在上述的字符输出流的使用案例中 , 使用了flush()方法 , 该方法有何作用呢?
因为计算机访问外部设备(磁盘文件)时 , 要比直接访问内存慢很多 , 如果每次调用write()方法都要直接把数据写出到磁盘文件中 , CPU会花更多的时间 , 计算机执行性能会大大降低 。
因此 , 我们可以准备一个内存缓冲区 , 程序每次调用write()方法时 , 会将数据先写到内存缓冲区中 , 暂存于缓冲区中;当内存缓冲区满后 , 系统才把缓冲区中暂存的数据一次性写出到磁盘文件中 。这样就能减少直接操作本地文件系统的频率 , 使得系统性能得以提升 。


推荐阅读