java中java 字节转字符串流和字符流读取的问题(有图)

111284人阅读
菜鸟自学Java系列(57)
先来看一下流的概念:
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
字节流与字符流
在包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用完成,输入使的是,在字符流中输出主要是使用类完成,输入流主要使用类完成。(这四个都是抽象类)
java中提供了专用于输入输出功能的包Java.io,其中包括:
&&&& InputStream,OutputStream,Reader,Writer
&&&& InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
&&&& Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
&&&& 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
&&&&& 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
&&&&&& 字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
==================我们还可以看到:============
Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在
0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.
在中操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:
1&使用类打开一个文件
2&通过字节流或字符流的子类,指定输出的位置
3&进行读写操作
4&关闭输入输出
IO操作属于资源操作,一定要记得关闭
字节流主要是操作类型数据,以数组为准,主要操作类就是、
字节输出流:
OutputStream是整个包中字节输出流的最大父类,此类的定义如下:
public&abstract&class&OutputStream&extends&Object&implements&Closeable,Flushable
从以上的定义可以发现,此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:类。通过向上转型之后,可以为实例化
Closeable表示可以关闭的操作,因为程序运行到最后肯定要关闭
Flushable:表示刷新,清空内存中的数据
FileOutputStream类的构造方法如下:
public&FileOutputStream(File&file)throws&FileNotFoundException
1&import&java.io.F
&2&import&java.io.FileOutputS
&3&import&java.io.IOE
&4&import&java.io.OutputS
&6&public&class&Test11&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&OutputStream&out=new&FileOutputStream(f);//如果文件不存在会自动创建
10&&&&&&&&&String&str=&Hello&World&;
11&&&&&&&&&byte[]&b=str.getBytes();
12&&&&&&&&&out.write(b);//因为是字节流,所以要转化成字节数组进行输出
13&&&&&&&&&out.close();
也可以一个字节一个字节进行输出,如下:
1&import&java.io.F
&2&import&java.io.FileOutputS
&3&import&java.io.IOE
&4&import&java.io.OutputS
&6&public&class&Test11&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&OutputStream&out=new&FileOutputStream(f);//如果文件不存在会自动创建
10&&&&&&&&&String&str=&Hello&World&;
11&&&&&&&&&byte[]&b=str.getBytes();
12&&&&&&&&&for(int&i=0;i&b.i++){
13&&&&&&&&&&&&&out.write(b[i]);
14&&&&&&&&&}
15&&&&&&&&&out.close();
以上输出只会进行覆盖,如果要追加的话,请看类的另一个构造方法:
public&FileOutputStream(File&file,boolean&append)throws&FileNotFoundException
在构造方法中,如果将的值设置为,则表示在文件的末尾追加内容。
1&import&java.io.F
&2&import&java.io.FileOutputS
&3&import&java.io.IOE
&4&import&java.io.OutputS
&6&public&class&Test11&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&OutputStream&out=new&FileOutputStream(f,true);//追加内容
10&&&&&&&&&String&str=&\r\nHello&World&;
11&&&&&&&&&byte[]&b=str.getBytes();
12&&&&&&&&&for(int&i=0;i&b.i++){
13&&&&&&&&&&&&&out.write(b[i]);
14&&&&&&&&&}
15&&&&&&&&&out.close();
文件中换行为:
字节输入流:
既然程序可以向文件中写入内容,则就可以通过从文件中把内容读取进来,首先来看类的定义:
public&abstract&class&InputStream&extends&Object&implements&Closeable
与类一样,本身也是一个抽象类,必须依靠其子类,如果现在是从文件中读取,就用来实现。
观察类的构造方法:
public&FileInputStream(File&file)throws&FileNotFoundException
1&import&java.io.F
&2&import&java.io.FileInputS
&3&import&java.io.IOE
&4&import&java.io.InputS
&6&public&class&Test12&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&InputStream&in=new&FileInputStream(f);
10&&&&&&&&&byte[]&b=new&byte[1024];
11&&&&&&&&&int&len=in.read(b);
12&&&&&&&&&in.close();
13&&&&&&&&&System.out.println(new&String(b,0,len));
但以上方法是有问题的,用不用开辟这么大的一个字节数组,明显是浪费嘛,我们可以根据文件的大小来定义字节数组的大小,类中的方法:
1&import&java.io.F
&2&import&java.io.FileInputS
&3&import&java.io.IOE
&4&import&java.io.InputS
&6&public&class&Test13&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&InputStream&in=new&FileInputStream(f);
10&&&&&&&&&byte[]&b=new&byte[(int)&f.length()];
11&&&&&&&&&in.read(b);
12&&&&&&&&&in.close();
13&&&&&&&&&System.out.println(new&String(b));
我们换种方式,一个字节一个字节读入
1&import&java.io.F
&2&import&java.io.FileInputS
&3&import&java.io.IOE
&4&import&java.io.InputS
&6&public&class&Test14&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&InputStream&in=new&FileInputStream(f);
10&&&&&&&&&byte[]&b=new&byte[(int)&f.length()];
11&&&&&&&&&for(int&i=0;i&b.i++){
12&&&&&&&&&&&&&b[i]=(byte)&in.read();
13&&&&&&&&&}
14&&&&&&&&&in.close();
15&&&&&&&&&System.out.println(new&String(b));
但以上情况只适合知道输入文件的大小,不知道的话用如下方法:
1&import&java.io.F
&2&import&java.io.FileInputS
&3&import&java.io.IOE
&4&import&java.io.InputS
&6&public&class&Test15&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&InputStream&in=new&FileInputStream(f);
10&&&&&&&&&byte[]&b=new&byte[1024];
11&&&&&&&&&int&temp=0;
12&&&&&&&&&int&len=0;
13&&&&&&&&&while((temp=in.read())!=-1){//-1为文件读完的标志
14&&&&&&&&&&&&&b[len]=(byte)&
15&&&&&&&&&&&&&len++;
16&&&&&&&&&}
17&&&&&&&&&in.close();
18&&&&&&&&&System.out.println(new&String(b,0,len));
在程序中一个字符等于两个字节,那么提供了、两个专门操作字符流的类。
字符输出流:
Writer本身是一个字符流的输出类,此类的定义如下:
public&abstract&class&Writer&extends&Object&implements&Appendable,,
此类本身也是一个抽象类,如果要使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,所以应该使用的子类。
FileWriter类的构造方法定义如下:
public&FileWriter(File&file)throws&IOException
字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。
1&import&java.io.F
&2&import&java.io.FileW
&3&import&java.io.IOE
&4&import&java.io.W
&6&public&class&Test16&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&Writer&out=new&FileWriter(f);
10&&&&&&&&&String&str=&Hello&World&;
11&&&&&&&&&out.write(str);
12&&&&&&&&&out.close();
在默认情况下再次输出会覆盖,追加的方法也是在构造函数上加上追加标记
1&import&java.io.F
&2&import&java.io.FileW
&3&import&java.io.IOE
&4&import&java.io.W
&6&public&class&Test17&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&Writer&out=new&FileWriter(f,true);//追加
10&&&&&&&&&String&str=&\r\nHello&World&;
11&&&&&&&&&out.write(str);
12&&&&&&&&&out.close();
字符输入流:
Reader是使用字符的方式从文件中取出数据,类的定义如下:
public&abstract&class&Reader&extends&Objects&implements&Readable,
Reader本身也是抽象类,如果现在要从文件中读取内容,则可以直接使用子类。
FileReader的构造方法定义如下:
public&FileReader(File&file)throws&FileNotFoundException
以字符数组的形式读取出数据:
1&import&java.io.F
&2&import&java.io.FileR
&3&import&java.io.IOE
&4&import&java.io.R
&6&public&class&Test18&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&Reader&input=new&FileReader(f);
10&&&&&&&&&char[]&c=new&char[1024];
11&&&&&&&&&int&len=input.read(c);
12&&&&&&&&&input.close();
13&&&&&&&&&System.out.println(new&String(c,0,len));
也可以用循环方式,判断是否读到底:
1&import&java.io.F
&2&import&java.io.FileR
&3&import&java.io.IOE
&4&import&java.io.R
&6&public&class&Test19&{
&7&&&&&public&static&void&main(String[]&args)&throws&IOException&{
&8&&&&&&&&&File&f&=&new&File(&d:&&+&File.separator+&test.txt&);
&9&&&&&&&&&Reader&input=new&FileReader(f);
10&&&&&&&&&char[]&c=new&char[1024];
11&&&&&&&&&int&temp=0;
12&&&&&&&&&int&len=0;
13&&&&&&&&&while((temp=input.read())!=-1){
14&&&&&&&&&&&&&c[len]=(char)&
15&&&&&&&&&&&&&len++;
16&&&&&&&&&}
17&&&&&&&&&input.close();
18&&&&&&&&&System.out.println(new&String(c,0,len));
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(方法),文件也能输出,但是如果字符流不使用方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用方法强制进行刷新缓冲区,这时才能在不的情况下输出内容
那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
如果要程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(18)(21)(28)
开始自学数据结构,采用C语言进行实现。看到各种数据结构的书中只是给出了一些实现的算法,但是一般的初学者很难再VC 环境下编写出能够运行的数据结构程序。本栏目发的所用文章附带的代码都可以直接在VC下运行。Java中的IO操作
视频太卡?试试切换线路
本课时对Java IO做一简单介绍,IO也写作“I/O”,可理解为In和Out,即输入与输出,IO体系的基本功能就是:读和写。
本课时讲解字符、字节与编码,字节流可以处理所有类型的数据,如图片、文字、视频等。在读取时,读到一个字节就返回一个字节。字符流仅能够处理纯文本数据,如txt文本等。
本课时讲解使用FileInputStream和FileOutputStream字节流拷贝文件。
本课时讲解使用BufferedInputStream和BufferedOutputStream缓冲字节流拷贝文件。
本课时讲解使用InputStreamReader语OutputStreamWriter字符流读写文件数据。
本课时讲解使用BufferedReader语BufferedWriter缓冲字符流读写文件数据。
本课时讲解FileReader与FileWriter直接操作文件数据流,并包装为缓冲流进行文件拷贝。
本课时讲解使用RandomAccessFile可以读写文件的任意位置,一般用于多线程读写操作。
本课时讲解使用Apache IO库操作IO与文件,Apache IO库是一个强大的IO操作库,提供了对于IO与文件大量精简高效的操作方法,文件的读写、拷贝有时候仅需一行代码就可完成。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
12Java JDK 1.7 API参考文档
添加新技术问题
课程 [Java IO简介]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [Java IO简介]> 问题详情
Java中的抽象类Reader和Writer所处理的流是()。,A.图像流B.对象流C.字节流D.字符流
悬赏:0&答案豆
提问人:匿名网友
发布时间:
Java中的抽象类Reader和Writer所处理的流是()。,A.图像流B.对象流C.字节流D.字符流
为您推荐的考试题库
您可能感兴趣的试题
1下列叙述中,错误的是(&&)。A.内部类的名称与定义它的类的名称可以相同B.内部类可用abstract修饰C.内部类可作为其他类的成员D.内部类可访问它所在类的成员2用于在子类中调用被重写父类方法的关键字是(&&)。A.thisB.superC.ThisD.Super3下列Java语句从指定网址读取html文件,在下划线处应填上的选项是(&&)。&&Readerin=new______(newURL(urlString).openStream());A.ReaderB.DataOutputStreamC.ByteArraylnputStreamD.InputStreamReader4下列不属于表达式语句的是(&&)。A.++i;B.--j;C.b#a;D.b*=a;
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
找答案会员
享三项特权
找答案会员
享三项特权
找答案会员
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:java的字符流与字节流到底有什么区别 - ITeye问答
分别用字节流和字符流读取的页面源码,我是这样做的
import java.io.IOE
import java.io.InputS
import java.net.MalformedURLE
import java.net.URL;
* 测试字节流和字符流读取站点数据时的区别
* 现象:用字符流读取时,中文出现乱码
* 猜想:字符流读取,字符错位引起的
* @author ayis
* Mar 13, 2009
public class Test {
public static void main(String args[]){
URL url = new URL("");
InputStream in = url.openStream();
StringBuffer buffer = new StringBuffer();
// 用字节流读取
while((n= in.read()) != -1){
buffer.append((char)n);
// 用字符流读取
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while((n = reader.read()) != -1){
buffer.append((char)n);
// 转码并打印结果
String response = new String(buffer.toString().getBytes("iso-8859-1") , "GBK");
System.out.println(response);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
如现在程序这样的,用字节流读取时,都是正常的,中文未出现任何乱码;如果相应去掉注释,用字符流读取,中文就出现了乱码,如:&title&?????????&&&&& &/title&。
另外,试着使用BufferedReader的readerLine(),或者去掉BufferedReader直接使用InputStreamReader,均照样出现中文乱码。
我想知道,使用字节流读取数据时,稳当当的,使用字符流时,怎么中文就出现了乱码???
字符流处理单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串
字节流处理单元为 1 个字节,操作字节和字节数组。
中文乱码.曾今我用过这个,可以成功:
OutputStream out = new FileOutputStream(new File("f:/121.txt"));
OutputStreamWriter writer = new OutputStreamWriter(out,Charset.forName("utf-8"));
从字面上就可以知道字节流和字符流的区别:
字节流:用于读取一个一个的数据字节(8位),每8位当成一个单元
字符流:用于读取一个一个的数据字符(16位),每16位当成一个单元
像中文字符,有些是要3个字节(24位)才能表示的,用字符流就被截取了8位
要注意他们的编码方式啊..目前好像这些东东都是默认用的iso编码..你可以如楼上所说改下...还有字节流当然就是倾向于处理字节喽(如图像,声音).而字符流趋向于处理字符(如文本)..用字节流处理字符好像也行,但用字符流处理字节流肯定出错喽~~
把getBytes("iso-8859-1") , "GBK") 去掉
已解决问题
未解决问题&JAVA视频教程 07IO流字符流FileReader读取方式二
秒后自动跳转到登录页
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
JAVA视频教程 07IO流字符流FileReader读取方式二
上传时间:
技术分类:
资源评价:
(0位用户参与评价)
已被下载&2&次
JAVA视频教程 07IO流字符流FileReader读取方式二
本资料共包含以下附件:
JAVA视频教程 07IO流字符流FileReader读取方式二.rar
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
相关专题推荐
本套视频教程共包含20个章节,包含源
本专题为MLDN培训机构李兴华老师主讲
本专题为Eclipse操作详解视频教程,视
浙江大学颜晖老师授课视频教程,共45
浙江大学张继昌教授授课视频教程,共
本专题为Spring MVC视频教程。Spring
Java开源优秀工作流框架,值得学习和
Qt是一个1991年由奇趣科技开发的跨平
C++是一种静态数据类型检查的、支持多
Java高级班全套视频教程,讲解全面系
本套教程含很多知识点的应用方案与经
我来说说面向对象第1季,Java俄罗斯方
巴巴运动网视频教程,传智播客黎活明
C++是一种语言,仅仅是它的语法、特性
C++是由C发展而来的,与C兼容。用C语
本视频为传智播客日~2013年
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理

我要回帖

更多关于 java按字节截取字符串 的文章

 

随机推荐