Java 字节流 字符流 转换流

Java 字节流 字符流 转换流,第1张

  Java是一门面向对象编程语言,不仅吸收了C++++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

  Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

  Java的存储分配模型是它防御恶意代码的主要方法之一。Java没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的Java代码中的存储引用在运行时由Java解释程序决定实际存储地址。

  Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制。这个安全机制部分包括类如何从网上装载。例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准Java类。

  Java 字节流 字符转换

  Java 字节流 字符流 转换流,Java 字节流 字符流 转换流,第2张

  我们知道Java中的流分为字符流和字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片、电影等只要是文件都是以二进制的形式存在的,而不是字符。

  字符流:

  FileReader

  FileWriter。

  BufferedReader

  BufferedWriter

  字节流:

  FileInputStream

  FileOutputStream

  BufferedInputStream

  BufferedOutputStream

  我们看一下J2SE文档:

  BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。

  可以看出BufferedReader是一个Reader的子类,构造函数传进来的是父类Reader类,其实是装饰者模式,将父类比较低效的读取数据的方式做成了比较高效的缓冲区读取方式。

  String readLine():读取一个文本行。

  它有一个方法readLine(),直接读取一行,相对于父类Reader的read()方法更加方便。

  System.in:对应的标准输入设备:键盘。

  staTIc InputStream in :“标准”输入流。

  我们可以写一个类来使用System中的静态方法in来从键盘读取数据:

  [java] view plain copy《span style=“font-size:18px;”》import java.io.*;

  class ReadIn{

  public staTIc void main(String[] args) throws IOExcepTIon{

  InputStream inin = System.in; //新建一个InputStream对象,读取位置为键盘

  StringBuilder sb = new StringBuilder(); //用于存储读入的字符,相当于自己建了一个缓存区

  while(true){

  int ch = inin.read(); //读取字节

  if(ch==‘\r’)

  conTInue;

  if(ch==‘\n’){

  String s = sb.toString();//读到回车符就转成String,看看是否是“over”,是就退出度数

  if(“over”.equals(s))

  break;

  else{

  System.out.println(s.toUpperCase());//不是“over”的话就不退出,一行读取完毕,输出到屏幕上

  sb.delete(0,sb.length()); //清空缓存StringBuilder sb

  }

  }

  else

  sb.append((char)ch); //如果没读到换行符,就继续往缓存StringBuilder里添加读取的字符

  }

  }

  }《/span》

  System的in的类型是InputStream,属于字节流,和BufferedReader属于不同的流类。在InputStream中没有readLine()这样的整行读取方法,只有read()。

  那么能不能直接使用readLine()方法来完成键盘录入的一行数据的读取呢?

  即“能不能将字节流转成字符流,然后再使用字符流缓冲区的readLine方法呢”?

  可以的!

  在字符流中有这样的字符流:

  将字节流转换成字符流的桥梁——InputStreamReader;

  InputStreamReader(InputStream in) :创建一个使用默认字符集的 InputStreamReader。传入的对象是InputStream类型,而自己本身是Reader的子类。

  将字符流转换成字节流的桥梁——OutputStreamWriter。

  OutputStreamWriter(OutputStream out) :创建使用默认字符编码的 OutputStreamWriter。传入的对象是OutputStream类型,而自己本身是Writer的子类。

  从名字就可以看出,他们分别属于(从属关系看名字的后半部分)字符流Reader和Writer,他们的功能(功能看名字的前半部分)和字节流InputStream、OutputStream相关。

  [java] view plain copy《span style=“font-size:18px;”》import java.io.*;

  class TransStreamDemo{

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

  InputStream in = System.in; //获取键盘录入对象。

  InputStreamReader isr = new InputStreamReader(in); //将字节流对象转成字符流对象,使用转换流。InputStreamReader

  BufferedReader bufr = new BufferedReader(isr); //为了提高效率,将字符串进行缓冲区技术高效 *** 作。使用BufferedReader

  // BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //最常见写法,以后都这样写!!!

  OutputStream out = System.out;

  OutputStreamWriter osw = new OutputStreamWriter(out);

  BufferedWriter bufw = new BufferedWriter(osw);

  // BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); //同上!!!

  String line = null;

  while( ( line = bufr.readLine() ) != null ){

  if(“over”.equals(line))

  break;

  bufw.write(line.toUpperCase()); //bufw将osw包装了,osw将out包装了,本例中out是Syetem.out的对象实现,所以原本用System.out.println的地方直接可以用包装后的bufw输出字符串。

  bufw.newLine(); //输出换行符:可以根据Linux和Windows的不同自动输出\n或\r\n

  bufw.flush(); //输出流有缓冲区,需要flush才输出来

  }

  bufr.close();

  }

  }《/span》

  即——

  从文件读取字符,用FileReader,但是为了让其读取更高效,使用BufferedReader将其包装一下;

  从键盘读取数据,(新建一个InputStream对象获取键盘录入对象,)用InputStreamReader转换流将InputStream转换,然后用BufferedReader将InputStreamReader包装。

  当然InputStream也可以从文件读取,这个时候使用的就不是InputStream in = System.in,而是InputStream in = new FileInputStream(String fileName)。

  即:

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

  和

  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(String fileName)));

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2717635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存