厚积薄发JAVA文件操作--java I/O中通过字符流读取文件并输出
2011-07-15 13:18
1131 查看
昨晚无意之间写了一个java读取文件并输出到控制台的代码---因为操作的文件中包含汉字,所有用到了字符流InputStreamReader。但是意外的是:当我把读取的文档输出到后台后发现,输出的内容尾部多出了很多类似‘口口口口口口口口口口口口’的无用东东。怎么回事呢?难道代码有问题?
重新查看代码如下:
验证一把,修改部分地方如下:
此时,我打印了读取的实际的字符长度和数组长度,发现:实际的读取的字符长度是1461,而数组长度是1584。原来问题出在这!!!
重新查看代码如下:
import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class Test3 { public static void main(String[] args) { try { File sourceFile = new File("D:\\ERROR.log"); FileInputStream fin = new FileInputStream(sourceFile); InputStreamReader ris = new InputStreamReader(fin); int len = (int) sourceFile.length(); char[] aa = new char[len]; while (ris.read() > 0) { ris.read(aa); } ris.close(); fin.close(); for (int i = 0; i < aa.length; i++) { System.out.print(aa[i]); } } catch (Exception e) { System.out.println(e); e.getStackTrace(); } } }
代码非常简单:首先创建了输入流对象InputStreamReader,然后创建了char类型的数组aa,其长度就是文件的length;再循环读取字符放入数组中,结束后打印数组内容到控制台。
很明显,输出错误是因为数组没有被填充满---就是说预定义的数组长度是过长的。但是我明明是按照文件的length来定义的长度呀。难道文件的length和读取的字符数是不相等的?验证一把,修改部分地方如下:
while (ris.read() > 0) { int ss=ris.read(aa); System.out.println(ss); } System.out.println(aa.length);
此时,我打印了读取的实际的字符长度和数组长度,发现:实际的读取的字符长度是1461,而数组长度是1584。原来问题出在这!!!
修改后完整代码如下:
import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class Test4 { public static void main(String[] args) { try { File sourceFile = new File("D:\\ERROR.log"); FileInputStream fin = new FileInputStream(sourceFile); InputStreamReader ris = new InputStreamReader(fin); int cc; while ((cc = ris.read()) > 0) { System.out.print((char) cc); } ris.close(); fin.close(); } catch (Exception e) { System.out.println(e); e.getStackTrace(); } } }上面都是单纯用字符来输出的,当然也可以用字符数组来完成:
import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class Test2 { public static void main(String[] args) { try { File sourceFile = new File("D:\\ERROR.log"); FileInputStream fin = new FileInputStream(sourceFile); InputStreamReader ris = new InputStreamReader(fin); char[] aa = new char[200]; int readchar = 0; while ((readchar = ris.read(aa)) > 0) { for (int i = 0; i < readchar; i++) { System.out.print(aa[i]); } } ris.close(); fin.close(); } catch (Exception e) { System.out.println(e); e.getStackTrace(); } } }
其实是大同小异呀!!!当然,用BufferedReader也是相当便利的,完整代码如下:
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class Test5 { public static void main(String[] args) { try { File sourceFile = new File("D:\\ERROR.log"); FileInputStream fin = new FileInputStream(sourceFile); BufferedReader br = new BufferedReader(new InputStreamReader(fin)); String aa; while ((aa = br.readLine()) != null) { System.out.println(aa); } fin.close(); br.close(); } catch (Exception e) { System.out.println(e); e.getStackTrace(); } } }
相关文章推荐
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- java字节流和字符流操作文件,指定编码写入和读取,递归创建上层目录
- 黑马程序员--Java基础学习之IO流之字节流、字符流、读取写入文件、Copy文件、键盘输入输出、流操作的基本规律
- java中字节流和字符流对文件读取的操作
- java通过InputStream读取和写入文件操作实例代码
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- 分别以字节、字符、行、随机四种方式读取文件(Java文件操作)
- java在eclipse控制台读取并输出含有中文字符的文件
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)
- 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
- 要求通过java读取文本并把文本中的每一行后面的三个成绩相加, 最后按从大到小的顺序输出到另一个文本文件中.
- java读取文件——字符流输入和输出
- 通过字符流来对文件进行内容的读取和写入操作
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- Java通过InputStream读取和写入文件操作
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- 通过Java直接对Excel文件进行操作
- 用java和JavaScript读取一个JS文件中字符个数的实现
- Java通过apache poi 读取excel(.xlsx)文件,并通过MyBbtis插入数据库中