您的位置:首页 > 编程语言 > Java开发

厚积薄发JAVA文件操作--java I/O中通过字符流读取文件并输出

2011-07-15 13:18 1131 查看
昨晚无意之间写了一个java读取文件并输出到控制台的代码---因为操作的文件中包含汉字,所有用到了字符流InputStreamReader。但是意外的是:当我把读取的文档输出到后台后发现,输出的内容尾部多出了很多类似‘口口口口口口口口口口口口’的无用东东。怎么回事呢?难道代码有问题?
重新查看代码如下:

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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐