java基础技术_java基础篇---I/O技术(一)

对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的。在java.io.包中提供了相关的API.

java中流的概念划分

流的方向:

输入流:数据源到程序(inputStream,Reader读进来)

输出流:程序到目的地(OutPutStream,Writer写出去)

处理数据单元:

字节流:按照字节读取数据(InputStream,OutputStream)

字符流:按照字符读取数据(Reader,Writer)

功能不同

节点流:直接从数据源或目的地读写数据

处理流:不直接连接到数据源或目的地,是处理流的流,童工对其他流的处理提高程序的性能。

Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。

以下是java中io中常用的流。

64552f38c33e02ff92a32cf803cf7719.png

InputStream

抽象类java.io.InputStream是所有字节输入流类型的父类,该类中定义了以字节为单位读取数据的基本方法,并在其子类中进行了分化和实现.

三个基本的read方法:

int read()

int read(byte[] buffer)

int read(byte[] buffer,int offset,int length)

其他方法:

void close()

int available()

skip(long n)

boolean markSupported()

InputStream类层次

af685e5ddbca08cd328fe728d96c1a81.png

importjava.io.File ;importjava.io.InputStream ;importjava.io.FileInputStream ;public classInputStreamDemo{public static void main(String args[]) throws Exception{ //异常抛出,不处理//第1步、使用File类找到一个文件

File f= new File("d:" + File.separator + "test.txt") ; //声明File对象//第2步、通过子类实例化父类对象

InputStream input = null ; //准备好一个输入的对象

input = new FileInputStream(f) ; //通过对象多态性,进行实例化//第3步、进行读操作

byte b[] = new byte[1024] ; //数组大小由文件决定

int len = 0;int temp = 0 ; //接收每一个读取进来的数据

while((temp=input.read())!=-1){//表示还有内容,文件没有读完

b[len] = (byte)temp ;

len++;

}//第4步、关闭输出流

input.close() ; //关闭输出流\

System.out.println("内容为:" + new String(b,0,len)) ; //把byte数组变为字符串输出

}

};

OutputStream

java.io.OutputStream与java.io.InputStream对应,是所有字节输出流类型的抽象父类。

三个基本的write方法:

void write(int c)

void write(byte[] buffer)

void write(byte[] buffer,int offset,int length)

其他方法:

void close()

void flush()

OutputStream类层次

e0f53ff40d9909c83f4b4088bc72e98a.png

importjava.io.File ;importjava.io.OutputStream ;importjava.io.FileOutputStream ;public classOutputStreamDemo{public static void main(String args[]) throws Exception{ //异常抛出,不处理//第1步、使用File类找到一个文件

File f= new File("d:" + File.separator + "test.txt") ; //声明File对象//第2步、通过子类实例化父类对象

OutputStream out = null ; //准备好一个输出的对象

out = new FileOutputStream(f) ; //实例化//第3步、进行写操作

String str = "Hello World!!!" ; //准备一个字符串

byte b[] = str.getBytes() ; //只能输出byte数组,所以将字符串变为byte数组

out.write(b) ; //写入数据//第4步、关闭输出流//out.close() ;//关闭输出流

}

};

Reader

抽象类java.io.Reader是所有字符输入流类型的父类,其中声明了用于读取字符流的有关方法.

三个基本的read方法:

int read()

int read(char[] cbuf)

int read(char[] cbuf,int offset,int length)

其他方法:

void close()

boolean ready()

skip(long n)

boolean markSupported()

void mark(int readAheadLimit)

void reset()

Reader类层次

c616d6446826d5b527f6b01f35dd4696.png

importjava.io.File ;importjava.io.Reader ;importjava.io.FileReader ;public classReaderDemo{public static void main(String args[]) throws Exception{ //异常抛出,不处理//第1步、使用File类找到一个文件

File f= new File("d:" + File.separator + "test.txt") ; //声明File对象//第2步、通过子类实例化父类对象

Reader input = null ; //准备好一个输入的对象

input = new FileReader(f) ; //通过对象多态性,进行实例化//第3步、进行读操作

char c[] = new char[1024] ; //所有的内容都读到此数组之中

int temp = 0 ; //接收每一个内容

int len = 0 ; //读取内容

while((temp=input.read())!=-1){//如果不是-1就表示还有内容,可以继续读取

c[len] = (char)temp ;

len++;

}//第4步、关闭输出流

input.close() ; //关闭输出流

System.out.println("内容为:" + new String(c,0,len)) ; //把字符数组变为字符串输出

}

};

Writer

java.io.Writer与java.io.Reader类对应,是所有字符输出流类型的共同父类.

五个基本的write方法:

void write(int c)

void write(char[] cbuf)

void write(char[] cbuf,int offset,int leng)

void write(String string)

void write(String string,int offset,int length)

其它方法:

void close()

void flush()

Writer类层次

5444007345c9fd4de430fd9c7b6937b0.png

importjava.io.File ;importjava.io.Writer ;importjava.io.FileWriter ;public classWriterDemo{public static void main(String args[]) throws Exception{ //异常抛出,不处理//第1步、使用File类找到一个文件

File f= new File("d:" + File.separator + "test.txt") ; //声明File对象//第2步、通过子类实例化父类对象

Writer out = null ; //准备好一个输出的对象

out = new FileWriter(f) ; //通过对象多态性,进行实例化//第3步、进行写操作

String str = "Hello World!!!" ; //准备一个字符串

out.write(str) ; //将内容输出,保存文件//第4步、关闭输出流

out.flush() ; //强制性清空缓冲区中的内容//out.close() ;//此时,没有关闭

}

};

拷贝实例:

import java.io.*;public classCopy{public static voidmain(String args[]){if(args.length!=2){ //判断是否是两个参数

System.out.println("输入的参数不正确。") ;

System.out.println("例:java Copy 源文件路径 目标文件路径") ;

System.exit(1) ; //系统退出

}

File f1= new File(args[0]) ; //源文件的File对象

File f2 = new File(args[1]) ; //目标文件的File对象

if(!f1.exists()){

System.out.println("源文件不存在!") ;

System.exit(1) ;

}

InputStream input= null ; //准备好输入流对象,读取源文件

OutputStream out = null ; //准备好输出流对象,写入目标文件

try{

input= newFileInputStream(f1) ;

}catch(FileNotFoundException e){

e.printStackTrace() ;

}try{

out= newFileOutputStream(f2) ;

}catch(FileNotFoundException e){

e.printStackTrace() ;

}if(input!=null && out!=null){ //判断输入或输出是否准备好

int temp = 0;try{while((temp=input.read())!=-1){ //开始拷贝

out.write(temp) ; //边读边写

}

System.out.println("拷贝完成!") ;

}catch(IOException e){

e.printStackTrace() ;

System.out.println("拷贝失败!") ;

}try{

input.close() ;//关闭

out.close() ; //关闭

}catch(IOException e){

e.printStackTrace() ;

}

}

}

}

*** 在一般操作输入输出内容就需要使用字节或字符流,但是有些时候需要将字符流变成字节流的形式,或着将字节流变成字符流的形式,所以就需要另外一组转换流操作类

OutputStreamWriter:是Writer的子类,将输出的字符流变成字节流。

InputStreamReader:是Reader的子类,将输入的字节流变成字符流。

转换步骤:

如果以文件操作为例,则在内存总的字符数据需要通过OutputStreamWriter变成字节流保存在文件中,读取的时候需要将读入的字节流通过InputStreamReader变成字符流

fa3a7176c40c62a81ed0310983bedd22.png

例如,将字节的文件输出流以字符的形式输出

import java.io.*;public classOutputStreamWriterDemo{public static void main(String args[]) throws Exception { //所有异常抛出

File f = new File("d:" + File.separator + "test.txt") ;

Writer out= null ; //字符输出流

out = new OutputStreamWriter(new FileOutputStream(f)) ; //字节流变为字符流

out.write("hello world!!") ; //使用字符流输出

out.close() ;

}

};

读的时候亦可以使用字符流的形式读取字节流的文件

import java.io.*;public classInputStreamReaderDemo01{public static void main(String args[]) throwsException{

File f= new File("d:" + File.separator + "test.txt") ;

Reader reader= null;

reader= new InputStreamReader(new FileInputStream(f)) ; //将字节流变为字符流

char c[] = new char[1024] ;int len = reader.read(c) ; //读取

reader.close() ; //关闭

System.out.println(new String(c,0,len)) ;

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值