24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

【精品】Java文件读写全集

2017-09-04 14:13:18 东方博宜 阅读

1.1 I/O流概述

(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。

一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL

 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。 

形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。

 

1java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能。

2、流的分类

1)按照处理的数据类型分类:字节流、字符流。

一个字符 = 两个字节(16位,Unicode编码)。

处理字节的流:InputStreamOutputStream;(都是抽象类)

处理字符的流:ReaderWriter。(都是抽象类)

2)按照流的方向分类:输入流、输出流;

3)按照流的角色分类:节点流、处理流。

     节点流:可以从/向一个特定的IO设备读/写数据的流;(又称低级流)

     处理流:实现对一个已存在的流进行连接和封装。(又称高级流)

 

1.2 流的层次

1.2.1 InputStream的层次

图片.png

 

1.2.2 OutputStream的层次

图片.png

 

1.2.3 Reader的层次

图片.png

 

1.2.4 Writer类层次

图片.png

 

缓冲流:对节点流进行缓冲,对读写数据进行缓冲,提高程序的效率。

– BufferedReader

– BufferedWriter

– BufferedInputStream

– BufferedOutputStream

 

1.2.5 常见的IO

关于IO流:

 File f=new File("指定要读的文件路径");

 String path="c://01.txt";

 

例子一:采用FileInputStream读取文件(字节流)

图片.png

例子二:采用BufferedInputStream提高读取效率(字节流)

图片.png

 

例子三:利用FileInputStreamFileOutputStream进行文件复制(字节流)

图片.png


 

例子四:文件复制升级版,计算拷贝量及拷贝进度(字节流)

图片.png


例子五:文件复制升级版,计算拷贝量及拷贝进度(字节流)

图片.png

图片.png


例子六:利用Reader读取字符流

图片.png

图片.png

 

例子七:利用Reader读取网络流,并写到本地

图片.png

图片.png

图片.png


代码参考:


/**

 * 字节流测试

 * @author teacher-song

 */

public class InputStreamTest {

 

         /**

          * 采用FileInputStream读取文件

          * 注意:InputStream是字节流,是不适合读取含中文的txt文件的,因为一个中文是2个字节

          * 如:文件内容是:123好,2个字节一读取的话,第一次地区到12,第二次读取到3和好的第一个字节

          * 那么好一定会乱码

          */

         public static void readFile(){

                   try {

                            //System.getProperty():获取系统属性,user.dir代表用户当前工作目录

                            FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/src/a.txt");

                            //1024个字节一次缓冲读入,如果一个字节一次读取,那么中文输出会乱码(长度改成1或者2试试?)

                            byte[] buff = new byte[1024];

                            int x = fis.read(buff);

                            while(x != -1){

                                     //输出字符数据(0表示从byte数组第0个位置输出,x表示输出x个字节的内容)

                                     String s = new String(buff,0,x);

                                     System.out.print(s);

                                     x = fis.read(buff);

                            }

                           

                            //关闭通道,释放资源

                            fis.close();

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

         }

 

         /**

          * 利用BufferedInputStream提高效率

          * 不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低

          * 带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘。

          * 这种方式可以减少磁盘操作次数,速度就会提高很多

          */

         public static void readBufferdFile() throws Exception{

                   FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/src/a.txt");

                   BufferedInputStream bis = new BufferedInputStream(fis);

                  

                   byte[] b = new byte[1024];

                   int x = bis.read(b);//x代表读取的字节数

                   while(x != -1){

                            String s = new String(b,0,x);

                            System.out.print(s);

                            x = bis.read(b);

                   }

                  

                   bis.close();

                   fis.close();

         }

        

         /**

          * 利用FileInputStreamFileOutputStream进行文件复制

          */

         public static void copyFiles() throws Exception{

                   FileInputStream fis  = new FileInputStream(System.getProperty("user.dir") + "/src/a.txt");

                   FileOutputStream fos = new FileOutputStream(new File(System.getProperty("user.dir") + "/src/b.txt"));

                   //尝试改成1或者2试试?是否都是正常的

                   byte[] b = new byte[1024];

                   int x = fis.read(b);

                   while(x != -1){

                            fos.write(b);

                            x = fis.read(b);

                   }

                  

                   fis.close();

                   fos.close();

         }

        

         /**

          * 利用FileInputStreamFileOutputStream进行文件复制

          * 升级版的文件拷贝,计算文件大小,计算拷贝进度和拷贝量

          * copyFiles2("D:/MetInfo5.3.zip","D:/test.zip"); 找一个大文件测试一下

          */

         public static void copyFiles2(String fromdir,String todir) throws Exception{

                   FileInputStream fis  = new FileInputStream(fromdir);

                   File fromfile = new File(fromdir);//源文件

                   File tofile = new File(todir);//目标文件

                   FileOutputStream fos = new FileOutputStream(tofile);

                   //尝试改成1或者2试试?是否都是正常的

                   byte[] b = new byte[1024];

                   int x = fis.read(b);

                   int c = 1;

                   while(x != -1){

                            fos.write(b);

                            x = fis.read(b);

                           

                            System.out.println("已经拷贝" + c + "KB" + ",拷贝了" +

                                               String.format("%.2f", c * 1024.0 / fromfile.length() * 100) + "%");

                            c++;

                   }

                  

                   fis.close();

                   fos.close();

         }

        

         /**

          * 利用BufferedInputStreamBufferedOutputStream提高效率

          * 并对比两个拷贝分别花的时间

          * long a = System.currentTimeMillis();

          * bufferedCopy("D:/MetInfo5.3.zip","D:/test.zip");

          * long b = System.currentTimeMillis();

          * System.out.println(b - a);

          */

         public static void bufferedCopy(String from,String to) throws Exception{

                   File fromfile = new File(from);

                   File tofile = new File(to);

                  

                   FileInputStream fis = new FileInputStream(fromfile);

                   FileOutputStream fos = new FileOutputStream(tofile);

                  

                   BufferedInputStream bis = new BufferedInputStream(fis);

                   BufferedOutputStream bos = new BufferedOutputStream(fos);

                  

                   //用来存放读取的内容

             byte[] b = new byte[1024];

                   int x = bis.read(b);

                  

                   int c = 1;

                   //如果没有读取到文件的末尾

                   while(x != -1){

                            bos.write(b);

                            x = bis.read(b);

                           

                            System.out.println("已经拷贝" + c + "KB,拷贝" +

                            String.format("%.2f", c * 1024.0 / fromfile.length() * 100) + "%");

                            c++;

                   }

                  

                   bis.close();

                   bos.close();

                   fis.close();

                   fos.close();

         }

        

         /**

          * 利用Reader来读取字符流

          */

         public static void readerFile(String file) throws Exception{

                   FileReader reader = new FileReader(file);

                   //尝试改成1试试

                   char[] buff = new char[1024];

                   int x = reader.read(buff);

                   while(x != -1){

            String s = new String(buff,0,x);

            System.out.print(s);

            x = reader.read(buff);

                   }

                   reader.close();

         }

        

         /**

          * 利用BufferedReader来提高效率

          */

         public static void bufferedReader(String file) throws Exception{

                   FileReader reader = new FileReader(file);

                   BufferedReader br = new BufferedReader(reader);

                  

                   //按行读取

                   String s = br.readLine();

                   while(s != null){

                            System.out.println(s);

                            s = br.readLine();

                   }

                  

                   br.close();

                   reader.close();

         }

        

         /**

          * 读取网络流

          * @param url

          */

         public static void readURL(String domain) throws Exception{

                   URL url = new URL(domain);

                   InputStreamReader is = new InputStreamReader(url.openStream(),"utf-8");

                   BufferedReader br = new BufferedReader(is);

                   String s = br.readLine();

                  

                   while(s != null){

                            System.out.println(s);

                            s = br.readLine();

                   }

                  

                   is.close();

         }

        

         /**

          * 读取网络流后把网址内容写下来(采集网站内容)

          * @param url

          */

         public static void copyUrl(String domain,String to) throws Exception{

                   URL url = new URL(domain);

                   InputStreamReader is = new InputStreamReader(url.openStream(),"utf-8");

                   BufferedReader br = new BufferedReader(is);

                   String s = br.readLine();

                  

                   //字符写入流

                   OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(to)),"utf-8");

                   BufferedWriter bw = new BufferedWriter(writer);

                  

                   while(s != null){

                            System.out.println(s);

                            s = br.readLine();

                            bw.append(s + "\n");

                   }

                  

                   is.close();

         }

        

         public static void main(String[] args) {

                   try {

                            copyUrl("http://www.sina.com.cn","D:/a.html");

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

                  

         }

}




Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn