----------------------Android培训、Java培训、期待与您交流! ----------------------
1 字符打印流
打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:PrintStream
构造函数可以接收的参数类型:file对象(File)、字符串路径(String)
字符打印流:PrintWriter
代码示例:
import java.io.*;
class PrintStreamDemo
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
//out.flush();
}
out.close();
bufr.close();
}
}
-----------------------------分割线-----------------------------
2 操作字节数组的流ByteArrayStream
ByteArrayInputStream:用于操作字节数组的流对象,在构造的时候,需要接收数据源,而且数据源是一个字节数组。
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数据目的地。
注意:因为这两个流对象都操作的数组,并没有使用系统资源。所以,不用进行close关闭。
在流操作规律讲解时:
源设备,键盘 System.in,硬盘 FileStream,内存 ArrayStream。
目的设备:控制台 System.out,硬盘FileStream,内存 ArrayStream。
代码示例:
import java.io.*;
class ByteArrayStream
{
public static void main(String[] args)
{
//数据源。
ByteArrayInputStream bis = new ByteArrayInputStream("ABCDEFD".getBytes());
//数据目的
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int by = 0;
while((by=bis.read())!=-1)
{
bos.write(by);
}
System.out.println(bos.size());
System.out.println(bos.toString());
//bos.writeTo(new FileOutputStream("a.txt"));
}
}
-----------------------------分割线-----------------------------
3 操作基本数据类型的流DataStream
这里要用到DataInputStream与DataOutputStream两个对象。
代码示例:
import java.io.*;
class DataStreamDemo
{
public static void main(String[] args) throws IOException
{
//writeData();
//readData();
//writeUTFDemo();
//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");
//osw.write("你好");
//osw.close();
//readUTFDemo();
}
public static void readUTFDemo()throws IOException
{
DataInputStream dis = new DataInputStream(new FileInputStream("utf.txt"));
String s = dis.readUTF();
System.out.println(s);
dis.close();
}
public static void writeUTFDemo()throws IOException
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("utfdate.txt"));
dos.writeUTF("你好");
dos.close();
}
public static void readData()throws IOException
{
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
int num = dis.readInt();
boolean b = dis.readBoolean();
double d = dis.readDouble();
System.out.println("num="+num);
System.out.println("b="+b);
System.out.println("d="+d);
dis.close();
}
public static void writeData()throws IOException
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeInt(234);
dos.writeBoolean(true);
dos.writeDouble(9887.543);
dos.close();
ObjectOutputStream oos = null;
oos.writeObject(new O());
}
}
-----------------------------分割线-----------------------------
4 操作Object对象的流ObjectStream
可以将对象的状态通过ObjectOutputStream以字节形式保存起来(对象序列化),并可以通过ObjectInputStream读取出对象的状态。
ObjectInputStream与ObjectOutputStream 应成对使用
对象序列化:
Java对象序列化就是将对象的状态转换成字节流,以后再通过在线值再生成相同状态的对象。它是对象持久化的一种实现方法,比如:(序列化)将对象存到硬盘文件中,用的时候再从文件读出来重建对象(反序列化)。
类中的静态属性不能被序列化,非静态属性若加上修饰符transient,也可以不被序列化。
注意:被序列化的对象应当实现Serializable接口(起标签作用)。
代码示例:
import java.io.*;
class ObjectStreamDemo
{
public static void main(String[] args) throws Exception
{
//writeObj();
readObj();
}
public static void readObj()throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
}
public static void writeObj()throws IOException
{
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(new Person("lisi0",399,"kr"));
oos.close();
}
}
-----------------------------分割线-----------------------------
5 序列流SequenceInputStream
特点:对多个流进行合并
代码示例:
import java.io.*;
import java.util.*;
class SequenceDemo
{
public static void main(String[] args) throws IOException
{
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("c:\\1.txt"));
v.add(new FileInputStream("c:\\2.txt"));
v.add(new FileInputStream("c:\\3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("c:\\4.txt");
byte[] buf = new byte[1024];
int len =0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
-----------------------------分割线-----------------------------
6 管道流 PipedStream
这里用到PipedInputStream和PipedOutputStream两个对象。
输入输出可以直接进行连接,通过结合线程使用
注意:它是在IO流中涉及到多线程的流对象。(IO流+集合=Properties)(IO流+多线程=管道流)
import java.io.*;
class Read implements Runnable {
private PipedInputStream in;
Read(PipedInputStream in) {
this.in = in;
}
public void run() {
try {
byte[] buf = new byte[1024];
System.out.println("读取前。。没有数据阻塞");
int len = in.read(buf);
System.out.println("读到数据。。阻塞结束");
String s = new String(buf, 0, len);
System.out.println(s);
in.close();
} catch (IOException e) {
throw new RuntimeException("管道读取流失败");
}
}
}
class Write implements Runnable {
private PipedOutputStream out;
Write(PipedOutputStream out) {
this.out = out;
}
public void run() {
try {
System.out.println("开始写入数据,等待6秒后。");
Thread.sleep(6000);
out.write("piped lai la".getBytes());
out.close();
} catch (Exception e) {
throw new RuntimeException("管道输出流失败");
}
}
}
class PipedStreamDemo {
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
Read r = new Read(in);
Write w = new Write(out);
new Thread(r).start();
new Thread(w).start();
}
}
-----------------------------分割线-----------------------------
7 RandomAccessFile
这类不算是IO体系中的子类。而是直接集成自Object,但是它是IO包中成员,因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。
其实它完成读写的原理是内部封装了字节输入流和输出流。由构造函数可知它只操作文件。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,读写rw等。
如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。
应用:多线程下载
代码示例:
import java.io.*;
public class RandromAccessFileDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File f = new File("./Rand.txt");
writeFile2(f);
readFile(f);
}
public static void readFile(File f)throws IOException{
RandomAccessFile raf = new RandomAccessFile(f,"r");
raf.seek(8);
raf.skipBytes(8);
byte[] buf = new byte[4];
while((raf.read(buf))!=-1){
//将4个字节从raf中读出来存进buf
String name= new String(buf);
System.out.println("name="+name);
int age = raf.readInt();//就是读4个字节出来转换为Int
System.out.println("age="+age);
}
raf.close();
}
public static void writeFile(File f) throws IOException{
RandomAccessFile raf = new RandomAccessFile(f,"rw");
raf.writeBytes("lisi");
raf.writeInt(13);
raf.close();
}
public static void writeFile2(File f) throws IOException{
RandomAccessFile raf = new RandomAccessFile(f,"rw");
raf.write("lisi".getBytes());
raf.writeInt(13);
raf.write("zhao".getBytes());
raf.writeInt(18);
raf.write("wang".getBytes());//如果这里不是"wang“,而是5个字节,会报错
raf.writeInt(20);
raf.close();
}
}
-----------------------------分割线-----------------------------
8 编码解码
编码:字符串变成字节数组。 String-->byte[]; str.getBytes(charsetName);
解码:字节数组变成字符串。 byte[] -->String: new String(byte[],charsetName);
代码示例:
import java.util.*;
class EncodeDemo
{
public static void main(String[] args)throws Exception
{
String s = "哈哈";
byte[] b1 = s.getBytes("GBK");
System.out.println(Arrays.toString(b1));
String s1 = new String(b1,"utf-8");
System.out.println("s1="+s1);
//对s1进行iso8859-1编码。
byte[] b2 = s1.getBytes("utf-8");
System.out.println(Arrays.toString(b2));
String s2 = new String(b2,"gbk");
System.out.println("s2="+s2);
}
}
----------------------Android培训、Java培训、期待与您交流! ----------------------