分享

JAVA的IO输入输出流操作手册-3

 昵称20643483 2023-08-31 发布于江西

Java的输入输出流操作手册

 

1    IO API

1.1   类文件

字符流

输入流

FileReader

BufferedReader

输出流

FileWriter

BufferedWriter

PrintWriter

字节流

输入流

FileInputStream    BufferedInputStream  DataInputStream

输出流

FileOutputStream  BufferedOutputStream  PrintStream

DataOutputStream

字符字节通用流

输入流

InputStreamReader

输出流

OutputStreamWriter

在数据流操作过程中通过缓冲区能大大提高I/O性能,采用数据缓冲区只需将输入与输出流用Buffered*封装一次即可

1.2   类说明

FileOutputStream      用于写入诸如图像、文件数据之类的原始字节的流

FileInputStream         用于读取诸如图像、文件数据之类的原始字节流

DataOutputStream     写入java基本类型数据字节流(也可写入文件数据),readUTF方法用于读取用 UTF-8 修改版格式编码的字节流

DataInputStream       读写由DataOutputStream写入的java的基本类型的方法,如readInt,readLongwriteUTF方法采用平台无关方式UTF-8 修改版编码写入字节流

Buffered*                  能够在内存里建立一个缓冲数据区,当写文件的时候,能起到缓冲的作 

用,并且可以自定缓冲区大小,BufferedOutputStream(OutputStream out, int size)

InputStreamReader   是从字节流到字符流的桥梁:它读入字节,并根据指定字符编码方式,

将之转换为字符流显示。使用的编码方式可能由名称指定,如

InputStreamReader(InputStream in, String charsetName)charsetName就是用于指定字符编码方式的

OutputStreamWriter   字符流通向字节流的桥梁:使用指定的编码方式将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集

OutputStreamWriter  (OutputStream out, String charsetName)

charsetName用于指定字符编码方式的,不指定则接受平台默认字符集

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形        

式。与其他输出流不同,PrintStream 不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自 动刷新,可以创建一个 PrintStream;这意味着可在写入字节数组之后自动调用 flush 方法。PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用

PrintWriter 类。

PrintWriter                 将格式化对象打印到一个文本的输出流此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用checkError() 是否出现错误

2    字节流与字符流

在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

2.1   Java字符流

1、一个字符一个字符的读取或写入

2、一个字符可以是1个字节,可以是2个或多个字节;但java字符流处理的单元为2个字

节的Unicode字符

3java字符流分别操作字符、字符数组或字符串

2.2   Java字节流

1、一个字节一个子节的读取或写入

2Java字节流处理单元为1个字节

3Java操作字节和字节数组

4、字节流是最基本的,所有的InputStremOutputStream的子类都是,主要用在处理二进制数据。

5、由于中文最少占二个字节,如果此时只读一个字节显然中文显示失败,此时提出了字符流的概念,它是按虚拟机的编码来处理,也就是要进行字符集的转化。

2.3   字节流与字符流转换

1字节流字符流之间通过 InputStreamReaderOutputStreamWriter来关联,实际上是通过byte[]String的关联。

2、字节流转向字符流实际上如public String(byte bytes[]String charsetName)

3、字符流转向字节流采用String.getBytes()

3    输入流操作(从文件读取)

3.1   一次性读取所有内容

FileInputStream input = new FileInputStream("d://test.java");                                 

int total = input.available();                             //返回test.java文件中字节的总长度

byte[] readInfo = new byte[total];                  //定义文件总长度相同大小的数组去存放数据

input.read(readInfo);                                      //读取文件并存入数组readInfo

String export = new String(readInfo);            //将数组信息字符串化

input.close();

3.2   逐行读取内容

readLine行读取(采用BufferedReader封装)

FileReader read = new  FileReader(new File("f://test.txt"));

BufferedReader bf = new BufferedReader(read);//封装

String s = bf.readLine();//读文件信息一行

while(s != null){//如果读到为空说明读结输入流完毕

         .......

                          s = bf.readLine();//继续读取下一行

  }

3.3   读取输入信息

1、read[byte[] b]数组

参看当前目录下《IO测试Demo.java》示例。示例包括用byte进行读、存

包含一次性读取所有内容、一次性存储所有内容到文件

3系统输入的信息读取(主要部分代码)

  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))

  String stringReader = null;

  stringReader = reader.readLine().trim();//trim()用于转换成大写

4    输出流操作(输出到文件)

4.1   存储指定字符内容到指定文件

String export = "......";

File file = new File("d:\\DownloadCert.log");

FileOutputStream output = new FileOutputStream(file );     

output.write(export.getBytes());        

output.close();

注:

4.2   逐行读取指定文件存储至另一文件

//输入流

FileReader read = new  FileReader(new File("f:\\" + "test.txt"));

BufferedReader bf = new BufferedReader(read);

//输出流1,方法一

File file = new File("d:\\" + "DownloadCert.log");

FileOutputStream fileWriter = new FileOutputStream(file,true);

String s = bf.readLine();//读文件信息一行

while(s != null){//如果读到为空说明读结输入流完毕

s= s + "\n";//将读到的信息组合起来并插入分行符

fileWriter.write(s.getBytes());

s = bf.readLine();//继续读取下一行

}

//输出流2,方法二

File file = new File("d:\\" + "DownloadCert.log");

FileWriter f = new FileWriter(file );

//FileWriter f = new FileWriter(file,true );

PrintWriter p = new PrintWriter(f);

String s = bf.readLine();//读文件信息一行

while(s != null){           //如果读到为空说明读结输入流完毕

p.println();          //增加分行

 p.write(s);

 s = bf.readLine();//继续读取下一行

}

4.3   限制每次读取长度读取指定文件至另一文件

/* 边读边存文件,如果文件或数据过大则采用字节限制读、存 */     

FileInputStream input_1 = new FileInputStream("d://Base64.java");

FileOutputStream output_1 = new FileOutputStream("d://temp_1.txt");     

byte b[] = new byte[400];       //定义长度为400的字节数组,每次只读400字节

int rs = 0;

while(rs != -1){

            int size = input_1.available();  //起初为文件总长度,随着每read一次长度自动减少一些

      /如果文件或数据小于400长度

      if(size<b.length){

          byte[] end = new byte[size];

          rs = input_1.read(end);

          System.out.println("读取到" + rs + "字符");

          output_1.write(end);

          rs = -1; //读、存结束,设置-1去终止循环

       }else{

//如果文件或数据大于400长度

            rs = input_1.read(b);               //从文件中读取出400字符存入数组b

            System.out.println("读取到" + rs + "字符");

            output_1.write(b);                   //将长度为400的数组b写到另一文件

            }

      }

            input_1.close();

            output_1.close();                                

4.4   读取网页数据到文件中

URL urlAdress = null;

BufferedReader buffReader = null; //输入流

PrintWriter export = null; //输出流

try {

urlAdress = new URL("一个指数网址");

} catch (MalformedURLException e) {//捕捉URL不存在}

try {

            //打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream

            InputStream inputStream = urlAdress.openStream();

            InputStreamReader inputReader = new InputStreamReader(inputStream);

            buffReader = new BufferedReader(inputReader);

      //接下来BufferedReader可以逐行读取了

            /*通过BufferedWriter中转指定目标文件

            *FileWriter outFile = new FileWriter("d:/temp.html"); //输出流目标文件

            *BufferedWriter buffWriter = new BufferedWriter(outFile); //接受FileWriter类型参数

            *export = new PrintWriter(buffWriter);

            */

            export = new PrintWriter("d:/temp.html"); //构造参数中直接指定目标文件

            /*输入输出流操作 */

            String strHtml = buffReader.readLine(); //读取一行

            while (strHtml != null) { //如果读取到信息则执行此块

                        export.println(strHtml); //存储一行

                        strHtml = buffReader.readLine(); //重新读取下一行                                              

            }                                 

                        }catch (IOException e) {

}finally {

                        try {

                                    if (buffReader != null)

                                    buffReader.close();

                                    if (export != null)

                                                export.close();

                                    } catch (Exception e) {}

}

5    System的输入/输出流

常量:

public static final InputStream in

标准输入流。 该流已打开并且准备接受输入数据。 典型情况是该流同键盘输入或主机环境或用户指定的另一个输入源相联系。

public static final PrintStream out

标准输出流。 该流已打开并且准备接受输出数据。 典型情况是该流同显示输出或由主机环境或用户指定的另一个输出目标相联系。

 

public static final PrintStream err

标准错误输出流。 该流已打开并且准备接受输出数据。典型情况是该流同显示输出或由主机环境或用户指定的另一个输出目标相联系。通过约定,该输出流用来显示出错信息或其它应立即引起用户注意的信息,即使是主输出流也应该如此,变量 out 的值已被重定向到一个文件或其它典型的未连续监视的目标上。

常用方法

public static void setIn(InputStream in)

重新分配标准输入流。

public static void setOut(PrintStream out)

重新分配标准输出流。

public static void setErr(PrintStream err)

重新分配标准错误输出流。

注:outerr区别

1outerr都可以向控制台输出

2out具有缓冲,err无缓冲。

举例:

System.out.println(“11”);

System.err.println(…..);

If(){……代码块}

System.out.println(“22”);

System.err.println(…..);

如上情况。由于out具有缓冲,也就是当执行到System.out.println(“11”)时它可能暂时缓冲下,并不向外输出,可能等执行完If(){……代码块}后再输出。最终out都能输出,且各out输出顺序不变。

err是执行到就立即输出,作为错误提醒,并不缓冲,常用来调试代码

6    压缩文件的I/O操作

除了文件的流操作外,有时还需进行zip等压缩文件流操作。如果对压缩文件采用通用的输入/输出流操作将大大影响效率,以下介绍如何使用压缩流操作压缩文件

InputStream in = null;

try{

      in = newFileInputStream(newFile("d:\\1.zip"));

      String file = "d:\\2.zip";

      FileOutputStream toFile = newFileOutputStream(file);

      ZipOutputStream out = newZipOutputStream(toFile);

      //设置用于后续条目的默认压缩方法

      out.setMethod(ZipOutputStream.DEFLATED);

      //创建一个zip入口,ZipEntry构造方法只接受string类型参数

      ZipEntry zipentry = newZipEntry(file);

      //添加zip入口到压缩输出流

      out.putNextEntry(zipentry);

      //设定一个指定长度的字节数组。

      byte[] rgb = new byte[1000];

      while(true){

            //从输入流中将最多rgb.length个字节的数据读入rgb数组中。

            int data = in.read(rgb);

            if(data == -1){

                  break;

            }

            //rgb为要写入的数据,0为数据中的初始偏移量,data为要写入的字节数

            out.write(rgb,0,data);

      }

}catch(IOException e){...}

package com;

=============IO测试DEMO=======================

import java.io.*;

public class IOtest {

                        public static void main(String[] args){

                        IOtest test = new IOtest();

                        test.stream();

            }

            public void stream(){

                        try {

                                    /*单独读取文件,无字节限制的一次性读取 */

                                    FileInputStream input = new FileInputStream("d://test.java");                               

                                    int total = input.available();                    //返回test.java文件中字节的总长度

                                    byte[] readInfo = new byte[total];                       //定义文件总长度相同大小的数组去存放数据

                                    input.read(readInfo);                              //读取文件并存入数组readInfo中

                                    String export = new String(readInfo);     //将数组信息字符串化

                                    //System.out.println(export);

                                    input.close();

                                    /*单独存储文件,无字节限制的一次性存储 */

                                    FileOutputStream output = new FileOutputStream("d://temp.txt");                                  

                                    output.write(export.getBytes());  //使用默认平台字符集将String解码为字节序列存入文件

                                    output.close();

                                    /*边读边存文件,如果文件或数据过大则采用字节限制读、存 */         

                                    FileInputStream input_1 = new FileInputStream("d://Base64.java");

                                    FileOutputStream output_1 = new FileOutputStream("d://temp_1.txt");    

                                    byte b[] = new byte[400];           //定义长度为400的字节数组

                                    int rs = 0;

                                    while(rs != -1){

                                    int size = input_1.available();       //起初为文件总长度,随着每read一次长度自动减少一些

                //如果文件或数据小于400长度

                if(size<b.length){

                            byte[] end = new byte[size];

                    rs = input_1.read(end);

                    System.out.println("读取到" + rs + "字符");

                    output_1.write(end);

                    rs = -1; //读、存结束,设置-1去终止循环

                }

                //如果文件或数据大于400长度

                else{

                            rs = input_1.read(b);                  //从文件中读取出400字符存入数组b中

                            System.out.println("读取到" + rs + "字符");

                            output_1.write(b);                                  //将长度为400的数组b写到文件

                }

            }

                                    input_1.close();

                                    output_1.close();

                        } catch (IOException e) {

                                    e.printStackTrace();

                        }

            }

}

===========读取网页内容=====================

package com;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.MalformedURLException;

import java.net.URL;

//网页数据采据

public class URLtest {

            public static void main(String[] args) {

                        URLtest test = new URLtest();

                        test.store();

            }

            public void store() {

                        URL urlAdress = null;

                        BufferedReader buffReader = null; //输入流

                        PrintWriter export = null; //输出流

                        try {

                                    urlAdress = new URL("一个网址");

                        } catch (MalformedURLException e) {

                                    //捕捉URL不存在

                        }

                        try {

                                    //打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream

                                    InputStream inputStream = urlAdress.openStream();

                                    InputStreamReader inputReader = new InputStreamReader(inputStream);

                                    buffReader = new BufferedReader(inputReader);

                                    /*通过BufferedWriter中转指定目标文件

                                    FileWriter outFile = new FileWriter("d:/temp.html"); //输出流目标文件

                                    BufferedWriter buffWriter = new BufferedWriter(outFile); //只接受FileWriter类型构造参数

                                    export = new PrintWriter(buffWriter);

                                    */

                                    export = new PrintWriter("d:/temp.html"); //构造参数中直接指定目标文件

                                    /*输入输出流操作 */

                                    String strHtml = buffReader.readLine(); //读取一行

                                    while (strHtml != null) { //如果读取到信息则执行此块

                                                export.println(strHtml); //存储一行

                                                strHtml = buffReader.readLine(); //重新读取下一行                                               

                                    }                                  

                        }catch (IOException e) {

                        }

                        finally {

                                    try {

                                                if (buffReader != null)

                                                            buffReader.close();

                                                if (export != null)

                                                            export.close();

                                    } catch (Exception e) {

                                    }

                        }//end finally

            }

}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多