JAVA语言6用多种方式实现从文件按行读数据和写入文件数据(实例教程)
小标 2018-10-12 来源 : 阅读 921 评论 0

摘要:本文主要向大家介绍了JAVA语言6用多种方式实现从文件按行读数据和写入文件数据(实例教程),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言6用多种方式实现从文件按行读数据和写入文件数据(实例教程),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


 

作为一个基本知识,对读写文件相信我们在写代码的时候都遇到过,对于我而言我一般是直接BufferReader或者BufferWriter安排上就完事了,但是我们的实验从来不让我失望,他这一次要求我们用三种不同的方式进行读写文件,没错就是三种。在我好不容易完成了他的要求之后我赶紧将这三种方式变成我的博客嘿嘿嘿


1.Reader and Writer


作为Reader和Writer,他们和InputStream和OutputStream的最大区别是什么,是一次性操作的字节数目,前者一次操作两个后者一次操作一个。但是在这里我们的主要观测点是在他们的方法上,作为最常用的读写文件的类,Reader和Writer为我们提供了很方便的方法,再写方面Writer和BufferedWriter都为我们提供了写字符串的方法。直接write()里面放个字符串就可以了,凡是Reader则没有给我们提供直接按行读取字符串的方法,但是BufferedReader的readline()方法则可以直接读一行字符串,直接调用即可。太简单了这里就不放代码了。。


2.Scanner


Scanner经常被我们用于读取控制台的输入,但是我们只需要将他构造函数中的System.in替换成一个File文件,他就可以变成一个读取文件的Scanner了,Scanner的按行读取方法是nextLine()我们在使用它的时候可以在前面判断它时候hasNextLine()。也是十分方便


File file=new File(fileSource);

    try {

        in=new Scanner(file);

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

    @Override

    public String readline() {

        if(in.hasNextLine()){

        return in.nextLine();

        }

        return null;

    }

   


3.InputStream和OutputStream


下面就是倒霉的FileOutputStream和FileInputStream了,这俩倒霉孩子虽说在有时候挺好使的,但是要是按行来是真的麻烦啊,由于这两个只能读/写byte数组,所以再写的时候我们将字符串调用getBytes()方法转换成byte数组来写


FileOutputStream fos;

     public OUTStream(File file) {

        try {

            fos=new FileOutputStream(file);

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            System.out.println("file not find");

            e.printStackTrace();

        }

    }

 

    @Override

    public void write(String string) {

        // TODO Auto-generated method stub

        byte b[]=string.getBytes();

        try {

            fos.write(b);

   


要说到FileInputStream就更麻烦了我们判断他是否换行的唯一依据就是\r\n,所以我们只能够一个字节一个字节的读取,并把每次读取的字节转换为char类型存在一个足够大的char数组中,当读到\r的时候证明这行读完了(当read()返回-1的时候证明文件读完了)这时候我们将char数组变为String返回


public class INStream implements INstrategy{

//use Stream as IN strategy

    private byte b[]=new byte[1];

    private char[] cs=new char[1024];

 private FileInputStream fis=null;

    public INStream(String fileSource){

        try {

            fis=new FileInputStream(fileSource);

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            System.out.println("file not find");

            System.exit(0);

        }

    }

    @Override

    public String readline()  {

        try {

            int i=0;

            int j=0;

            cs=new char[1024];

            fis.read(b);

            while((b[0]!='\r')){//判断是否换行

                if(j==-1){

                    return null;

                }

                cs[i]=(char)b[0];

                j=fis.read(b);//判断是否读完

                i++;

            }

            if(j!=-1){

                fis.read(b);

            }

        }catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return new String(cs);

    }

   


3.FileChannel


刚才说了这么多我们很容易发现,这写还差一种啊,不着急最后一种就是我以前根本就不知到的FileChannel方法,FileChannel翻译过来就是文件通道,按这个翻译看起来应该是能够读写文件的。FileChannel类的使用必须配合一个byteBuffer类使用我们再创建一个FileOutputStream对象之后使用getChannel()方法来创建一条通道,同时我们将要写入的字符串是用getBytes()存在byteBuffer中,翻转byteBuffer使它变为写状态,只要byteBuffe不为空就像FileChannel中写,最后清空bytebuffer完成写操作


public class OUTBuffer implements OUTStrategy{

    FileChannel outChannel;

    ByteBuffer byteBuffer1=ByteBuffer.allocate(1024);

     public OUTBuffer(File file) {

         try {

            FileOutputStream fos=new FileOutputStream(file);

            outChannel=fos.getChannel();

        } catch (FileNotFoundException e) {

            System.out.println("file not find");

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        }

 

    @Override

    public void write(String string) {

        // TODO Auto-generated method stub

        byteBuffer1.put(string.getBytes());

        byteBuffer1.flip();

        while (byteBuffer1.hasRemaining()) {

            try {

                outChannel.write(byteBuffer1);

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

        byteBuffer1.clear();

    }

   


到现在三种读写方式可算是凑全了,不容易不容易啊


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程