2024年2月22日发(作者:)

第六章 输入输出流及文件操作

 在Java中,应用程序所需要读入的数据和写出的数据是通过I/O操作实现的

 为进行数据的输入、输出操作,java中把不同的输入、输出源(键盘,文件等)抽象表述为“流”(stream)

 Java中的输入输出流可以分为两大类:输入流和输出流

 输入流:只能从中读取字节数据,而不能向其写出数据

 输出流:只能向其写入字节数据,而不能从中读取数据

 包提供了处理各种类型的流:文件流,字节流,字符流等

 java语言提供3种自动生成的标准流。

 是标准输出流

 是标准输入流

 是标准异常流

 在使用输入输出流时,我们需要根据数据格式、操作对象、随机访问能力等因素,来决定选择那种流来实现功能

 字节流是用来针对ISO的8位字节的读和写。

 java字节I/O流的层次。FileInputStream:一次读取一个字节 。PipedInputStream:大批量读取。

字节I/O流

 java字节流继承层次

字节输入流

 所有的字节输入流,都是InputStream的子类,InputStream类包含的主要方法有:

字节输入流

 一般来说,字节输入流的数据通常来自二进制文件,所以FileInputStream通常作为字节输入流的操作类。

 例:从文件中读取数据。

import putStream;

public class FileInputStreamTest {

public static void main(String argv[])

{

//构建一个字节流对象,对象要对应文件名

try {

FileInputStream fin=new

FileInputStream("C:/");

//读取文件中含有多少个字节

n(ble());

byte b[]=new byte[50];

//跳过文件中前两个字节

(2);

//把文件中读取的字节放在数组b中

(b);

//将数组中b中的内容输出

}

}

n(new String(b));

();

} catch (Exception e) {

tackTrace();

}

n();

 所有的字节输出流,都是OutputStream的子类,OutputStream类包含的主要方法有:

import putStream;

import tFoundException;

import tputStream;

import ption;

/**

* 文件拷贝

* 步骤1:把文件读取到输入流中

* 步骤2:输入流存入byte数组中

*步骤3:建立一个输出流

*步骤4:把数组中的信息一次写入输入流

*/

public class CopeOutputStream {

public static void main(String[] args) throws IOException {

FileInputStream fin;

try {

fin = new FileInputStream("C:/");

byte[] b=new byte[ble()];

(b);

FileOutputStream fon=new FileOutputStream("c:/");

(b);

();

();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

tackTrace();

}

}

}

上例中,把图片的数据一次性读入内存,这是很危险的。

import putStream;

import tputStream;

public class CopyOutputStream {

public static void main(String[] args) throws Exception{

FileInputStream pin=new FileInputStream("c:/");

FileOutputStream op=new FileOutputStream("c:/");

byte[] b=new byte[100]; //数组一次可存入 100字节

if(((b))>0)

{

(b);

}

();

();

}

}

字符I/O流

 Reader和Writer是包中字符I/O 流的抽象父类,它们派生的子类如图所示。

import putStream;

import tputStream;

public class TestOutputInput {

/**

* 建立一个文件, 向里面写入1——10000个数字,再利用输入流读取到控制台进行打印

*/

public static void main(String[] args) throws Exception{

FileOutputStream fout=new

FileOutputStream("c:/");

FileInputStream fin=new

FileInputStream("c:/");

for(int i=0;i<=100;i++)

}

}

(i);

();

int value;

while((value=())!=-1)

n(value);

();

一些I/O类的主要功能:

字符输入流

 字符输入流都是抽象类Reader的子类。其中包括InputStreamReader及其子类FileReader,BufferedReader等

 BufferedReader类是最常使用的字符输入流,它的构造方法有:

 edReader(Reader in)

 edReader(Reader in, int sz)

BufferedReader类包含的主要方法有:

 基于标准输入输出的IO操作

在Java里,提供了“标准输入流”和“标准错误输出流”,分别对应于

 字符输入流都是抽象类Writer的子类。其中包括PrintWriter类、OutputStreamWriter及其子类FileWriter,BufferedWriter等。

 BufferedWriter类包含的常见方法:

________————————————————————————————————————————————————————————————————————————————————————————————

字符文件的复制。

和。

import edReader;

import edWriter;

import ader;

import iter;

import ption;

public class TestBufferedWriter {

public static void main(String[] args){

BufferedReader br=null;

BufferedWriter bw=null;

try {

br=new BufferedReader(

new FileReader("c:/"));

bw=new BufferedWriter(

new FileWriter("c:/"));

String message=" ";

while((message=ne())!=null)

{

(message);

e();

}

} catch (Exception e) {

// TODO Auto-generated catch block

tackTrace();

}finally

{

try {

();

} catch (IOException e) {

// TODO Auto-generated catch block

tackTrace();

}

try {

();

} catch (IOException e) {

// TODO Auto-generated catch block

tackTrace();

}

}

}

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

import edReader;

import treamReader;

public class TestBufferedReader {

/**

* BufferedReader是一个缓冲区读取流,一次可以读取一行

* InputStreamReader比BufferedReader低一个层次,一次可以读入一个字符

* 比InputStreamReader低一个层次,一次可以读入一个字节

* BufferedReader可以封装低层次的流

*/

public static void main(String[] args) throws Exception{

BufferedReader bf=new BufferedReader(new

InputStreamReader());

n("读取并输出字符串");

n(ne());

//读取并输出整型数据

n("输入一个整型");

int i=nt(ne());

n(i);

//读取并输出double类型的数据

n("输入一个double型");

double b=ouble(ne());

n(b);

}

}、

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

import edReader;

import edWriter;

import ader;

import iter;

public class TestPassword {

/**

* @param args

*/

public static void main(String[] args) throws Exception{

FileReader fr=new FileReader("c:/");

BufferedReader in=new BufferedReader(fr);

FileWriter fw=new FileWriter("c:/");

BufferedWriter out=new BufferedWriter(fw);

int value;

}

}

while((value=())!=-1)

{

n((char)value);

(value);

}

();

();

();

java的文件管理

 对于文件或目录的其他操作,如重命名、删除、列表显示等,需要使用Java的文件管理File类。

 例:建立File类对象

import ;

public class TestFile {

public static void main(String[] args) throws Exception{

//首先指定文件夹要建在哪个目录下

File currentPath=new File("c:/");

//生成(指定)目录对象

File tempPath=new File(currentPath,"temp");

//生成目录

();

//在temps目录下建立两个文件,

File temp1=new File(tempPath,"");

NewFile();

File temp2=new File(tempPath,"");

NewFile();

//改名为

File temp=new File(tempPath,"");//生成文件对象

To(temp);

//调用listDir()

File f=new File("C:/Program Files");

listDir(f);

}

//做一个方法,把temp目录下的所有文件都显示出来

public static void listDir(File currentPath) throws

Exception{

String[] fileNames=();

for(int i=0;i<;i++)

{

File f=new

File(h(),fileNames[i]);//路径名和文件名。生成每一个目录的文件对象

//如果是目录,显示目录名,递归调用

if(ctory())

{

n(onicalPath());//显示目录完整路径

//递归调用

listDir(f);

}

}

}

}

对文件名操作提供的方法

 测试文件属性操作提供的方法

为目录操作提供的方法

 为文件信息操作提供的方法

常见文件操作

总结

 Java对资源的操作是通过输入输出流完成的,根据数据源的类型可以分成字节流和字符流两种

 java的字节流继承于InputStream、OutputStream和RandomAccessFile,字符流继承于Reader和Writer

 虽然java提供了很多适用于不同情况的流,我们只需要掌握标准输入输出流(、)、文件流(字节流和字符流)和BufferedReader、BufferedWriter就可以了,其余输入输出流的用法和它们非常相似