关于文件输入流遇到的问题和部分解决思路

关于文件输入流遇到的问题和部分解决思路

关于输出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)
在用来输出的时候我感觉应该是获取堆中数据出了问题。出了什么问题;哪块出了问题问题,我也不知道
我的思路是就是这样谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值