------- android培训、java培训、期待与您交流! ----------
JAVA中IO流基础:
流(Stream),它是通过缓冲机制将数据从生产者(如键盘、磁盘文件、内存或其他设备)传送到接受该数据的消费者(如屏幕、文件或者内存等)的这一过程的抽象。
缓冲区(Buffer),流的两端都有数据缓冲区可以暂存数据,接收端可以不必每时每刻都监视流是否有数据需要接收,数据来到之后放在缓冲区内,等需要时再去读取。
而发送端也不必为每一个字节都调用发送方法,而是等集中了一定数量的数据后再一起发送,大大提高了效率。
采用的目的是为应用系统的IO操作提供与存储设备和操作系统无关的输入输出实现技术,实现以相同的方式处理数据的流动(读写)、传输(网络)等方面的问题。
IO流的结构:
1,根接口是InputStream/OutputStream。2,数据源的IO类,FileInputStream/FileOutputStream,ByteArrayInputStream/ByteArrayOutputStream等。3,装饰功能的IO类 BufferedInputStream/BufferedOutputStream,DataInputStream/DataOutputStream等,它们都是继承装饰接口FilterInputStream/FilterOutputStream。
二进制格式操作的I/O流层次:
字符流的I/O层次
File类
它是独立于系统平台的,利用其构造方法可以创建出相应的File 对象;再调用其中的方法实现对文件或者目录的各个属性及管理方面的操作。构造函数:File( String path),
File(String path, String FileName),File(File dir, String name)。File类提供了一种与OS无关的文件或者目录属性的操作,通过类File所提供的方法,可以得到文件或目录的特征描述信息——这主要包括名称、所在路经、可读性、可写性、文件的长度等。它也还具有文件的管理功能,即可以创建目录、改变文件名、删除文件、列出一个目录中所有的文件等功能。
二进制格式数据操作的基类
抽象基类InputStream/OutputStream ,它们主要提供文件数据内容操作的基本功能函数read()、write()、close()等;一般都是通过创建出其派生类对象来实现文件读写以完成指定的特殊功能。
文件操作方法
异常的捕获
由于包java.io中几乎所有的类都声明有I/O异常,因此程序应该对这些异常加以处理。
流结束的判断
方法read()的返回值为-1时;readLine()的返回值为null时。
根据所要操作的类型生成对应输入输出文件类的对象(数据源),然后根据需要的功能创建出对应的装饰类(其构造方法的参数为已创建的数据源类);调用此类的成员方法实现文件数据的读写;关闭此文件流对象。
字符流读写
(1)Reader和Writer 为提供对字符流处理的通用功能类,由于它们为抽象类。一般是应用其子类来实现具体的文件操作。
(2)InputStreamReader(InputStream in) 和OutputStreamWriter(OutputStream out) 它们可以使用指定的编码规范并基于字节流生成对应的字符流。
(3)BufferedReader(InputStreamReader isr, int size) 和 BufferedWriter(OutputStreamWriter osr, int size):为提高字符流的处理效率,可以采用缓冲机制的流实现对字符流作成批的处理,从而可以避免频繁地从物理设备中读取信息 。
过滤流--带格式的读写操作
(1)过滤流
将一个过滤流连接到另一个流上,则在从原始的流中读写数据的同时,利用过滤流可以对这些数据进行加工和格式转换处理。
(2)DataInputStream 和DataOutputStream类
它们分别为FilterInputStream和FilterOutputStream类的子类。同时DataInputStream 和DataOutputStream类由于分别实现了DataInput和DataOutput接口中定义的独立于 具体机器的带格式的读写操作。从而可以实现对Java中的不同类型的基本类型数据的读写功能。
****************************************************************************************************************************************************
练习:
1,从键盘获取数据输出
public class ReadFromKB{
public static void main(String args[]){
try{
byte bArray[]=new byte[128];
System.out.println(“请进行键盘输入:");
System.in.read(bArray);
System.out.print(“您所输入的内容为:");
System.out.println(new String(bArray, 0));
}
catch(IOException ioe){
System.out.println(ioe.toString());
}
}
}
2,向文件中写入字符串
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamDemo{
public static void main{String[] args} throws Exception{
//用File类找到文件
File f = new File("d:" + File.separator + "test.txt");
//实例化父类对象
OutputSteam out = null;
out = new FileOutputStream(f);
String str = "Hello World";
byte b [] = str.getBytes();
out.write(b);
out.close();
}
}
3 从文件中读取内容
import java.io.File;
import java.io.FileInputStream;
import java.io.IntputStream;
public class InputStream{public static void main(String[] args) throw Exception{
File f = new File("d:" + File.separator + "test.txt");
InputStream input = null;
input = new FileInputStream(f);
byte b[] = new byte[1024];
input.read(b);
input.close();
System.out.println("内容为:" + new String(b));
}
}
4 字符流向文件写入数据
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class Writer{
public static void main(String[] args) throws Exception{
File f = new File("d:" + File.separator + "test.txt");'
Writer out = null;
out = new FileWriter(f);
String str = "Hello World";
out.write(str);
out.close;
}
}
5 字符流从文件中读取内容
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class Reader{
public static void main(String[] args) throws Exception{
File f = new File("d:" + File.separator+ "test.txt");
Reader reader = null;
reader = new FileReader(f);
char c[] = new char[1024];
int len = reader.read(c);
reader.close();
System.out.println("内容为:" + new String(c,0,len));
}
}
1,对象序列化,就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或者存储。
2,如果一个类的对象想要被序列化,能必须实现java.io.Serializable接口。
import java.io.Serializable;
public class Person implements Serializable{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名" + this.name + ";年龄:" + this.age;
}
}
3,使用对象输出序列化对象的步骤,为序列化,而使用对象输入流读入对象的过程,为反序列化。
------- android培训、java培训、期待与您交流! ----------