java的基本语法(五)
自己摘录的,难免有错,请见谅!【第八章 流】
1.Java 流式输入/输出原理:
在Java程序中,对于数据的输入/输出操作以"流"(stream)方式进行;
J2SDK提供了各种各样的"流"类,用以获取不同种类的数据;程序中
通过标准的方法输入或输出数据。
输入/输出流的分类:
java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能;
可以从不同的角度对其进行分类:
按数据流的*方向*不同可以分为【输入流】和【输出流】
按处理数据*单位*不同可以分为【字节流】和【字符流】
按照*功能*不同可以分为【节点流】和【处理流】
J2 SDK 所提供的所有流类型位于包Java.io内都分别继承自以下四种抽象流类型.
*******************************************
字节流 字符流 *
输入流 InputStream Reader *
输出流 Output Writer *
*******************************************
【节点流和处理流】
[节点流]为可以从一个特定的数据源(节点)读写数据(如:文件,内存)
[处理流]是"连接"在已存在的流(节点流或处理流)之上,通过对数据的
处理为程序提供更为强大的读写功能。
InputStream:继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
OutputStream:继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8 bit)
Reader:继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16 bit)
Writer:继承自Reader的流都是用于向程序中输出数据,且数据的单位为字符(16 bit)
***************************************************************************************************
【节点流的类型:】这根管道直接读到数据源
***************************************************************************************************
类型 字符流(中文也可以读取) 字节流
File(文件) FileReader FileWriter FileInputStream FileOutputStream
Memory Array CharArrayReader CharArrayWriter ByteArrayInputStream ByteArrayOutputStream
Memory String StringReader StringWriter
Pipe(管道) PipedReader PopedWriter PipedInputStream PipedOutputStream
例如:
----------------------------------------读取字符流文件-----------------------------------------
import java.io.*;
public class TestFileReader{
public static void main(String[] args){
FileReader fr = null;
int c = 0;
try{
fr = new FileReader("D:/lianxi/io/TestFileInputStream.java");
int ln = 0;
while ((c=fr.read())!=-1){
System.out.print((char)c);
}
fr.close();
}catch(FileNotFoundException e){
System.out.println("找不到指定文件");
}catch(IOException e){
System.out.println("文件读取错误");
}
}
}
---------------------------------------复制字节流文件-------------------------------------------------
import java.io.*;
public class TestFileOutputStream{
public static void main(String[] args){
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
try{
in = new FileInputStream("D:\\lianxi\\Collection\\BasicGeneric.java");
out = new FileOutputStream("D:\\lianxi\\io\\BG.java");
while((b=in.read())!= -1){
out.write(b);
}
in.close();
out.close();
}catch (FileNotFoundException e2){
System.out.println("找不到指定文件");System.exit(-1);
}catch (IOException e1){
System.out.println("文件复制错误");System.exit(-1);
}
System.out.println("文件已复制");
}
}
--------------------------------------------读取字节流--------------------------------------------
import java.io.*;
public class TestFileInputStream{
public static void main(String[] args){
int b = 0;
FileInputStream in = null;
try{
in = new FileInputStream("D:/lianxi/io/TestFileInputStream.java");
}catch(FileNotFoundException e){
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();
System.out.println("共读取了"+num+"个字节");
}catch(IOException e1){
System.out.println("文件读取错误");
System.exit(-1);
}
}
}
***************************************************************************************************
【处理流的类型:】这根管道包了另外一个管道
***************************************************************************************************
缓冲流:缓冲流要"套接"在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新方法。
import java.io.*;
public class TestBuffered{
public static void main(String[] args){
try{
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\lianxi\\io\\dat2.txt"));
BufferedReader br = new BufferedReader(new FileReader("d:\\lianxi\\io\\dat2.txt"));
String s = null;
for(int i=1;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 e){
e.printStackTrace();
}
}
}
---------------------------------------------------------------------------------------------------
***************************************************************************************************
【转换流的类型:】
***************************************************************************************************
InputStreamReader和OutputStreamWriter 用与字节数据到字符数据之间的转换。
InputStreamReader 需要和 InputStream "套接"。
OutputStreamWriter需要和 OutputStream "套接"。
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestTransForm1{
public static void main(String[] args){
try{
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("d:\\lianxi\\io\\char.txt"));
osw.write("Mirosofttibnmsunappe8");
System.out.println(osw.getEncoding());
osw.close();
osw = new OutputStreamWriter(new FileOutputStream("d:\\lianxi\\io\\char.txt",true),"ISO8859_1");
osw.write("Mirosofttibnmsunappe0");
System.out.println(osw.getEncoding());
osw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestTransForm2{
public static void main(String[] args){
InputStreamReader isr = new InputStreamReader(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());
System.out.println(s.toLowerCase());
s = br.readLine();
}
br.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
***************************************************************************************************
【数据流的类型:】
***************************************************************************************************
数据流:DataInputStream 和 DataOutputStream 分别继承自InputStream和OutputStream
它属于处理流,需要分别"套接"在InputStream和OutputStream类型的节点流上
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestDataOutputStream{
public static void main(String[] args){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try{
dos.writeDouble(Math.random());
dos.writeBoolean(true);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
System.out.println(bais.available());
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
dos.close(); dis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
***************************************************************************************************
【打印Print流的类型:】
***************************************************************************************************
Print 流:PrintWriter 和 PrintStream 都属于输出流,分别针对于字符和字节。提供了重载的print!
Print 流不会抛异常!
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestPrint{
public static void main(String[] args){
PrintStream ps = null;
try{
FileOutputStream fos = new FileOutputStream("D:\\lianxi\\io\\log.dat");
ps = new PrintStream(fos);
}catch(IOException e){
e.printStackTrace();
}
if(ps != null){
System.setOut(ps);
}
int ln = 0;
for(char c = 0; c <= 60000; c++){
System.out.print(c+" ");
if(ln++>=100){
System.out.println();
ln = 0;
}
}
}
}
import java.io.*;
import java.util.*;
public class TestPrintStream{
public static void main(String[] args){
String s = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
FileWriter fw = new FileWriter("D:\\lianxi\\io\\logfile.log",true);
PrintWriter log = new PrintWriter(fw);
while((s = br.readLine())!= null){
if(s.equalsIgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
log.println("---------");
log.println(s.toUpperCase());
log.flush();
}
log.println("==="+ new Date()+"===");
log.flush();
log.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
***************************************************************************************************
【Object流的类型:】
***************************************************************************************************
Object流:直接将Object写入或读出。
transient 关键字 修饰成员变量,在修饰序列化时不予考虑,打印0
Serializable 接口 如果想把某个类的对象序列化,必须实现Serializable 接口
Externalizable 接口
public interface Externalizableextends Serializable
void readExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
自己控制序列化过程
---------------------------------------------------------------------------------------------------
页:
[1]