究极菜鸟级问题,java.io

cs285354778 2012-11-06 12:02:03
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class J_Data {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
FileOutputStream fout = new FileOutputStream("out.txt");
DataOutputStream dfout = new DataOutputStream(fout);
int i;
for(i=0;i<4;i++)
{
dfout.writeInt('0' + i);
}
//dfout.close();
FileInputStream fin = new FileInputStream("out.txt");
DataInputStream dfin = new DataInputStream(fin);
for(i=0;i<4;i++)
{
System.out.print(dfin.readInt()+",");
}
dfin.close();
}
catch (Exception e)
{
System.err.println("发生异常:"+e);
e.printStackTrace();
}
}

}
请问:为什么写入out.txt中的是“ 0 1 2 3”,而不是预期的“ 48 49 50 51”?
...全文
217 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs285354778 2012-11-06
  • 打赏
  • 举报
回复
引用 6 楼 tessykandy 的回复:
引用 2 楼 liuhuan_tao 的回复:DataInputStream 和DataOutputStream属于 字节流,它是一个字节一个字节的写或读。而java中int是4个字节,所以文件中不可能是正确的数。你看到的0,1,2,3其实并不完全,如果用noteplus打开 至于为什么system.println()可以正确读出来,可能是系统调用默认格式如ut……
谢谢您!!我正学到字符流类,得写写代码进行对比。
cs285354778 2012-11-06
  • 打赏
  • 举报
回复
引用 5 楼 zhou9898 的回复:
首先说下,楼主的这个问题很好,楼上很多人回答的也很好. 不过原因是这样子的 您写入文件的是int 的,其实还是转换为字符写入的,是 0 1 2 3 但是你读出来的是int读出来的,但是这个int是从流里面一byte读取出来的 个人觉得写入的是字符 读取出来是char的,读取出来的其实也是0 1 2 3 但是转换成了48 49 50 51的 ……
谢谢您!!结合您和2楼的回复,让我清楚了来龙去脉。
cs285354778 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 liuhuan_tao 的回复:
DataInputStream 和DataOutputStream属于 字节流,它是一个字节一个字节的写或读。而java中int是4个字节,所以文件中不可能是正确的数。你看到的0,1,2,3其实并不完全,如果用noteplus打开 至于为什么system.println()可以正确读出来,可能是系统调用默认格式如utf-8.这个不确定。
谢谢您!!您的回复十分有说服力,很清晰!
黑石课堂 2012-11-06
  • 打赏
  • 举报
回复
首先说下,楼主的这个问题很好,楼上很多人回答的也很好. 不过原因是这样子的 您写入文件的是int 的,其实还是转换为字符写入的,是 0 1 2 3 但是你读出来的是int读出来的,但是这个int是从流里面一byte读取出来的 个人觉得写入的是字符 读取出来是char的,读取出来的其实也是0 1 2 3 但是转换成了48 49 50 51的
diypyh 2012-11-06
  • 打赏
  • 举报
回复
或者改为这样:

dfout.writeChar('0' + i);
diypyh 2012-11-06
  • 打赏
  • 举报
回复
注意这句:

	dfout.writeInt('0' + i);
当一个字符型数据和整数型数据计算时,会发生自动向上转型,此时得到的数据是整数型,结果也就是你看见的0,1,2...如果要想写入字符型数据,则需要强制向下转型,改为这样:

	dfout.writeInt((char)('0' + i));
金鱼我在这 2012-11-06
  • 打赏
  • 举报
回复
DataInputStream 和DataOutputStream属于 字节流,它是一个字节一个字节的写或读。而java中int是4个字节,所以文件中不可能是正确的数。你看到的0,1,2,3其实并不完全,如果用noteplus打开


至于为什么system.println()可以正确读出来,可能是系统调用默认格式如utf-8.这个不确定。
tessykandy 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 liuhuan_tao 的回复:
DataInputStream 和DataOutputStream属于 字节流,它是一个字节一个字节的写或读。而java中int是4个字节,所以文件中不可能是正确的数。你看到的0,1,2,3其实并不完全,如果用noteplus打开 至于为什么system.println()可以正确读出来,可能是系统调用默认格式如utf-8.这个不确定。
2楼说的对,如果想在out.txt中能看到结果,建议用字符流类OutputStreamWriter或FileWriter
fx_xf 2012-11-06
  • 打赏
  • 举报
回复

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class  J_Data {
	public static void main(String[] args) {
	// TODO Auto-generated method stub
		try{
			FileOutputStream fout = new FileOutputStream("out.txt");
			DataOutputStream dfout = new DataOutputStream(fout);
			dfout.writeInt('0' - 1);
			dfout.writeInt('0');
			dfout.writeInt('0' + 1);	
			dfout.writeInt(1);
			dfout.writeInt('中');
			FileInputStream fin = new FileInputStream("out.txt");
			DataInputStream dfin = new DataInputStream(fin);
			System.out.println(dfin.readInt());
			System.out.println(dfin.readInt());
			System.out.println(dfin.readInt());
			System.out.println(dfin.readInt());
			System.out.println(dfin.readInt());
		}catch (Exception e){
			System.err.println("发生异常:"+e);
			e.printStackTrace();
		}
	}
}
楼主你好,关于你的问题在控制台打印结果为"48,49,50,51",而直接打开out.txt却是"0,1,2,3", 你可以运行一下以上的代码.对比下控制台结果和txt里的结果,再看下面的解释. DataOutputStream本来就是用来写二进制数据的,你直接打开out.txt当然 看到的是乱码,而用DataInputStream按你写的顺序读进来看就对了。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧