Java字符流和字节流对文件操作的区别

网上科普有关“Java字符流和字节流对文件操作的区别”话题很是火热,小编也是针对Java字符流和字节流对文件操作的区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在...

网上科普有关“Java字符流和字节流对文件操作的区别”话题很是火热,小编也是针对Java字符流和字节流对文件操作的区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。

字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;

字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;

字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;

而字节流按字节读取,不作任何处理,常用于读取二进制数据。

Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。

字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。

java IO流想不通的问题,为什么说OutputStreamWriter是字符流通向字节流的桥梁?(看说明) 求大神解释

Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家做一个简要的介绍。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图:

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的:

在这其中InputStream和OutputStream在早期的Java版本中就已经存在了,它们是基于字节流的,而基于字符流的Reader和Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系。

在这四个抽象类中,InputStream和Reader定义了完全相同的接口:

int read()

int read(char cbuf[])

int read(char cbuf[], int offset, int length)

而OutputStream和Writer也是如此:

int write(int c)

int write(char cbuf[])

int write(char cbuf[], int offset, int length)

这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。

更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后,本文在这里想给大家一些以后可以反复应用例子,对于所有子类的细节及其功能并不详细讨论。

import java.io.*;

public class IOStreamDemo {

public void samples() throws IOException {

//1. 这是从键盘读入一行数据,返回的是一个字符串

BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));

System.out.print("Enter a line:");

System.out.println(stdin.readLine());

//2. 这是从文件中逐行读入数据

BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));

String s, s2 = new String();

while((s = in.readLine())!= null)

s2 += s + "\n";

in.close();

//3. 这是从一个字符串中逐个读入字节

StringReader in1 = new StringReader(s2);

int c;

while((c = in1.read()) != -1)

System.out.print((char)c);

//4. 这是将一个字符串写入文件

try {

BufferedReader in2 = new BufferedReader(new StringReader(s2));

PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

int lineCount = 1;

while((s = in2.readLine()) != null )

out1.println(lineCount++ + ": " + s);

out1.close();

} catch(EOFException e) {

System.err.println("End of stream");

}

}

}

对于上面的例子,需要说明的有以下几点:

1. BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

BufferedReader(Reader in)

BufferedReader(Reader in, int sz)

这里的sz是指定缓冲区的大小。

它的基本方法:

void close() //关闭流

void mark(int readAheadLimit) //标记当前位置

boolean markSupported() //是否支持标记

int read() //继承自Reader的基本方法

int read(char[] cbuf, int off, int len) //继承自Reader的基本方法

String readLine() //读取一行内容并以字符串形式返回

boolean ready() //判断流是否已经做好读入的准备

void reset() //重设到最近的一个标记

long skip(long n) //跳过指定个数的字符读取

2. InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给 BufferedReader使用。

3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter包在最外层。

Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

import java.io.*;

public class Redirecting {

public static void main(String[] args) throws IOException {

PrintStream console = System.out;

BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));

PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));

System.setIn(in);

System.setOut(out);

BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

String s;

while((s = br.readLine()) != null)

System.out.println(s);

out.close();

System.setOut(console);

}

}

在这里java.lang.System的静态方法

static void setIn(InputStream in)

static void setOut(PrintStream out)

提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。

Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。

在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

import java.io.*;

import java.util.*;

public class Logon implements Serializable {

private Date date = new Date();

private String username;

private transient String password;

Logon(String name, String pwd) {

username = name;

password = pwd;

}

public String toString() {

String pwd = (password == null) ? "(n/a)" : password;

return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;

}

public static void main(String[] args) throws IOException, ClassNotFoundException {

Logon a = new Logon("Morgan", "morgan83");

System.out.println( "logon a = " + a);

ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));

o.writeObject(a);

o.close();

int seconds = 5;

long t = System.currentTimeMillis() + seconds * 1000;

while(System.currentTimeMillis() < t) ;

ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));

System.out.println( "Recovering object at " + new Date());

a = (Logon)in.readObject();

System.out.println("logon a = " + a);

}

}

类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。

关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

对Java的输入输出功能,就浅浅的介绍到这里,本文的目的只是开一个好头,希望能让大家对Java输入输出流有个基本的认识。

OutputStreamWriter流的作用就是利用字节流(OutputStream)作为”底层“输出流然后构建字符输出流,字符输出流输出字符到流中,然后通过指定的字符集把流中的字符编码成字节输出到字节流中,其作用就是一个桥梁,使得双方链接起来

理解了么

输出输入流,你可以理解为方向不一样。

OutputStreamWriter的构造方法传入的是字节流,OutputStreamWriter将要输出的东西,传到OutputStream字节流,并按照制定的编码输出

关于“Java字符流和字节流对文件操作的区别”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[迎夏]投稿,不代表平和号立场,如若转载,请注明出处:https://resphina.com/cshi/202504-73138.html

(161)

文章推荐

  • 3分钟教程“手机填大坑有挂吗”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月15日
    36
  • 3分钟教程“天天麻将能不能开挂”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月18日
    22
  • 3分钟教程“决胜麻将辅助工具是什么”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月20日
    34
  • 3分钟教程“哈灵麻将开挂视频教程下载免费版”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月25日
    26
  • 3分钟教程“麻将神器幸运石有什么用吗知乎”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月28日
    25
  • 3分钟教程“手机麻将神器盒子怎么用教程图解”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年01月31日
    32
  • 3分钟教程“边锋斗地主怎么看底牌”其实确实有挂

    本篇文章给大家谈谈游戏挂热点,希望对各位有所帮助,不要忘了收藏本站喔。一、什么是游戏挂?1.打开手机桌面微信APP,进入微信主页。2.下拉微信主页,找到四川麻将小程序。注意:没有小程序利用的,可在上方搜索小程序。3.点击进入四川麻将小程序,选择右上角商城,点击打开。4.选择道

    2025年02月04日
    21
  • 疫情最新消息新增情况河北(疫情最新数据统计河北)

    本篇文章给大家谈谈疫情最新消息新增情况河北,以及疫情最新数据统计河北对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。河北深泽县新增确诊11例行程轨迹一览确诊病例11:郭某,女,46岁,现住深泽县大桥头镇河庄村。系10月31日确诊病例3孙某某的密切接触者。11月2日7时在隔离点核酸检测中初筛

    2025年02月17日
    26
  • 自我评价要怎么写?

    网上科普有关“自我评价要怎么写?”话题很是火热,小编也是针对自我评价要怎么写?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。改改人称即可1.你性格沉静,常常不拘小节,待人接物却稳重大方。平日里言语并不多,但我知道你心志高远,骨子里一种倔强和坚忍。你上进心强,

    2025年03月05日
    256
  • boy英语怎么说

    网上科普有关“boy英语怎么说”话题很是火热,小编也是针对boy英语怎么说寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。boy读音:英[b];美[b]。Boy是一个英语单词,它的意思是“男孩”或“小男孩”。作为英语中的常见名词,boy是男性人类的儿童或亚成年

    2025年03月30日
    144

发表回复

本站作者后才能评论

评论列表(4条)

  • 迎夏
    迎夏 2025年04月18日

    我是平和号的签约作者“迎夏”!

  • 迎夏
    迎夏 2025年04月18日

    希望本篇文章《Java字符流和字节流对文件操作的区别》能对你有所帮助!

  • 迎夏
    迎夏 2025年04月18日

    本站[平和号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育

  • 迎夏
    迎夏 2025年04月18日

    本文概览:网上科普有关“Java字符流和字节流对文件操作的区别”话题很是火热,小编也是针对Java字符流和字节流对文件操作的区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在...