关于BufferedInputStream.read()的用法

myyhml 2009-10-06 11:33:25
//初始化文件对象
File file = new File("E:/S2文件/JSP","Student");
//创建目录
//out.println(file.mkdir());
//在根目录下创建文件
File f = new File(file,"myFile.txt");
//创建输出流
FileOutputStream fileout = new FileOutputStream(f);
//创建缓存输出流
BufferedOutputStream buffOut = new BufferedOutputStream(fileout);
//创建字节数组
byte b [] = "你们好,很高兴认识你们啊!".getBytes();
//将字节数组写入输出流
buffOut.write(b);
//将缓存输出流中的数据保存至目标文件
buffOut.flush();
//关闭输出流
fileout.close();
//创建输入流对象
FileInputStream in = new FileInputStream(f);
//创建缓存输入流对象
BufferedInputStream bufin = new BufferedInputStream(in);
//设置缓冲区
byte c [] = new byte[10];
int n = 0;
while((n=bufin.read(c))!=-1){
String temp = new String(c,0,n);
out.println(temp);
}
//关闭缓存输入流
bufin.close();
//关闭输入流
in.close();
上面的代码中,为什么当我把byte字节数组的长度给为5时就会出现“你们�茫�高兴�鲜赌�们啊! ”乱码现象呢,而且如果我把 byte b [] = "你们好,很高兴认识你们啊!".getBytes();改为“ byte b [] = "nice to meet you".getBytes();
”这时虽然读出来没有出现乱码,但读出的单词并不连续,请问这是什么原因噢,本人自己学java的文件操作这块,就像中文乱码的问题怎么处理?还有就是字节数组中的长度应该依据什么来给才最合适。
...全文
5402 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
顺风_逆流 2011-11-08
  • 打赏
  • 举报
回复
看你的文件夹好像是北大青鸟毕业的吧。有一个问题我不明白:
File file = new File("E:/S2文件/JSP","Student");
//创建目录
//out.println(file.mkdir());
//在根目录下创建文件
File f = new File(file,"myFile.txt");


File file = new File("E:/S2文件/JSP/Student/myFile.txt");

一样的代码你干嘛要写得那么的复杂?
liuxing5266 2009-10-07
  • 打赏
  • 举报
回复
中文占2个字符,不能设成奇数啊。
rookie001 2009-10-07
  • 打赏
  • 举报
回复
用字符流 读中文
handsome_huxiulei 2009-10-07
  • 打赏
  • 举报
回复
输入输出这块
琢磨俩例子就是
生命始于运动 2009-10-07
  • 打赏
  • 举报
回复
同意楼上
阿_布 2009-10-07
  • 打赏
  • 举报
回复
要看你的文件是什么编码的,utf-8中文占三个字节,gbk中文占两个字节。
比如文件中开始连续三个汉字,gbk编码的,读5个字节,第三个汉字的编码就只读了一半,显示的就会和文件中的不一样。
英文不连续是因为
while((n=bufin.read(c))!=-1){
String temp = new String(c,0,n);
out.println(temp);

每读一次不一定恰好是一个单词的边界,打印的时候换行了,这样就把一个单词拆分成两行输出了。
myyhml 2009-10-07
  • 打赏
  • 举报
回复

byte c [] = new byte[10]; //设置缓存
int n = 0;
//循环读取字节
while((n=bufin.read(c))!=-1){
String temp = new String(c,0,n);
out.println(temp);
其中:bufin.read(c)用法还是有些模糊,只知道这样子用,但还是有些理不清其中的思路,其中read()括号中的"c"具体代表什么噢,是不是指每次要读取的字节数,如果是这样,那么为字节数组c规定的长度是不是就是read.(c)方法实际读取的字节数。或者说字节数组c的长度与bufin.read(c)实际读取的字节数之间是什么样的关系呢?可能表达的不是很清楚,麻烦朋友们帮我解释下噢,谢谢了。
yztommyhc 2009-10-07
  • 打赏
  • 举报
回复
一般给byte[]一个比较大的长度,如1024。

英文的byte[]就不是连续的,本来你的中间就是有空格的么。

81,092

社区成员

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

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