JAVA各种读写方式总结

Scanner首先写一个函数来获取Scanner对象。Scanner reader = null; try { reader = new Scanner(new File(filepath)); } catch (FileNotFoundException e) { e.printStackTrace(); } return re...
摘要由CSDN通过智能技术生成

Scanner

首先写一个函数来获取Scanner对象。

Scanner reader = null;
    try {
      reader = new Scanner(new File(filepath));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    return reader;

然后在读取文件时,将文件路径传入,获得Scanner对象reader,之后使用reader.nextLine()方法来进行逐行的读入,如果需要建图操作,再调用相应类型的图的构建指令进行对图的操作。

Buffer

在读取文件时我们首先写一个函数来获取BufferReader对象。

BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader(filepath));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    return reader;

然后在读取文件时,将文件路径传入,获得BufferReader对象reader,之后使用reader.readLine()方法来进行逐行的读入,如果需要建图操作,再调用相应类型的图的构建指令进行对图的操作。
在写入文件时我们首先写一个函数来获取BufferWriter对象。

BufferedWriter writer = null;
    try {
      writer = new BufferedWriter(new FileWriter(filepath));
    } catch (IOException e) {
      e.printStackTrace();
    }
    return writer;

然后在读取文件时,将文件路径传入,获得BufferWriter对象writer,之后使用writer.write(String string)方法来进行逐行的写入,我们修改每个顶点和边的toString方法,使得符合文件的语法要求,然后我们使用遍历图g中的顶点集合和边集合,调用其toString方法写入文件。我们也要将GraphName,GraphType,VertexType,EdgeType等参数根据图的类型进行写入文件操作。

Nio

在进行文件的读取时,首先获得文件的通道:

FileChannel.open(Paths.get(filepath), StandardOpenOption.READ);

之后我们使用ByteBuffer作为字符的缓冲区,使用temp字节数组用于存储不完整的行的内容,判断是否出现了换行符,注意这要区分LF-\n,CR-\r,CRLF-\r\n,这里判断\n。如果出现了换行符,将temp中的内容与换行符之前的内容拼接,将换行符之后的内容(去除换行符)存到temp中。如果没出现换行符,则将内容保存到temp中。
如果需要建图操作,我们在读取到一行的内容以后,使用相应类型的图的构建指令进行对图的操作。
在进行文件的写入时,同样先获得文件的通道:

FileChannel.open(Paths.get(filepath), StandardOpenOption.WRITE);

我们使用ByteBuffer作为字符的缓冲区,要将String写入文件,我们需要先将这个字符串放入字符缓冲区,然后必须要调用buffer的flip方法,(使缓冲区为一系列新的通道写入或相对获取操作做好准备:它将限制设置为当前位置,然后将位置设置为0。)再将buffer的内容使用channel.write(buffer)写入文件。在进行下一次写入时,需要使用buffer.clear()清空buffer,否则可能因为缓冲区大小不够而报错。
读文件的代码示例:

        File file = new File("file1.txt");  
        FileChannel fileChannel = new RandomAccessFile(file,"r").getChannel();  
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);  
        //使用temp字节数组用于存储不完整的行的内容  
        byte[] temp = new byte[0];  
        while(fileChannel.read(byteBuffer) != -1) {  
            byte[] bs = new byte[byteBuffer.position()];  
            byteBuffer.flip();  
            byteBuffer.get(bs);  
            byteBuffer.clear();  
            int startNum=0;  
            //判断是否出现了换行符,注意这要区分LF-\n,CR-\r,CRLF-\r\n,这里判断\n  
            boolean isNewLine = false;  
            for(int i=0;i < bs.length;i++) {  
                if(bs[i] == 10) {  
                    isNewLine = true;  
                    startNum = i;  
                }  
            }  

            if(isNewLine) {  
                //如果出现了换行符,将temp中的内容与换行符之前的内容拼接  
                byte[] toTemp = new byte[temp.length+startNum];  
                System.arraycopy(temp,0,toTemp,0,temp.length);  
                System.arraycopy(bs,0,toTemp,temp.length,startNum);   
                //将换行符之后的内容(去除换行符)存到temp中  
                temp = new byte[bs.length-startNum-1];  
                System.arraycopy(bs,startNum+1,temp,0,bs.length-startNum-1);  
                //使用return即为单行读取,不打开即为全部读取  
                //此时Totemp中已经为读好的一行。可用System.out.println(new String(toTemp)); 打印出来
//                return;  
            } else {  
                //如果没出现换行符,则将内容保存到temp中  
                byte[] toTemp = new byte[temp.length + bs.length];  
                System.arraycopy(temp, 0, toTemp, 0, temp.length);  
                System.arraycopy(bs, 0, toTemp, temp.length, bs.length);  
                temp = toTemp;  
            }  
        }

写文件的代码示例:

      GraphPoet g;
      FileOutputStream fos = null;
      fos = new FileOutputStream(new File(filepath));
      FileChannel channel = fos.getChannel();
      ByteBuffer buffer = ByteBuffer.allocate(2048);
      String string = "GraphType = \"GraphPoet\"\n";
      buffer.put(string.getBytes());
      buffer.flip(); // 此处必须要调用buffer的flip方法
      channel.write(buffer);
      buffer.clear();
      string = "GraphName = \"" + g.getName() + "\"\n";
      buffer.put(string.getBytes());
      buffer.flip();
      channel.write(buffer);
      buffer.clear();

另一种较为简单的方式为使用Files.readAllLines()函数。返回值为String数组。

      GraphPoet g = new GraphPoet();
      Path path = Paths.get(filepath);
      for (String line : Files.readAllLines(path)) {
        FileStrategy.creatGraphPoet(line, g);
      }

FileWriter和FileReader

在读入文件时使用FileReader进行读入。

       FileReader fr =  new FileReader ("file1.txt");
       BufferedReader br = new BufferedReader (fr);
       String s;
       while ((s = br.readLine() )!=null) {
             System.out.prinln (s);
       }
       fr.close();

在写入文件时我们首先写一个函数来获取FileWriter对象。

    FileWriter writer = null;
    try {
      writer = new FileWriter(filepath);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return writer;

然后在读取文件时,将文件路径传入,获得FileWriter对象writer,之后使用writer.write(String string)方法来进行逐行的写入,我们修改每个顶点和边的toString方法,使得符合文件的语法要求,然后我们使用遍历图g中的顶点集合和边集合,调用其toString方法写入文件。我们也要将GraphName,GraphType,VertexType,EdgeType等参数根据图的类型进行写入文件操作。

参考文献

Java NIO 读取文件、写入文件、读取写入混合
https://blog.csdn.net/z69183787/article/details/77101184
使用FileReader和FileWriter读取写入文件内容
https://blog.csdn.net/miyuki0424/article/details/307904
Java NIO 按行读取超大文件
https://blog.csdn.net/strawberrynick/article/details/54949599
Java nio 文件操作 Path,Files类详解一
https://blog.csdn.net/LuoZheng4698729/article/details/51697648

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值