hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Java IO编程——字符流与字撙节

2019-11-18杂谈搜奇网31°c
A+ A-

java.io包内里File类是唯一 一个与文件自身有关的顺序处置惩罚类,然则File只能够操纵文件自身而不能够操纵文件的内容,或者说在现实的拓荒当中IO操纵的中心意义在于:输入与输出操纵。而关于顺序而言,输入与输出能够来自于差别的环境,比方:经由过程电脑衔接服务器上举行阅读的时刻,现实上此时客户端发出了一个信息,然后服务器吸收到此信息以后举行回应处置惩罚。

 

 

      关于服务器或者是客户端而言现实上通报的就是一种数据流的处置惩罚情势,而所谓的数据流指的就是字节数据。而关于这类流的处置惩罚情势在java.io包内里提供有两类支撑:

 

   ·字节处置惩罚流OutputStream(输出字撙节)、InputStream(输入字撙节);

 

   ·字符处置惩罚流Writer(输出字符流)、Reader(输入字符流);

一切的流操纵都应当采纳以下一致的步骤举行,下面以文件处置惩罚的流程为例:

 

   ·假如如今要举行的是文件的读写操纵,则肯定要经由过程File类找到一个文件途径;

 

   ·经由过程字撙节或字符流的子类为父类对象实例化;

 

   ·应用字撙节或字符流中的要领完成数据的输入与输出操纵;

 

   ·流的操纵属于资本操纵,资本操纵必需举行封闭处置惩罚;

 

1. 字节输出流:OutputStream

 

字节的数据是以byte类型为主完成的操纵,在举行字节内容输出的时刻能够运用OutputStream类完成,这个类的基础定义以下:

public abstract class OutputStream extends Object implements Closeable, Flushable

  起首能够发明这个类完成了两个接口,因而基础的对应关联以下:

 

 

Closeable

Flushable

public interface Closeable extends AutoCloseable {public void close​() throws Exception;}

public interface Flushable{public void flush​() throws IOException;}

 

 

OutputStream类定义的是一个大众的输出操纵规范,而在这个操纵规范内里一共定义有三个内容输出的要领。

No

要领称号

类型

形貌

01

public abstract void write​(int b) throws IOException

平常

输出单个字节数据

02

public void write​(byte[] b) throws IOException

平常

输出一组字节数据

03

public void write​(byte[] b,int off,int len) throws IOException

平常

输出部份字节数据

然则须要注重的一个中心题目在于:OutputStream类毕竟是一个抽象类,而这个抽象类假如要想取得实例化对象,根据传统的熟悉应当经由过程子类实例的向上转完成,假如说如今要举行的是文件处置惩罚操纵,则能够运用FileOutputStream子类:

因为终究都须要发作向上转型的处置惩罚关联,所以关于此时的FileOutputStream子类中心的关注点就能够放在组织要领:

   ·【掩盖】组织要领:public FileOutputStream​(File file) throws FileNotFoundException

 

   ·【追加】组织要领:public FileOutputStream​(File file,boolean append) throws FileNotFoundException

类型:运用OutputStream类完成内容的输出 

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.OutputStream;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + 
 7             File.separator + "mldn.txt");             // 1、指定要操纵的文件的途径
 8         if (!file.getParentFile().exists()) {        // 文件不存在
 9             file.getParentFile().mkdirs() ;         // 建立父目次
10         }
11         OutputStream output = new FileOutputStream(file) ; // 2、经由过程子类实例化
12         String str = "www.mldn.cn" ; // 要输出的文件内容
13         output.write(str.getBytes()); // 3、将字符串变成字节数组并输出
14         output.close(); // 4、封闭资本
15     }
16 }
JavaAPIDemo

本顺序是采纳了最为规范的情势完成了输出的操纵处置惩罚,并且在团体的处置惩罚当中,只是建立了文件的父目次,然则并没有建立文件,而在实行后会发明文件能够自动协助用户建立。别的须要提示的是,因为OutputStream子类也属于AutoCloseable接口子类,所以关于close()要领也能够简化运用。

类型:自动封闭处置惩罚

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 public class JavaAPIDemo {
 6     public static void main(String[] args) throws Exception {
 7         File file = new File("D:" + File.separator + "hello" + File.separator + "pluto.txt"); // 1、指定要操纵的文件的途径
 8         if (!file.getParentFile().exists()) { // 文件不存在
 9             file.getParentFile().mkdirs(); // 建立父目次
10         }
11         try (OutputStream output = new FileOutputStream(file, true)) {//true示意追加数据
12             String str = "www.cnblogs.com\r\n"; // 要输出的文件内容
13             output.write(str.getBytes()); // 3、将字符串变成字节数组并输出
14         } catch (IOException e) {
15             e.printStackTrace(); 
16         }
17     }
18 }
JavaAPIDemo

是不是运用自动的封闭取决于项目的团体构造,别的还须要提示的是,悉数的顺序内里终究是输出了一组的字节数据,然则万万不要忘记了,OutputStream类当中定义的输出要领一共有三个。

 

2. 字节输入流:InputStream

与OutputStream类对应的一个流就是字节输入流,InputStream类重要完成的就是字节数据读取,该类定义以下:

public abstract class InputStream extends Object implements Closeable

  在InputStream类内里定义有以下的几个中心要领:

No

要领称号

类型

形貌

01

public abstract int read​()

throws IOException

平常

读取单个字节数据,假如如今已读取究竟,则返回-1

02

public int read​(byte[] b) throws IOException

平常

读取一组字节数据,返回的是读取的个数,假如没有数据已读取究竟则返回-1

03

public int read​(byte[] b,int off,int len) throws IOException

平常

读取一组字节数据(只占数组的部份)

  

 

 

    InputStream类属于一个抽象类,这时候应当依托它的子类来实例化对象,假如要从文件读取肯定运用FileInputStream子类,关于子类而言只体贴父类对象实例化。

  组织要领:public FileInputStream​(File file) throws FileNotFoundException;

 

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.InputStream;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + File.separator + "mldn.txt");
 7         InputStream input = new FileInputStream(file) ;
 8         byte data [] = new byte [1024] ; // 拓荒一个缓冲区读取数据
 9         int len = input.read(data) ; // 读取数据,数据悉数保存在字节数组当中,返回读取个数,假如mldn.txt文件中的长度大于1024则只会读取到1024字节长度的信息
10         System.out.println("【" + new String(data, 0, len) + "】");
11         input.close();
12     }
13 }
JavaAPIDemo

   关于字节输入流内里最为贫苦的题目就在于:运用read()要领读取的时刻只能够以字节数组为主举行吸收。

   迥殊须要注重的是从JDK1.9最先在InputStream类内里增加了一个新的要领:public byte[] readAllBytes​() throws IOException;

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.InputStream;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + File.separator + "mldn.txt");
 7         InputStream input = new FileInputStream(file) ;
 8         byte data [] = input.readAllBytes() ; // 读取悉数数据
 9         System.out.println("【" + new String(data) + "】");
10         input.close();
11     }
12 }
JavaAPIDemo

   假如如今要读取的内容很大很大的时刻,那末这类读取直接使顺序崩溃。假如要运用只管不要凌驾10KB。

 

3. 字符输出流:Writer

   运用OutputStream字节输出流举行数据输出的时刻运用的都是字节类型的数据,而很多的状况下字符串的输出是比较轻易的,所以关于java.io包而言,在JDK1.1的时刻又推出了字符输出流:Writer,这个类的定义以下:

public abstract class Writer  extends Object implements Appendable, Closeable, Flushable

  

 

 

 

   在Writer类内里提供有很多的输出操纵要领,重点来看两个:

      ·输出字符数组:public void write​(char[] cbuf) throws IOException;

      ·输出字符串:public void write​(String str) throws IOException;

类型:运用Writer输出

 1 import java.io.File;
 2 import java.io.FileWriter;
 3 import java.io.Writer;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + File.separator + "mldn.txt");
 7         if (!file.getParentFile().exists()) {
 8             file.getParentFile().mkdirs(); // 父目次必需存在
 9         }
10         Writer out = new FileWriter(file) ; 
11         String str = "www.mldn.cn" ;
12         out.write(str); 
13         out.close();
14     }
15 }
JavaAPIDemo JavaAPIDemo

   运用Writer输出的最大上风在于能够直接应用字符串完成。Writer是字符流,字符处置惩罚的上风在于中文数据上。 

 

4. 字符输入流:Reader

 

   Reader是完成字符输入流的一种类型,其自身属于一个抽象类,这个类的定义以下:

public abstract class Reader extends Object implements Readable, Closeable

  

 

 

 

   Reader类内里并没有像Writer类一样提供有悉数字符串的输入处置惩罚操纵,只能够应用字符数据来完成吸收:

      ·吸收数据:public int read​(char[] cbuf) throws IOException;

类型:完成数据读取

 1 import java.io.File;
 2 import java.io.FileReader;
 3 import java.io.Reader;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + File.separator + "mldn.txt");
 7         if (file.exists()) {    // 文件存在则举行读取
 8             Reader in = new FileReader(file) ;
 9             char data[] = new char[1024];
10             int len = in.read(data) ;
11             System.out.println("读取内容:" + new String(data,0,len));
12             in.close();
13         }
14     }
15 }
JavaAPIDemo

字符流读取的时刻只能够根据数组的情势来完成处置惩罚操纵。

 

5. 字撙节与字符流的区分

   如今经由过程一系列的剖析已能够清晰字撙节与字符流的基础操纵了,然则关于这两类流依旧是存在有区分的,重点来剖析一下输出的处置惩罚操纵。在运用OutputStream和Writer输出的末了发明都运用了close()要领举行了封闭处置惩罚。

   在运用OutputStream类输出的时刻假如没有运用close()要领封闭输出流发明内容依旧能够完成平常的输出,然则假如在运用Writer的时刻没有运用close()要领封闭输出流,那末这个时刻内容将没法举行输出,因为Writer运用到了缓冲区,当运用了close()要领的时刻现实上会出现有强迫革新缓冲区的状况,所以这个时刻会将内容举行输出,假如没有封闭,那末将没法举行输出操纵,所以此时假如在不封闭的状况下要想将悉数的内容输出能够运用flush()要领强迫清空。 

类型:运用Writer并强迫性清空

 1 import java.io.File;
 2 import java.io.FileWriter;
 3 import java.io.Writer;
 4 public class JavaAPIDemo {
 5     public static void main(String[] args) throws Exception {
 6         File file = new File("D:" + File.separator + "hello" + File.separator + "mldn.txt");
 7         if (!file.getParentFile().exists()) {
 8             file.getParentFile().mkdirs(); // 父目次必需存在
 9         }
10         Writer out = new FileWriter(file) ; 
11         String str = "www.mldn.cn" ;
12         out.write(str); 
13         out.flush();  // 强迫性革新
14     }
15 }
JavaAPIDemo

 

题目:能够修正代码使out.flush()存在和不存在的区分?检察这两者有什么区分?

注重:以上例子中的out流不能够封闭,否则会自动flush()便达不到我们想要的效果

   字撙节在举行处置惩罚的时刻并不会运用到缓冲区,而字符流会运用到缓冲区。别的运用缓冲区的字符流越发适合于举行中文数据的处置惩罚,所以在往后的顺序拓荒当中,假如要涉及到包括有中文信息的输出平常都邑运用字符流处置惩罚,然则从别的一方面来说,字撙节和字符流的基础处置惩罚情势是类似的,因为IO很多状况下都是举行数据的传输运用(二进制)所以本次的解说将以字撙节为主。

 

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Java IO编程——字符流与字撙节

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282097.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>