黑马程序员 IO流学习笔记三,io学习笔记
黑马程序员 IO流学习笔记三,io学习笔记
----------android培训、java培训、java学习型技术博客、期待与您交流!----------
我们的机器只会读字节码,而我们人却很难读懂字节码,所以人与机器交流过程中需要编码解码。
InputStreamReader及其子类FileReader:(从字节到字符)是个解码过程;
OutputStreamWrite及其子类FileWriter:(从字符到字节)是个编码过程。
InputStreamReader这个解码过程中,最主要的就是StreamDecoder类
-
InputStream到Reader的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码问题。(查看JDK中的InputStreamReader类的构造函数,除了第一个构造函数没有制定外,其他几个都需要指定)
-
如果看不懂这个图请先看Association,Aggregation and Composition这篇文章。
字符输入输出流
FileReader类用于对字符文件的读取,与FileInputStream的功能类似,FileWriter类用于对字符文件的输入,其功能与FileOutputStream相似,对于上例,使用FileReader和FileWriter也能到达相同的目的。但是,FileReader和FileWriter类以字符为单位进行数据的读写操作,传输效率很低。所以,同样的,BufferedReader与BufferedWriter以缓冲流的方式进行数据读写操作,提供每次读取或写入一行数据的高效操作。
IO与文件结合的一个典型案例
题目:编写程序拷贝一个文件, 尽量使用效率高的方式
/* 思路: 考虑到高效,应该使用装饰类,因为题目没有说是字节文件还是字符文件, * 所以为了增加通用,采用字节流,这样可以复制文本及MP3等常见文件 * (1)对给定的文件封装,判断给定路径或文件是否存在,不存在给出 * 提示并结束(感觉实际开发中交互应该做的更友好一些) * (2)若文件存在,则获取文件名 * (3)判断目标目录是否存在,不存在则建立目标目录 * (4)通过目标目录和文件名的封装,创建目标文件 * (5)将源文件的数据读取写入目标文件 * * 说明: * 程序将异常抛给了JVM *resource源目录提供了两个测试文件 * 程序运行后,将exam工程刷新,可以更好的查看复制结果 **/ importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; import java.io.IOException; public classCopyFile { /** * @param args * @throws IOException */ public static void main(String[] args)throws IOException{ // TODO Auto-generated methodstub //给定文件路径 String filePath ="resource\\mySoul.mp3"; String destDirPath ="destination"; copyFile(filePath,destDirPath); } public static void copyFile(StringfilePath, String destDirPath) throws IOException{ File resFile = newFile(filePath); if (!resFile.isFile()) { System.out.println("路径错误或源文件不存在"); return; } //若文件存在,则获取文件名 String fileName =resFile.getName(); //给定拷贝文件存储的目录,为了方便测试,这里创建相对路径下的destination目录 //封装目标目录 File destDir = newFile(destDirPath); //若给定目录不存在,则创建 if (!destDir.isDirectory()) { destDir.mkdir(); } //为了提高效率,用BufferedInputStream包装FileInputStream BufferedInputStream bisr =new BufferedInputStream(new FileInputStream(resFile)); File dsetFile = newFile(destDir,fileName); //为了提高效率,用BufferedOutputStream包装FileOutputStream BufferedOutputStream bosw=new BufferedOutputStream(new FileOutputStream(dsetFile)); byte[] bufr = new byte[1024]; int len = 0; //按行读取,并按行写入 while ((len =bisr.read(bufr))!= -1) { bosw.write(bufr,0,len); } //关闭资源 bisr.close(); bosw.close(); } }
总结:OutputStreamWrite编码过程中就有另外一个重要的类:StreamEncoder负责编码.
----------android培训、java培训、java学习型技术博客、期待与您交流!----------
相关文章
- 暂无相关文章
用户点评