重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先,学习字符流这个知识的时候,你要明确一点:reader()这个方法是一个阻塞式的方法,关于阻塞式的方法这里就不详细介绍了、所以当循环开始的时候,int c 从文件中拿是一个一个字节的拿,
公司专注于为企业提供成都网站设计、成都网站制作、微信公众号开发、电子商务商城网站建设,微信小程序开发,软件按需开发网站等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,创新互联更提供一系列网站制作和网站推广的服务。
其次,你要搞清楚字节与字符的含义:在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间,
你可能受到了FileReader、FileInputStream之间传输的字节数不同的影响。
理论上是那样的,但是在计算机中的存储结构还是要考虑实际的编码的因素;
希望对你有帮助哦,,
祝你好运
File file=new File("E:\\1.txt");//创建文件对象,
FileInputStream fread; //FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
BufferedInputStream reader=null;
BufferedOutputStream write=null; //该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
try
{
fread = new FileInputStream(file);//将文件对象添加到文件的输入流,也就是你要从你的数据源开始读取数据
reader=new BufferedInputStream(fread);//将字节流对象添加到缓存区中,这样效率要高一点
String str=null;//初始化字符串这样保存的是读取的一行的数据
write=new BufferedOutputStream(new FileOutputStream(new File("E:\\2.txt")));//创建的是输出流缓存 请要输出的目的地添加到缓存区中,
byte b[]=new byte[1024];//定义每次读取的字节的范围,也是存储数据的容器
int i=0;
while((i=reader.read(b))!=-1) //下一个数据字节,如果到达流末尾,则返回 -1。
{
write.write(b);//开始写入数据
}
}
catch (FileNotFoundException e) //如果没有文件打印该异常
{
e.printStackTrace();
}
catch (IOException e) //如果出现io异常 也就处理异常
{
e.printStackTrace();
}
finally//最后不管读取还是没读取成功都释放资源
{
try
{
write.close();//关闭缓存区,关闭缓存区会自动关闭相应的io流
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
楼主在向hello.txt中传输那句话时的确将其转换成了字节,也就是二进制,但是这只是向文本传输的一种方式,写入文本后,这些二进制还是会以文字的形式展示,毕竟每个文字都是由二进制组成的呀。
望楼主理解,我也是java学习中。一起加油了。
因为字符每个国家都不一样,所以涉及到了字符编码问题,那么GBK编码的中文用unicode编码解析是有问题的,所以需要获取中文字节数据的同时+ 指定的编码表才可以解析正确数据。为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。
注意:流的操作只有两种:读和写。
流的体系因为功能不同,但是有共性内容,不断抽取,形成继承体系。该体系一共有四个基类,而且都是抽象类。