JAVA学习笔记之IO详解一

来源:互联网 发布:extjs表单设计器源码 编辑:程序博客网 时间:2024/05/21 22:50

1.相关概念

  1.1 IO流的分类

  根据处理数据类型的不同分为:字符流和字节流。

  根据数据流向不同分为:输入流和输出流。

  字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

  结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

 1.2 IO流整体结构图

  

2.字节流

  2.1 FileInputStream, FileOutputStream

 例子:读取一个文本数据,并将数据写入另一个文档中。

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作 * FileInputStream,FileOutputStream */public class lesson1 {  public static void main(String args[]) throws IOException{    // FileInputStream,FileOutputStream  FileInputStream fin = new FileInputStream(new File("text.txt"));  FileOutputStream fout = new FileOutputStream(new File("text1.txt"));       int bytes = fin.available();  System.out.println("当前可用于读入的字节数量"+bytes);  byte[] data = new byte[bytes];  if(bytes > 0){  fin.read(data);  }  fout.write(data);  fin.close();  fout.close();  }}
  2.2 ByteArrayInputStream,ByteArrayOutputStream

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;/* * 基于字节的I/O操作:ByteArrayInputStream,ByteArrayOutputStream * ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节. * ByteArrayOutputStream输出的数据写入一个 byte数组缓冲区,缓冲区会随着数据的不断写入而自动增长,可使用 toByteArray()获取数据。 * 关闭 ByteArrayInputStream,ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException. */public class lesson4 {  public static void main(String args[]) throws IOException{  /*   * 我们接收数据时,当不清楚数据的具体大小,可以利用ByteArrayOutputStream缓存区自动增长的特性收集所有数据   */  ByteArrayOutputStream bout = new ByteArrayOutputStream();  int c1, c2;      while((c1 = System.in.read()) != -1) {      bout.write(c1);       }      byte[] b = bout.toByteArray();      for(int i= 0 ; i < b.length; i++) {         // 打印字符         System.out.print((char)b[i]  + " ");      }      System.out.println(" ");            ByteArrayInputStream bin = new ByteArrayInputStream(b);      while((c2 = bin.read()) != -1){      System.out.println(Character.toUpperCase((char)c2));      }      bin.reset();  }}
 2.3 ObjectInputStream, ObjectOutputStream

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/* * 基于字节的I/O操作: ObjectInputStream, ObjectOutputStream * ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream. * ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. * ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以使对象的持久存储. * 只有支持 java.io.Serializable 或 java.io.Externalizable接口的对象才能从流读取 */public class lesson5 {  public static void main(String args[]) throws IOException, ClassNotFoundException{  FileOutputStream fout = new FileOutputStream("test.txt");      ObjectOutputStream objout = new ObjectOutputStream(fout);      objout.writeObject(new Student("小明","男",10));      objout.close();            FileInputStream fin = new FileInputStream("test.txt");      ObjectInputStream objin = new ObjectInputStream(fin);      Student st = (Student)objin.readObject();      System.out.println(st.toString());  }}class Student implements Serializable{private String name;private String sex;private int age;public Student(){this.name="";this.sex="";this.age=0;}public Student(String name, String sex, int age){this.age = age;this.name = name;this.sex = sex;}    @Override    public String toString() {    // TODO Auto-generated method stub    return "学生姓名:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex;    }}
2.4 DataInputStream,DataOutputStream

import java.io.DataInputStream;import java.io.DataOutputStream ;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作: DataInputStream, DataOutputStream */public class lesson6 {  public static void main(String args[]) throws IOException{  FileOutputStream fout = new FileOutputStream("test1.txt",true);  DataOutputStream dout = new DataOutputStream(fout);  dout.writeUTF("中国");  dout.flush();  dout.close();    FileInputStream fin = new FileInputStream("test1.txt");  DataInputStream din = new DataInputStream(fin);  String str = din.readUTF();  din.close();  System.out.println(str);    }}
2.5  BufferedInputStream,BufferedOutputStream

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作: BufferedInputStream, BufferedOutputStream * BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力 */public class lesson7 {  public static void main(String args[]) throws IOException {  FileOutputStream fout = new FileOutputStream("test.txt",true);  BufferedOutputStream bout = new BufferedOutputStream(fout,1024);  DataOutputStream dout = new DataOutputStream(bout);  dout.writeUTF("你好啊!");  dout.flush();  dout.close();    FileInputStream fin = new FileInputStream("test.txt");  BufferedInputStream bin = new BufferedInputStream(fin);  DataInputStream din = new DataInputStream(bin);  String str = din.readUTF();  System.out.println(str);  din.close();   }}

2.6 PrintStream

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;/** * 基于字节的I/O操作: PrintStream * PrintStream 方便其他输出流打印各种数据值表示形式, PrintStream 永远不会抛出 IOException. */public class lesson8 {  public static void main(String args[]){  try {FileInputStream fin = new FileInputStream(new File("test.txt"));BufferedInputStream bin = new BufferedInputStream(fin, 1024);FileOutputStream fout = new FileOutputStream(new File("test1.txt"), true);BufferedOutputStream bout = new BufferedOutputStream(fout);PrintStream ps = new PrintStream(bout, true);byte[] b = new byte[80]; //如果分配的空间过大,则输出为空格int c;while((c = bin.read(b)) != -1) {ps.write(b, 0 , b.length);    }ps.print("***接后面");bin.close();ps.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}  }}

3 字符流

 3.1 InputStreamReader, OutputStreamWriter

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/** * 基于字符的I/O操作: InputStreamReader, OutputStreamWriter * 字节流流向字符流的桥梁 */public class lesson9 {  public static void main(String args[]) throws IOException {  FileInputStream fin = new FileInputStream(new File("test.txt"));  InputStreamReader inr = new InputStreamReader(fin);  if(inr.ready()){  int cv = inr.read();  System.out.println((char)cv);  }  char[] ca = new char[100];  inr.read(ca);  System.out.print(ca);  inr.close();    FileOutputStream fout = new FileOutputStream("new.txt", true);  OutputStreamWriter opt = new OutputStreamWriter(fout);  opt.write("你好啊啊啊");  opt.write("####");  opt.flush();  opt.close();  }}
3.2 FileReader, FileWriter

import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 基于字符的I/O操作: FileReader, FileWriter * FileReader用来读取字符文件, FileWriter用来写入字符文件 * 默认字符编码和默认字节缓冲区大小都是适当的.要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader.  */public class lesson10 {  public static void main(String args[]) throws IOException{  FileReader fread = new FileReader(new File("new.txt"));  char[] buf = new char[100];  if(fread.ready()){  fread.read(buf);  }  System.out.println(buf);  fread.close();    FileWriter fout = new FileWriter("new1.txt", true);  fout.write("hello world");  fout.flush();  fout.close();  }}

3.3  BufferedReader, BufferedWriter

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 基于字符的I/O操作: BufferedReader, BufferedWriter * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。  * 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入 */public class lesson11 {   public static void main(String args[]) throws IOException {   BufferedReader bin = new BufferedReader(new FileReader("new.txt"));   char[] buf = new char[50];       if(bin.ready()){       bin.read(buf);       }       System.out.print(buf);       bin.close();              BufferedWriter bout = new BufferedWriter(new FileWriter("new1.txt"));       bout.write("从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取");       bout.flush();       bout.close();   }}








0 0
原创粉丝点击