Java使用I/O流读取文件内容的方法详解

本文实例讲述了Java使用I/O流读取文件内容的方法。分享给大家供大家参考,具体如下:

要利用I/O流读取文件内容,首先要掌握InputStream的体系结构。

这个体系中FileInputStream和BufferedInputStream是一定要掌握的,因为使用的频率比较高。

InputStream的方法:InputStream位于java.io包下

OutputStream的方法:

读取文件(代码):

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
 * I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
 * 输入流:数据源数据流向计算机内存的过程
 * 输出流:把数据从程序流向目标数据源的过程
 * @author Administrator
 *
 */
public class Ch01 {
    /**
     * 读取文件内容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一个抽象类
        // \:是一个 转移符
        //表示磁盘路径的两种表示方式:1、\\  2、/
        try {
            //从文件地址中读取内容到程序中
            //1、建立连接
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、开始读取信息
            /*
            //方法1:一次只读一个
            System.out.println(is.read());//读取的是字节型的:49
            System.out.println((byte)is.read());//50
      */
            //方法2:定义数组,循环读取
            //先定义一个字节数组存放数据
            byte[] b = new byte[5];//把所有的数据读取到这个字节当中
            //声明一个int存储每次读取到的数据
            int i = 0;
            //定义一个记录索引的变量
            int index = 0;
            //循环读取每个数据
            while((i=is.read())!=-1){//把读取的数据放到i中
                b[index]=(byte) i;
                index++;
            }
            //把字节数组转成字符串
            System.out.println(new String(b));
            //关闭流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系统强制解决的问题:文件没有找到
            e.printStackTrace();
        } catch (IOException e) {
            //文件读写异常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
 * I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
 * 输入流:数据源数据流向计算机内存的过程
 * 输出流:把数据从程序流向目标数据源的过程
 * @author Administrator
 *
 */
public class Ch02 {
    /**
     * 读取文件内容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一个抽象类
        // \:是一个 转移符
        //表示磁盘路径的两种表示方式:1、\\  2、/
        try {
            //从文件地址中读取内容到程序中
            //1、建立连接
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、开始读取信息
            //先定义一个字节数组存放数据
            byte[] b = new byte[5];//把所有的数据读取到这个字节当中
            //完整的读取一个文件
            is.read(b);
            //read:返回的是读取的文件大小
            //最大不超过b.length,返回实际读取的字节个数
            System.out.println(Arrays.toString(b));//读取的是字节数组
            //把字节数组转成字符串
            System.out.println(new String(b));
            //关闭流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系统强制解决的问题:文件没有找到
            e.printStackTrace();
        } catch (IOException e) {
            //文件读写异常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
 * I/O流的概念:数据流向某个对象的数据序列,并且到达这个对象的过程。
 * 输入流:数据源数据流向计算机内存的过程
 * 输出流:把数据从程序流向目标数据源的过程
 * @author Administrator
 *
 */
public class Ch03 {
    /**
     * 读取文件内容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一个抽象类
        // \:是一个 转移符
        //表示磁盘路径的两种表示方式:1、\\  2、/
        try {
            //从文件地址中读取内容到程序中
            //1、建立连接
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、开始读取信息
            //先定义一个字节数组存放数据
            byte[] b = new byte[is.available()];//把所有的数据读取到这个字节当中
            //is.available():返回文件的大小
    //        while(is.available()==0);//不等于0时才停止循环
            //完整的读取一个文件
            int off = 0;
            int le = 2;
            while(is.read(b, off, 2)!=-1){
                off+=1;
            }
            is.read(b,off,2);
            //read:返回的是读取的文件大小
            //最大不超过b.length,返回实际读取的字节个数
            System.out.println(Arrays.toString(b));//读取的是字节数组
            //把字节数组转成字符串
            System.out.println(new String(b));
            //关闭流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系统强制解决的问题:文件没有找到
            e.printStackTrace();
        } catch (IOException e) {
            //文件读写异常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class Ch04 {
    /**
     * 读取中文字符的文件
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            /*FileInputStream fis = new FileInputStream("E:/iodemo/ch04.txt");
            //包装流
            BufferedInputStream bis = new BufferedInputStream(fis);*/
            //包装流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:/iodemo/ch04.txt"));
            //读取文件内容
            byte[] b = new byte[bis.available()];
            bis.read(b);
            /*char[] c = new char[b.length];
            for (int i = 0; i < c.length; i++) {
                c[i]=(char) b[i];
            }
            System.out.println(Arrays.toString(c));//乱码
             */
            System.out.println(Arrays.toString(b));//得到的是字节
            //String(byte[])把字节数组转成字符串
            System.out.println(new String(b));//可以得到中文
            bis.close();//关闭流(关闭bis就可以了)
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch05 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            //读取文件
            FileInputStream fis = new FileInputStream("E:/iodemo/ch01.txt");
            //fis.available():文件的长度
            byte[] b=new byte[fis.available()];
            //skip:跳过n个字节后再开始读取
            fis.skip(5);//跳过前5个
            fis.read(b);
            System.out.println(new String(b));
            fis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch06 {
    /**
     * 读取过程暂停,给当前做一个标记,下一次从标记位置开始读取
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //读取过程中暂停
        //给当前做一个标记
        //下一次从标记位置开始读取
        try {
            BufferedInputStream bis= new BufferedInputStream(new FileInputStream("E:/iodemo/ch06.txt"));
            byte[] b = new byte[bis.available()];
        //    bis.read(b, 0, b.length/2);
            //设置断点
            bis.mark(bis.read(b, 0, b.length/2));//位置就是读取的长度
            System.out.println(new String(b));
            System.out.println("暂停读取....");
            Thread.sleep(2000);//休眠2s
            //休眠后继续读
            System.out.println("继续读取...");
            //reset:将当前复位的位置设置成上次调用mark标记的位置
            bis.reset();
            bis.read(b);
            System.out.println(new String(b));
            bis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
/**
 * 序列流(集合流)
 * 把n个流合并在一起读取
 * @author Administrator
 *
 */
public class Ch07 {
    public static void main(String[] args) {
        try {
            //第一个文件流
            FileInputStream fis1=new FileInputStream("E:/iodemo/ch01.txt");
            //第二个文件流
            FileInputStream fis2=new FileInputStream("E:/iodemo/ch04.txt");
            //合并到序列流中
            SequenceInputStream sis=new SequenceInputStream(fis1, fis2);
            //方式1
//            //临时存放数据的数组
//            int len =fis1.available()+fis2.available();
//            byte[] b=new byte[2*len+1];
//            //把每一次读取到的临时数据存放如sb中
////            StringBuffer sb=new StringBuffer();
//            //一次性读取所有的内容
//            int off=0;
//            int i=0;
//            while((i=sis.read(b,off,len))!=-1) {
////                sb.append();
//                off+=i;
//            }
//            System.out.println(new String(b));
            //方式2
            byte[] b=new byte[fis1.available()];
//            StringBuffer sb=new StringBuffer();
//            int i=0;
            while(sis.read(b)!=-1) {
                System.out.println(new String(b));
//                sb.append(new String(b));
            }
//            System.out.println(sb.toString());
            sis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Vector;
public class Ch08 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            //三个文件流
            FileInputStream fis1 = new FileInputStream("E:/iodemo/a.txt");
            FileInputStream fis2 = new FileInputStream("E:/iodemo/b.txt");
            FileInputStream fis3 = new FileInputStream("E:/iodemo/c.txt");
            //把三个流添加到集合中
            Vector<FileInputStream> vector = new Vector<>();
            vector.add(fis1);
            vector.add(fis2);
            vector.add(fis3);
        //    vector.elements(); //方法返回的是Enumeration
            //合并到一个序列流中
            SequenceInputStream sis = new SequenceInputStream(vector.elements());
            byte[] b = new byte[fis1.available()+fis2.available()+fis3.available()];
            //读取
            int off=0;
            //vector.get(i).available():一个文件的长度
            for (int i = 0; i < vector.size(); i++) {
                //off:数组当中存放数据的起始下标的位置
                off+=sis.read(b, off, vector.get(i).available());//每次读取一个文件的长度
            }
            System.out.println(new String(b));
            sis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java使用IO流实现音频的剪切和拼接

    需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例): 第一首歌有一个输入流对象bis1.第二首歌有一个输入流对象bis2,他们公用一条输出流对象bos(在选择构造方法的时候选择含有布尔类型参数的那个),待第一首歌剪切完成后,在此基础上追加第二首歌的"高潮部分". 实现代码: import java.io.BufferedInputStream; import java.io.BufferedOutputStream;

  • Java IO读取文件的实例详解

    Java中文件流的两个主要方式就是字符流和字节流,如下图: 具体的使用方法可以参考官方文档,这里主要介绍四种常见的文件读取方式 1.通过字节来读取文件(常用于二进制文件:图片.声音.视频等) 2.通过字符来读取文件(常用于文本的读取) 3.通过行来读取文件(常用于面向行的格式化文本读取) 4.随机读取文件(基于字节来读取) 下面是对于这四种读取方式的代码,如下: package com.ds.io; //1.按字节读取文件内容 //2.按字符读取文件内容 //3.按行读取文件内容 //4.随机读

  • Java 使用IO流实现大文件的分割与合并实例详解

    Java 使用IO流实现大文件的分割与合并 文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时候就可以把这个文件切割成3个1G的文件 ,分开复制, 最后把三个文件合并, 这样就解决问题了 :再比如说, 你有一个上百M的文件要上传到FTP ,但是这个FTP限制你单个文件不能超过10M 这时候也可以用文件分割的办法解决问题.既然分割了,那么在我们再次使用的时候就需要合并了,今天我们就通过Java

  • 简单总结Java IO中stream流的使用方法

    Java语言的输入输出功能是十分强大而灵活的,对于数据的输入和输出操作以"流"(stream)的方式进行.J2SDK提供了各种各样的"流"类,用以获取不同种类的数据,定义在包java.io中.程序中通过标准的方法输入或输出数据. Java中的流可以从不同的角度进行分类: 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流. 节点流:是可以从一个特定的数据源(节点)读写数据的流(例如

  • 关于Java中的IO流总结(推荐)

    1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和BufferedOutputStream.以及对应的FileOutputWriter,FileInputReader,BufferedInputReader,BufferedOutputWriter. 3. 转换流InputStreamReader和OutputStreamWriter 一:流的继承关系 字节流 字符流 字符流和字节

  • java IO流文件的读写具体实例

    引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

  • Java基于IO流读取文件的方法

    本文实例讲述了Java基于IO流读取文件的方法.分享给大家供大家参考,具体如下: public static void readFile(){ String pathString = TEST.class.getResource("/simu").getFile(); try { pathString = URLDecoder.decode(pathString, "utf-8"); } catch (UnsupportedEncodingException e1)

  • Java中IO流文件读取、写入和复制的实例

    //构造文件File类 File f=new File(fileName); //判断是否为目录 f.isDirectory(); //获取目录下的文件名 String[] fileName=f.list(); //获取目录下的文件 File[] files=f.listFiles(); 1.Java怎么读取文件 package com.yyb.file; import java.io.File; import java.io.FileInputStream; import java.io.In

  • java基础知识I/O流使用详解

    "流"概念源于UNIX中的管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等,它屏蔽了实际的I/O设备中处理数据的细节.   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL. 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流.其实输入/输出是想对于内存来说的.实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必

  • 详解java IO流之缓冲流的使用

    java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能. 缓冲流分为字节和字符缓冲流 字节缓冲流为: BufferedInputStream-字节输入缓冲流 BufferedOutputStream-字节输出缓冲流 字符缓冲流为: BufferedReader-字符

  • Java的DataInputStream和DataOutputStream数据输入输出流

    DataInputStream  DataInputStream 是数据输入流.它继承于FilterInputStream. DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型".应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据. DataInputStream 函数列表: DataInputStream(InputStream in)

随机推荐