一、 实验目的和要求
实验目的和要求:要求学生能在学习和理解课堂学习内容中JAVA流编程理论的基础上,学习并逐步掌握JAVA流程序的编写和调试,学习依据处理需求对不同流的正确选择使用和组合用法。
实验内容:设计和编写一个程序从键盘读入一行字符串,将其写入一个文本文件里,再编写还有一个程序从文本文件里读入字符串并在命令行窗体显示出来。
二、实验代码
写入文件
package think; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream.GetField; public class java_exp_03iostream { public static void main(String[] args) { //字符缓冲流 BufferedReader br = null; BufferedWriter bw = null; try { //br=newBufferedReader(newFileReader("d:\buffered.txt")); //从键盘读取字节流 转化成字符流 包装成缓冲字符流 br= new BufferedReader(new InputStreamReader(System.in)); bw = new BufferedWriter(new FileWriter("d:\buffered.txt")); for(String str; (str= br.readLine() )!= null ; ) { if(str.equalsIgnoreCase("e")||str.equalsIgnoreCase("exit")) { System.out.println("退出");break;} else { bw.write(str); bw.newLine(); //行分隔符 } } } catch (IOException e) { e.printStackTrace(); // TODO: handle exception }finally //关闭两个buffered对象 { try { if(br != null) br.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } try { if(bw != null) bw.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } } }<span style="font-weight: bold;"> </span>
控制台输入字符串,输入e退出,把字符串写入文件。
第二个程序读出文件内容。
<span style="font-size:12px;"><strong>p</strong>ackage think; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class java_exp_03read { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("d:buffered.txt")); for(String str; (str= br.readLine() )!= null ; ) { System.out.println(str); } } catch (IOException e) { // TODO: handle exception e.printStackTrace(); }finally{ try { if(br != null) br.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } } }</span>
三、实验总结
IO流学习小结:
*FileInputStream
*FileOutputStream 字节 文件输入输出流
*FileReader
*FileReader 字符 文件输入输出流
*Buffered+* 缓冲流类 属于过滤流 包装 文件流 经常使用
*InputStreamReader
*OutputStreamReader 转换流
*DataInputStream
*DataOutputStream 数据流
*PrintStream
*PrintWriter 打印流
*ObjectOutputStream
*ObjectInputStream 对象流
总体的思路:
*文件的输入输出有非常多种方法能够实现,差别在于效率,字符的编码不同,採用的方式可能也不同。
遇到的问题和解决办法:
*问题: 最先採用的方法是FileInputStream,FileOutputStream。假设写入的是英文或者数字,没问题。假设是中文,则从文件输入的时候,有问题。输出到文件没问题。
百度+思考了一会儿,结果例如以下:unicode编码时,中文是两个字节编码的。用字节流的方式从文件读进来的时候,遇到中文的字符,把中文拆成两个字节读取,所以会乱码。
而字节流输出到文件的时候,会依据平台的默认编码方式把中文字符转换成了字节数组,一个字节一个字节的输出文件。windows记事本能够自己主动认出中文字符。所以,文本内容须要读取的时候,一般不用字节流。
* 优化:在用了字符流输入输出之后。又用了缓冲流。来提高效率。
先把读取或者写入到文件的内容,先保存在缓冲数组里,一次性写入或者输出,提高了效率。
在我写的程序能够非常好的体现出来:比方。我在从console写字符到文件的时候。输入 e 或者 exit结束。再没有输入e 和exit的时候,打开buffered的时候。会发现是没有内容的。
结束之后,才显示内容。
* 心得:C。C++文件的输入输出都学过,可是因为平时非常少写小软件,所以没用到这个。
可是输入输出非常重要。