I/O流

来源:互联网 发布:wordpress 程序员主题 编辑:程序博客网 时间:2024/06/05 03:02

该文章简要介绍java I/O输入输出流的用法。

一、流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

二、流的数据的表现形式

数据的内部表示便于程序进行数据处理。典型的内部表示有:整型数的二进制表示、浮点数的IEEE表示、字符的ASCII或Unicode编码表示。

在输入输出流中在进行数据处理转换的时候,数据位可能会出现乱码,是由于编码后的字符长度不同,导致数据尾部填充出现乱码现象。

例:

输入:

输出:

三、IO流的分类

根据处理数据类型的不同分为:字符流和字节流。

根据数据流向不同分为:输入流和输出流。

(1)字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。字节流和字符流的区别:

读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

(2)输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。输入流是将数据从文件读入当前程序中,输出流是将数据从当前程序中写入到文件中。

四、在JAVA中的IO流

字节流:InputStream/OutputStream

字符流:Reader/Writer

包装流:数据流、缓存流……

包装流,故名思义,目的是为了增强某种流的功能,如OutputStream,只负责输出字节,字节数组,关闭等简单的原始字节操作。为了使其在输出过程中具备更多的功能,如可以输出数字,布尔值,整数,小数,对象,UTF字符串等,则可以使用DataOutputStream完成各种数据的输出转换,并且将转换后的数据传递给被包装得原始OutputStream流,如FileOutputStream

包装流有个特点,必须有原始的具体的IO对象,不等独立使用,如ObjectOutputStream,ObjectIputStream,都必须要有具体的输出流对象FileOutputStream,SockeObjectOutputStream,因为包装流本省不能真正完成输入或者输出过程,必须使用可以完成输入、输出流对象作为动作的真正执行者,包装流不过简化了调用者在输入、输出过程中的一些数据处理和特殊要求。

五、IO流的一些基本函数

java.io.InputStream:

1)available()返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。

2)close()关闭此输入流并释放与该流关联的所有系统资源。

3)read()从输入流中读取数据字节。

注:如果因为已经到达流末尾而没有可用的字节,则返回值 -1。

java.io.OutputStream:

1)close()关闭此输出流并释放与该流关联的所有系统资源。

2) flush()刷新此输出流并强制写出所有缓冲的输出字节。

注:在关闭流之前需刷新流。

3) write()将指定的字节写入此输出流。

六、实例应用

下为文件查找器的部分代码:

else if(type.equals("输出")){

           if(list.getSelectedValue()==null){

              

           }

           else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){

               InputStreamReader inr = null;

               try {

                   InputStream in = new FileInputStream(new File(list.getSelectedValue()));

                    inr = newInputStreamReader(in);

                   try {

                      int len =in.available();

                       char[]c =new char[len];

                       inr.read(c);

                       System.out.println(c);

                   } catch (IOException e1) {

                       // TODO Auto-generatedcatch block

                       e1.printStackTrace();

                   }

               } catch (FileNotFoundException e1) {

                   // TODO Auto-generatedcatch block

                   e1.printStackTrace();

               }

               if(inr!=null){

                   try {

                       inr.close();

                   } catch (IOException e1) {

                       // TODO Auto-generatedcatch block

                       e1.printStackTrace();

                   }

               }

              

           }

        }

        else if(type.equals("增加")){

           if(list.getSelectedValue()==null){

              

           }

           else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){

               OutputStreamWriter osw = null;

               OutputStream out;

               try {

                   if(type.equals("增加")){

                       out = new FileOutputStream(new File(list.getSelectedValue()),true);

                       osw = new OutputStreamWriter(out);

                       String str1 = JOptionPane.showInputDialog(null,"请输入所需增加的内容");

                       try {

                           osw.write(str1);

                           osw.flush();

                       } catch (IOException e1) {

                           // TODO Auto-generatedcatch block

                           e1.printStackTrace();

                       }

                   }

               } catch (FileNotFoundException e1) {

                   // TODO Auto-generatedcatch block

                   e1.printStackTrace();

               }

               if(osw!=null){

                   try {

                       osw.close();

                   } catch (IOException e1) {

                       // TODO Auto-generatedcatch block

                       e1.printStackTrace();

                   }

               }

           }

        }

else if(type.equals("复制")){

           if(list.getSelectedValue()==null){

              

           }

           else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){   

               FileInputStream in = null;

               FileOutputStream out = null;

               FileChannel fin = null;

               FileChannel fout = null;

               try {

                   in = new FileInputStream(new File(list.getSelectedValue()));

                   JFileChooser fc = new JFileChooser();

                   fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//只选择目录

                   int returnVal = fc.showOpenDialog(null);

                   String path1 = null;

                   if(returnVal == JFileChooser.APPROVE_OPTION) {

                       path1 =fc.getSelectedFile().getAbsolutePath();

                   }

                   String str1 = JOptionPane.showInputDialog(null,"请输入所需创建文件名");

                   path1+="\\";

                   path1+=str1;

                   path1+=".txt";

                   out = new FileOutputStream(new File(path1));

                   fin = in.getChannel();

                   fout = out.getChannel();

                   try {

                       fin.transferTo(0, fin.size(), fout);

                   } catch (IOException e1) {

                       // TODO Auto-generatedcatch block

                       e1.printStackTrace();

                   }//链接两个通道,并且从in通道读取,然后写入out通道

               } catch (FileNotFoundException e1) {

                   // TODO Auto-generatedcatch block

                   e1.printStackTrace();

               }

           }

在文件复制的时候,用文件通道(FileChannel)来实现文件复制将比老方法快了近三分之一。在复制大文件的时候更加体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。

0 0
原创粉丝点击