Java的输入输出流操作手册
1 IO API1.1 类文件
在数据流操作过程中通过缓冲区能大大提高I/O性能,采用数据缓冲区只需将输入与输出流用Buffered*封装一次即可 1.2 类说明FileOutputStream 用于写入诸如图像、文件数据之类的原始字节的流 FileInputStream 用于读取诸如图像、文件数据之类的原始字节流 DataOutputStream 写入java基本类型数据字节流(也可写入文件数据),readUTF方法用于读取用 UTF-8 修改版格式编码的字节流 DataInputStream 读写由DataOutputStream写入的java的基本类型的方法,如readInt,readLong,writeUTF方法采用平台无关方式的UTF-8 修改版编码写入字节流 Buffered* 能够在内存里建立一个缓冲数据区,当写文件的时候,能起到缓冲的作 用,并且可以自定缓冲区大小,BufferedOutputStream(OutputStream out, int size) InputStreamReader 是从字节流到字符流的桥梁:它读入字节,并根据指定字符编码方式, 将之转换为字符流显示。使用的编码方式可能由名称指定,如
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的
charsetName用于指定字符编码方式的,不指定则接受平台默认字符集
式。与其他输出流不同,
PrintWriter 将格式化对象打印到一个文本的输出流。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用checkError() 是否出现错误 2 字节流与字符流在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的 2.1 Java字符流1、一个字符一个字符的读取或写入 2、一个字符可以是1个字节,可以是2个或多个字节;但java字符流处理的单元为2个字 节的Unicode字符 3、java字符流分别操作字符、字符数组或字符串 2.2 Java字节流1、一个字节一个子节的读取或写入 2、Java字节流处理单元为1个字节 3、Java操作字节和字节数组 4、字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据。 5、由于中文最少占二个字节,如果此时只读一个字节显然中文显示失败,此时提出了字符流的概念,它是按虚拟机的编码来处理,也就是要进行字符集的转化。 2.3 字节流与字符流转换1、字节流与字符流之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过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) 重新分配“标准”错误输出流。 注:out与err区别 1、out与err都可以向控制台输出 2、out具有缓冲,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 } } |
|
来自: 昵称20643483 > 《IT技术》