nio按行读文件
来源:互联网 发布:学java入门什么书推建 编辑:程序博客网 时间:2024/05/20 13:12
不废话,直接上代码
package com.syz.test.nio;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class DataReader { /** * 按行读,行的分隔符必须是单个字符"\n" */ public static void readByLine(String filePath,String encoding,int bufferSize) { byte lf = 10;//"\n" RandomAccessFile raf = null; FileChannel fc = null; try { raf = new RandomAccessFile(filePath, "r"); fc = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(bufferSize); //保存换行后未处理的数据 byte[] temp = new byte[0]; while (fc.read(buffer)!= -1) { int position = buffer.position();// 读取结束后的位置,相当于读取的长度 byte[] bs = new byte[position];// 用来存放读取的内容的数组 buffer.rewind();// 将position设回0,所以你可以重读Buffer中的所有数据,此处如果不设置,无法使用下面的get方法 buffer.get(bs);// 相当于buffer.get(bs,0,bs.length()):从position初始位置开始相对读,读bs.length个byte,并写入bs[0]到bs[bs.length-1]的区域 buffer.clear(); //要加上上次未处理的数据 int readSize = position + temp.length; byte[] readByte = new byte[readSize]; System.arraycopy(temp, 0, readByte, 0, temp.length); System.arraycopy(bs, 0, readByte, temp.length, position); int start = 0; int lineByteSize = 0; byte[] lineByte = new byte[0]; for (int i = 0; i < readSize; i++) { if (readByte[i] == lf) { lineByte = new byte[lineByteSize]; System.arraycopy(readByte, start, lineByte, 0, lineByteSize); String lineStr = new String(lineByte, encoding); System.out.println(lineStr); lineByteSize=0; start = i+1; } else { lineByteSize++; } } // 把剩余的放入临时数组中 temp = new byte[lineByteSize]; System.arraycopy(readByte, start, temp, 0, lineByteSize); } //处理临时数组中的数据 if(temp.length>0){ String lineStr = new String(temp, encoding); System.out.println(lineStr); } } catch (Exception e) { e.printStackTrace(); } finally { if (fc != null) { try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } if (raf != null) { try { raf.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 按条读 * 举例:abc\ndef * 分隔符可以是多个字符,如:abc\n\rdedf * 如果设置成\n,就是按行读了 * @param filePath 文件路径 * @param encoding 字符集 * @param bufferSize 每次读多少字节 * @param itemSplit 第条的分隔符 */ public static void readByItem(String filePath,String encoding,int bufferSize,String itemSplit) { RandomAccessFile raf = null; FileChannel fc = null; try { raf = new RandomAccessFile(filePath, "r"); fc = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(bufferSize); byte[] itemSplitByte = itemSplit.getBytes(encoding); int itemSplitLen = itemSplitByte.length; //保存未处理的数据 byte[] temp = new byte[0]; int itemIndex = 0; while (fc.read(buffer)!= -1) { int position = buffer.position();// 读取结束后的位置,相当于读取的长度 byte[] bs = new byte[position];// 用来存放读取的内容的数组 buffer.rewind();// 将position设回0,所以你可以重读Buffer中的所有数据,此处如果不设置,无法使用下面的get方法 buffer.get(bs);// 相当于buffer.get(bs,0,bs.length()):从position初始位置开始相对读,读bs.length个byte,并写入bs[0]到bs[bs.length-1]的区域 buffer.clear(); //要加上上次未处理的数据 int readSize = position + temp.length; byte[] readByte = new byte[readSize]; System.arraycopy(temp, 0, readByte, 0, temp.length); System.arraycopy(bs, 0, readByte, temp.length, position); int start = 0; int columnByteSize = 0; byte[] columnByte = new byte[0]; int itemSplitIndex = 0; for (int i = 0; i < readSize; i++) { columnByteSize++; if (readByte[i] == itemSplitByte[itemSplitIndex]) { itemSplitIndex++; if(itemSplitIndex==itemSplitLen){ columnByteSize = columnByteSize-itemSplitLen; columnByte = new byte[columnByteSize]; System.arraycopy(readByte, start, columnByte, 0, columnByteSize); String column = new String(columnByte, encoding); System.out.println(itemIndex+"\t"+column); itemIndex++; start = i + 1; columnByteSize = 0; itemSplitIndex = 0; } } else { itemSplitIndex=0; } } // 把剩余的放入临时数组中 temp = new byte[columnByteSize]; System.arraycopy(readByte, start, temp, 0, columnByteSize); } //处理临时数组中的数据 System.out.println("temp.length="+temp.length); if(temp.length>0){ String column = new String(temp, encoding); System.out.println(itemIndex+"\t"+column); } } catch (Exception e) { e.printStackTrace(); } finally { if (fc != null) { try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } if (raf != null) { try { raf.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 按条读,每一条又有被分成若干个列 * 举例:a|b|\nc|d\n * 分隔符可以是多个字符,如:a::b::c\n\rd::e::f\n\r * 严重声明:条分隔符与列分隔符不能有一样的符号,如columnSplit=|,itemSplit=||,它们都有|符号。 * 因为这个是逐个读的,不太好区分读到||的第一个字符时要不要切分列 * @param filePath 文件路径 * @param encoding 字符集 * @param bufferSize 每次读多少字节 * @param itemSplit 第条的分隔符 * @param columnSplit 每条中每列的分隔符 */ public static void readByItem(String filePath,String encoding,int bufferSize,String itemSplit,String columnSplit) { RandomAccessFile raf = null; FileChannel fc = null; try { raf = new RandomAccessFile(filePath, "r"); fc = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(bufferSize); byte[] columnSplitByte = columnSplit.getBytes(encoding); int columnSplitLen = columnSplitByte.length; byte[] itemSplitByte = itemSplit.getBytes(encoding); int itemSplitLen = itemSplitByte.length; //保存未处理的数据 byte[] temp = new byte[0]; int columnIndex = 0; int itemIndex = 0; while (fc.read(buffer)!= -1) { int position = buffer.position();// 读取结束后的位置,相当于读取的长度 byte[] bs = new byte[position];// 用来存放读取的内容的数组 buffer.rewind();// 将position设回0,所以你可以重读Buffer中的所有数据,此处如果不设置,无法使用下面的get方法 buffer.get(bs);// 相当于buffer.get(bs,0,bs.length()):从position初始位置开始相对读,读bs.length个byte,并写入bs[0]到bs[bs.length-1]的区域 buffer.clear(); //要加上上次未处理的数据 int readSize = position + temp.length; byte[] readByte = new byte[readSize]; System.arraycopy(temp, 0, readByte, 0, temp.length); System.arraycopy(bs, 0, readByte, temp.length, position); int start = 0; int columnByteSize = 0; byte[] columnByte = new byte[0]; int columnSplitIndex = 0; int itemSplitIndex = 0; for (int i = 0; i < readSize; i++) { columnByteSize++; if (readByte[i] == columnSplitByte[columnSplitIndex]) { columnSplitIndex++; if(columnSplitIndex==columnSplitLen){ columnByteSize = columnByteSize-columnSplitLen; columnByte = new byte[columnByteSize]; System.arraycopy(readByte, start, columnByte, 0, columnByteSize); String column = new String(columnByte, encoding); System.out.println(columnIndex+"\t"+column); columnIndex++; start = i + 1; columnByteSize = 0; columnSplitIndex = 0; } } else { columnSplitIndex = 0; } if (readByte[i] == itemSplitByte[itemSplitIndex]) { itemSplitIndex++; if(itemSplitIndex==itemSplitLen){ columnByteSize = columnByteSize-itemSplitLen; columnByte = new byte[columnByteSize]; System.arraycopy(readByte, start, columnByte, 0, columnByteSize); String column = new String(columnByte, encoding); System.out.println(columnIndex+"\t"+column); System.out.println(itemIndex+"=========="); columnIndex=0; itemIndex++; start = i + 1; columnByteSize = 0; itemSplitIndex = 0; } } else { itemSplitIndex=0; } } // 把剩余的放入临时数组中 temp = new byte[columnByteSize]; System.arraycopy(readByte, start, temp, 0, columnByteSize); } //处理临时数组中的数据 System.out.println("temp.length="+temp.length); if(temp.length>0){ String column = new String(temp, encoding); System.out.println(columnIndex+"\t"+column); } } catch (Exception e) { e.printStackTrace(); } finally { if (fc != null) { try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } if (raf != null) { try { raf.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { long t1 = System.currentTimeMillis(); String columnSplit = "|"; String itemSplit = "\n"; int bufferSize = 48; String encoding = "GBK"; String filePath = "d:/data/a1.txt"; //readByLine(filePath,encoding,bufferSize); //readByItem(filePath,encoding,bufferSize,itemSplit); readByItem(filePath,encoding,bufferSize,itemSplit,columnSplit); long t2 = System.currentTimeMillis(); System.out.println("time==="+(t2-t1)); }}
写文件
package com.syz.test.nio;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.text.SimpleDateFormat;import java.util.Date;public class DataWriter { public static void main(String[] args) { long t1 = System.currentTimeMillis(); write(); long t2 = System.currentTimeMillis(); System.out.println("time==="+(t2-t1)); } public static void write() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String date = sdf.format(new Date()); StringBuffer sb = new StringBuffer(); int bufferSize = 1024; String encoding = "UTF-8"; String filePath = "d:/data/a_"+date+".txt"; RandomAccessFile raf = null; FileChannel fc = null; try { raf = new RandomAccessFile(filePath, "rws"); fc = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(bufferSize); int count = 0; for(int i=0;i<10;i++){ sb = new StringBuffer(); sb.append("20170410_"+i); sb.append("|"); sb.append("127.0.0.1"); sb.append("|"); sb.append("测试中文"); sb.append("|"); sb.append("www.xxx.com"+date+"_"+i); sb.append("|"); sb.append(""); sb.append("|"); sb.append(""); sb.append("|"); sb.append("测试中文222abc"); sb.append("|"); sb.append("测ha"); sb.append("|"); sb.append(""); sb.append("|"); sb.append("2017-03-02"); sb.append("|"); sb.append("2017-03-02"); sb.append("|"); sb.append("2017-03-02"); sb.append("|"); sb.append("22haa测试"); sb.append("|"); sb.append("abc123"); sb.append("\n"); String data = sb.toString(); byte[] dataByte = data.getBytes(encoding); int dataLen = dataByte.length; for(int j=0;j<dataLen;j++){ if(count==bufferSize){ buffer.flip(); int a = fc.write(buffer); System.out.println("a="+a); buffer.clear(); count=0; } buffer.put(dataByte[j]); count ++; } } buffer.flip(); //写入最后一点儿 int b = fc.write(buffer); System.out.println("b="+b); } catch (Exception e) { e.printStackTrace(); }finally{ if(fc!=null){ try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } if(raf!=null){ try { raf.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
阅读全文
0 0
- nio按行读文件
- 备份:nio文件读写
- 使用NIO复制文件
- java nio 文件锁小例
- NIO文件读写操作
- java nio 文件锁小例
- Java NIO 写文件
- JAVA NIO 文件保存
- NIO 复制文件。
- NIO文件下载
- NIO文件变更通知
- 文件NIO学习体会
- Java nio 传输文件
- NIO拷贝文件
- java文件io、nio
- NIO复制文件
- Java NIO 读写文件
- 使用NIO读写文件
- 查找兄弟单词
- 最大子数组和算法(Java实现)
- oracle chr()(附常用字符与ascii对照表)
- 脚本的最大优势,就是简化工作步骤提高工作效率,你看出来了吗?有没有看到这段代码的作用呢?
- 【OpenGL】安装配置
- nio按行读文件
- ButterKnife 8.2.1的使用
- IOS隐藏tabbar
- C++数据结构与算法——麻将胡牌算法(二:完全胡牌算法)
- 函数顺序点分析和可变参数函数
- 第一个Shell脚本
- 差生学什么?
- 关于JavaScript的空字符问题
- java冒泡排序