关于文件输入流遇到的问题和部分解决思路
关于输出InputFileStream 的read()方法的问题
首次学习IO流简直不要哭死,根本不知道在干嘛。硬着头皮死记硬背不是学习编程的必修之路。对代码的增删改查才是进阶之路。话不多说上正菜
//文件输入输出流
@Test
public void FileIn() {
FileInputStream a = null;
try {
a = new FileInputStream("Test/demo1.txt");
// 此处定义一个整形变量是用来接收read方法返回的ascll码,由于整数并非在任何时候都可以用to string方法。所以需要用强制类型转换。
int b;
while (true) {
b = a.read();
if (b == -1)
break;
System.out.print((char) b);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (a != null) {
a.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//这个是demo1.txt的文本
Hello FileInputStream123123
运行结果如下:
Hello FileInputStream123123
以上是一个简单的循环输出文本文件的代码
当时我想优化代码就这么写了一下
@Test
public void FileIn1() {
FileInputStream a = null;
try {
a = new FileInputStream("Test/demo1.txt");
// 此处定义一个整形变量是用来接收read方法返回的ascll码,由于整数并非在任何时候都可以用to string方法。所以需要用强制类型转换
while (true) {
if (a.read() == -1)
break;
System.out.print((char) a.read());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (a != null) {
a.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
编译无错。运行结果如下:
el ienuSra132?
这样不太直观的话,那我接着告诉你
我只是int b
删除,所有输出都采用 a.read()
;大家 可以亲自测试。在不循环遍历的情况下。
int b=a.read();
System.out.println((char)b);
与
System.out.println((char)a.read());
输出的结果都是一样的
what?
对你没有看错
是一样的都会输出H
我大胆猜测问题出现在print
方法上
我查看了他的源码
public void print(char c) {
write(String.valueOf(c));
}
可以直接写代码
@Test
public void intToString() {
int a = 5;
char b = 'w';
System.out.println(a);
System.out.println(b);
System.out.println((char) a);
System.out.println();
}
输出结果如下:
5
w
得出一个大学时期得出的基础理论
由此可见某些情况int强制类型转化成char的时候是会出错的
但是!
但是!
但是!
file存储方式的是列表
我们采用索引(下标)(地址)来指向内存区(堆)中存放给的数据(堆栈的知识,不会请百度谢谢)
所以是获取地址中的参数进行输出,输出出现误差,应该是地址转换出了错,所以我们采用一个整型数来存放地址
奈何我的基础太差,理解不够深入不够透彻,下面都是我自己的猜测和理解,看个笑话吧。谢谢
我大胆分析一下:
发现传入参数必须是char c
输出的类型是String.valueOf(c)
对于底层我不太懂,我大胆猜测。强制类型转换后值没有改变。类型变了。总所周知,机器用二进制存储,机器本省不识别01以外的任何数字和字母。所以在int转变成char 的时候。int是二进制数字所以输入参数端口没有问题!
我们来看输出端口String.valueOf(c)
。
在用来输出的时候我感觉应该是获取堆中数据出了问题。出了什么问题;哪块出了问题问题,我也不知道
我的思路是就是这样谢谢