七、IO

来源:互联网 发布:开发一个软件多少钱 编辑:程序博客网 时间:2024/06/10 03:51

IO

IO的作用:用来操作数据的

操作数据的方式:与数据形成一道通路,IO中称之为,那么我们可以通过流对象中的方法来操作数据,实现数据的增删改查等操作,JAVA中为我们提供了两个主流

字符流

字符流两个基类:

  Reader        Writer

字节流

字节流两个基类:

  InputStream   OutputStream

先学习一下字符流的特点

既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。

那么先以操作文件为主来演示。

需求:在硬盘上,创建一个文件并写入一些文字数据。

找到一个专门用于操作文件的Writer子类对象:FileWriter,后缀名是父类名。 前缀名是该流对象的功能。

import java.io.*;

class  FileWriterDemo

{

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

{

//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。

//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。

//其实该步就是在明确数据要存放的目的地。

FileWriter fw = new FileWriter("demo.txt");

//调用write方法,将字符串写入到流中。

fw.write("abcde");

//刷新流对象中的缓冲中的数据。

//将数据刷到目的地中。

//fw.flush();

//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。

//将数据刷到目的地中。

//flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。

fw.close();

}

}

从上面的代码可以看出来,当我们需要写数据时,可以用write()方法实现,那么如果我们需要读数据呢?用一段简单的代码演示一下就明白了。

import  java.io.*;

class FileReaderDemo

{

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

{

//创建一个文件读取流对象,和指定名称的文件相关联。

//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException

FileReader fr = new FileReader("demo.txt");

//调用读取流对象的read方法。

//read():一次读一个字符。而且会自动往下读。

int ch = 0;

while((ch=fr.read())!=-1)

{

System.out.println(ch);

}

fr.close();

}

}

接下来我们来看对字节文件的操作

同样找一个专门用于操作字节文件的InputStream子类对象:FileInputStream (读)

OutputStream子类对象:FileOutputStream (写)

后缀名是父类名,前缀名是该流对象的功能。

下面用复制图片的例子来演示一下对字节数据的读写:

思路:

1,用字节读取流对象和图片关联。

2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。

3,通过循环读写,完成数据的存储。

4,关闭资源。

import java.io.*;

class  CopyPic

{

public static void main(String[] args) 

{

FileOutputStream fos = null;

FileInputStream fis = null;

try

{

fos = new FileOutputStream("c:\\2.bmp");

fis = new FileInputStream("c:\\1.bmp");

byte[] buf = new byte[1024];//定义一个缓冲区

int len = 0;

while((len=fis.read(buf))!=-1)//读取数据并写入到缓冲区

{

fos.write(buf,0,len);//将缓冲区中的全部数据写出去

}

}

catch (IOException e)

{

throw new RuntimeException("复制文件失败");

}

finally

{

try

{

if(fis!=null)

fis.close();

}

catch (IOException e)

{

throw new RuntimeException("读取关闭失败");

}

try

{

if(fos!=null)

fos.close();

}

catch (IOException e)

{

throw new RuntimeException("写入关闭失败");

}

}

}

}

*不论是操作字符文件还是字节文件,从代码中我们可以看得出来,就是关流,因为流要消耗系统资源,所以流一定要关!

缓冲区

下面介绍IO中一个比较重要的知识点,就是缓冲区,缓冲区的出现是为了提高流的操作效率的。直接通过IO流的方式读取的话,读一句写一句比较效率低下,而缓冲区将读到的数据存起来,然后一下子全部写出去,大大提高了效率,同时字符读取流缓冲区还为我们提供得了readLine()方法,也就是一次读一行的,目的也是提高效率,接下来我们用代码演示一下缓冲区的原理。

字符读取流缓冲区:

BufferedReader  BufferedWriter

通过BufferedReader的一次读一行的方法readLine,方便于对文本数据的获取。

当返回null时,表示读到文件末尾。

import java.io.*;

class  BufferedReaderDemo

{

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

{

//创建一个读取流对象和文件相关联。

FileReader fr = new FileReader("buf.txt");

BufferedReader bufr = new BufferedReader(fr);//加入缓冲区

String line = null;

while((line=bufr.readLine())!=null)//readLine方法返回的时候只返回回车符之前的 数据内容。并不返回回车符。

{

System.out.print(line);

}

bufr.close();

}

}

字符写入流缓冲区也是一样,同时字符写入流缓冲区也为我们提供了一个特殊的方法:newLine()(另起一行)这个方法的主要特点就是它的跨平台性

import java.io.*;

class  BufferedWriterDemo

{

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

{

FileWriter fw = new FileWriter("buf.txt");//创建一个字符写入流对象

BufferedWriter bufw = new BufferedWriter(fw);

for(int x=1; x<5; x++)

{

bufw.write("abcd"+x);

bufw.newLine();

bufw.flush();

}

bufw.close();

}

}

既然字符流有缓冲区,那么字节流也有自己的缓冲区:

BufferedInputStream    BufferedOutputStream

原理和字符流缓冲区一样,代码略*

缓冲区的出现既然提高了效率,但是在使用缓冲区技术的时候也有几个一定要注意的地方:

1、缓冲区必然与流关联,也就是绑定,缓冲区的出现是为了提高流读取效率,没有流就会报异常。

2、缓冲区读写文件必须要刷新flush();

3、关闭缓冲区,其实关闭缓冲区也就是关闭了流对象

4、readLine()方法是字符流缓冲区的方法   

转换流

InputStreamReader: 是字节流通向字符流的桥梁

为了达到最高效率,在 BufferedReader 内包装 InputStreamReader

例如:

 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

这样字节流就可以使用字符流的readLine方法,但是主要目的还是改变解码器

OutPutStreamWriter:是字符流通向字节流的桥梁

 BufferedWriter out = new BufferedWriter(new OutPutStreamWriter(System.out));

File

IO中不仅为我们提供了上面介绍的对文件内容的操作,还提供了对文件本身属性的操作,那就是File类,它也是IO中很重要也是很常用的一个类。

常见方法:

1,创建。

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回 false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2,删除。

boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false

void deleteOnExit();在程序退出时删除指定文件。

3,判断。

boolean exists() :文件是否存在.

isFile():

isDirectory();

isHidden();

isAbsolute();

4,获取信息。

getName():

getPath():

getParent():

getAbsolutePath() 

long lastModified() 

long length() 

File练习:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。

package IODemo;

import java.io.*;

import java.util.*;

class  javaFileList

{

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

{

File dir = new File("F:\\java+3G 学习资料\\JAVA视频\\其他资料\\lianxi1");

List<File> list = new ArrayList<File>();

fileToList(dir,list);

File file =new File("F:\\java+3G 学习资料\\JAVA视频\\其他资料\\lianxi1\\javaFIleList.txt");

writeToFile(list,file.toString());

}

public static void fileToList(File dir,List<File> list)

{

File[] files = dir.listFiles();

for(File file : files)

{

if(file.isDirectory())

fileToList(file,list);//递归

else

{

if(file.getName().endsWith(".java"))

list.add(file);

}

}

}

public static void writeToFile(List<File> list,String javaListFile)throws IOException

{

BufferedWriter bufw =  null;

try

{

bufw = new BufferedWriter(new FileWriter(javaListFile));

for(File f : list)

{

String path = f.getPath();

bufw.write(path);

bufw.newLine();

bufw.flush();

}

}

catch (IOException e)

{

throw e;

}

finally

{

try

{

if(bufw!=null)

bufw.close();

}

catch (IOException e)

{

throw e;

}

}

}

}

此练习中涉及到一个比较重要的算法:递归

递归的特点:调用自身方法。

基本数据流

DataInputStreamDataOutputStream

可以用于操作基本数据类型的数据的流对象。原理是一样的,只不过操作的是基本数据类型,

用简单的代码体现以下:

import java.io.*;

class DataStreamDemo 

{

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

{

readData();

writeData();

}

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();

}

}

原创粉丝点击