javase--5流

一、分类

1.数据单位:字节流和字符流,一个字符有两个字节,字节流是最原始的

2.功能:节点流和处理流,前者是对数据源的处理,即对数据进行处理的流,后者是对流的处理,即对节点流处理的流。

3.方向:输入流和输出流,以程序为参考

二、常用流

在读或写时,可能对一个数组的内存大小进行操作,从而减少对硬盘的访问频率,即缓冲,所以需要在close( ),之前进行flush( )

1.FileInputStream

import java.io.*;


public class TestFileInputStream {
public static void main(String args[]) {
int b = 0;
FileInputStream in = null;
try {
in = new FileInputStream("f:/javaproject/TestFileInputStream.java");

} catch(FileNotFoundException ex) {
System.out.println("找不到指定的文件");
System.exit(-1);
}

try {
long num = 0;
while((b = in.read()) != -1) {
System.out.print((char)b);
num ++;
}
in.close();
System.out.println("共读取了"+num+"个字节");
} catch(IOException ex) {
System.out.println("读取文件错误");
System.exit(-1);
}
}
}

2.FileOutputStream

import java.io.*;


public class TestFileOutputStream {
public static void main(String args[]) {
int b = 0;
try {
FileInputStream in = new FileInputStream("f:/javaproject/HelloJava.java");
FileOutputStream out = new FileOutputStream("f:/javaproject/io.java");
while((b = in.read()) != -1) {
out.write((char)b);
}
in.close();
out.close();
}catch(FileNotFoundException e1) {
System.out.println("未找到指定的文件");System.exit(-1);
}catch(IOException e2) {
System.out.println("文件复制错误"); System.exit(-1);
}
System.out.println("成功复制文件");
}
}

3.FileReader

import java.io.*;


public class TestFileReader {
public static void main(String args[]) {
int b = 0;
int num = 0;
try {
FileReader fr = new FileReader("f:/javaproject/TestFileReader.java");
while((b = fr.read()) != -1) {
System.out.print((char)b);
num ++;
}
fr.close();
} catch(FileNotFoundException ex) {
System.out.println("未找到指定文件"); System.exit(-1);
} catch(IOException ex) {
System.out.println("文件读取错误"); System.exit(-1);
}
System.out.println("共" +num+"字符");
}
}

4.FileWriter

import java.io.*;


public class TestFileWriter {
public static void main(String args[]) {
try {
FileWriter fw = new FileWriter("f:/javaproject/io2.bat");
for(int c=0; c<50000; c++) {
fw.write(c);
}
fw.close();
} catch(IOException ex) {
System.out.println("文件写入错误"); System.exit(-1);
}
}
}

三、BufferedStream缓冲流

缓冲流可以减少对硬盘的读写,从而减少对硬盘的破坏。

1.BufferedInputStream

import java.io.*;


public class TestBufferStream {
public static void main(String args[]) {
int c = 0;
try {
FileInputStream fin = new FileInputStream("f:/javaproject/HelloJava.java");
BufferedInputStream bis = new BufferedInputStream(fin);
System.out.println(bis.read());
System.out.println(bis.read());
bis.mark(100);//进行标记定位
for(int i=0; i<=10 && (c=bis.read()) != -1; i++) {
System.out.print((char)c);
}
System.out.println();
bis.reset(); //返回到标记处
for(int i=0; i<=10 && (c=bis.read())!=-1; i++) {
System.out.print((char)c);
}
bis.close();
fin.close();
} catch(IOException ex) {
ex.printStackTrace();
}

}
}

2.BufferedWriter

import java.io.*;


public class TestBufferStream2 {
public static void main(String args[]) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("f:/javaproject/iow.txt"));
BufferedReader br = new BufferedReader(new FileReader("f:/javaproject/iow.txt"));
String s = null;
for(int i=0; i<100; i++) {
s = String.valueOf(Math.random());
bw.write(s);
bw.newLine(); //文件中进行换行
}
bw.flush(); //写入的进行打入,这个必须有!!!!
while((s=br.readLine()) != null) {//读一行内容,该方法特别有用!
System.out.println(s);
}
bw.close();
br.close();
} catch(IOException ex) {
ex.printStackTrace();
}

}
}

四、将字节流转换为字符流:转换流

import java.io.*;


public class TestTransForm1 {
public static void main(String args[]) {
try {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("f:/javaproject/io2.txt"));
osw.write("afagaegearg");
System.out.println(osw.getEncoding());
osw.close();
osw = new OutputStreamWriter(new FileOutputStream("f:/javaproject/io2.txt",true),"ISO8859_1");//这种构造语句中,true设定可在原内容上写入,默//认为false

osw.write("afagaegearg");
System.out.println(osw.getEncoding());
osw.close();
} catch(IOException ex) {
ex.printStackTrace();
}
}
}

import java.io.*;


public class TestTransForm2 {
public static void main(String args[]) {
InputStreamReader isr = new InputStreamReader(System.in);//System.in为系统的输入
BufferedReader br = new BufferedReader(isr);
String s = null;
try {
s = br.readLine();
while(s != null) {
if(s.equalsIgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
s = br.readLine();
}
br.close();
} catch(IOException ex) {
ex.printStackTrace();
}
}
}

五、数据流DataStream

直接存入基本数据类型,也可存UTF-8(省空间)

import java.io.*;


public class TestDataStream {
public static void main(String args[]) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();//内存中开辟字节数组,有管道连接
DataOutputStream dos = new DataOutputStream(baos);//在该管道上附加数据流
try {
dos.writeDouble(Math.random());//写入Double数
dos.writeBoolean(true);//写入Boolean数
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());//toByteArray( )得到该字符数组,
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.available());//得到内存大小
System.out.println(dis.readDouble());//先进先出的读出
System.out.println(dis.readBoolean());
dos.close(); dis.close();
} catch(IOException ex) {
ex.printStackTrace();
}
}
}

六、print流

1.PrintWriter和PrintStream都是输出流,分别为字符和字节。

2.都重载了print( )

3.不会抛出异常,用户通过检验错误信息获得错误。

4.可以自动刷新。

5.

import java.io.*;


public class TestPrintStream1 {
public static void main(String args[]) {
try {
FileOutputStream fos = new FileOutputStream("f:/javaproject/log.bat");
PrintStream ps = new PrintStream(fos);
if(ps != null) {
System.setOut(ps);//默认的输出是控制台,现在设定输出为某个输出print流
}
int count = 0;
for(char i=0; i<=60000; i++) {
System.out.print(i+" ");
if(count++ >= 100) {
System.out.println(); count = 0;
}
}
}catch(IOException ex) {
ex.printStackTrace();
}
}
}

6.

import java.io.*;


public class TestPrintStream2 {
public static void main(String args[]) {
String s1 = args[0];
list l = new list(s1,System.out);
}
}
class list {
list(String s1,PrintStream ps) {
try {
BufferedReader br = new BufferedReader(new FileReader(s1));
String line = br.readLine();
while(line != null) {
ps.print(line);
ps.println();
line = br.readLine();
}
br.close();
}catch(IOException ex) {
ex.printStackTrace();
}
}
}

7.相当于日志记录

import java.io.*;
import java.util.Date;


public class TestPrintStream3 {
public static void main(String args[]) {
String s = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter("f:/javaproject/logfile.log",true));
while((s=br.readLine()) != null) {
if(s.equalsIgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
pw.println("------------");
pw.println(s);
pw.flush();
}
pw.println("====="+new Date()+"=====");
pw.flush();
pw.close();
} catch(IOException ex) {
ex.printStackTrace();
}
}
}

七、Object流:直接将Object读出或写入

写入的包括该Object的版本号等的一系列信息

1.Serializable序列化,将Object读到硬盘上的Object都实现了该接口,且该接口无方法需要重写

例:

import java.io.*;


public class TestObjectIO {
public static void main(String args[]) {
T t = new T();
t.j = 10;
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:/javaproject/oosio.bat"));
oos.writeObject(t);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:/javaproject/oosio.bat"));
T t1 = (T)ois.readObject();
if(t1 != null) {
System.out.println(t1.i+" "+t1.j+" "+t1.k+" "+t1.f);
}
else 
System.out.println("fail");
ois.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
class T implements Serializable {
int i = 0; 
int j = 1;
double k = 2.0;
int f = 3;
}

2.transient关键字,指定类的属性为透明,即该属性在序列化时不予考虑,所以不存入硬盘

3.Externalizable接口,是Serializable的子类,控制java是如何实现序列化的。

猜你喜欢

转载自blog.csdn.net/hx_uestc/article/details/7218509