昨晚无意之间写了一个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();
}
}
}