企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
这几天再次学习了IO的相关内容,感觉比以前的思路更加清晰了点。 IO按照流的分类可以分为字节流(XXXStream)和字符流(XXXRreader、XXXWriter)。 字符流主要是操作文本文件,这个在读取文本文件时,比较常用写。 因此下面是关于字符流的一些读取方法。 FileWriter的方法: ~~~ import java.io.*; public class FileWriterDemo{ public static void main(String args[]){ //创建对象,传入一个true,表明不覆盖文件,在文件后面继续添加内容。 FileWriter fileWriter = null; try{ fileWriter = new FileWriter("demo.txt",true); fileWriter.write("hello"); }catch(IOException e){ System.out.println("catch:"+e.toString()); }finally{ try{ if(fileWriter!=null) fileWriter.close(); }catch(Exception e){ System.out.println("----"+e.toString()); } } } } ~~~ FileReader的方法 ~~~ /** 总结两种读取文件内容的方法。 */ import java.io.*; import java.lang.*; public class FileReaderDemo{ public static void main(String args[]){ String content = ReadByCharArray("demo.txt"); System.out.println(content); } //通过Read()方法来一个字符一个字符的读取 public static String ReadByOne(String fileName){ FileReader fileReader = null; StringBuffer sb = null; try{ fileReader = new FileReader(fileName); sb = new StringBuffer(); int ch = 0; while((ch=fileReader.read())!=-1){ sb.append((char)ch); } }catch(IOException e){ System.out.println("catch:"+e.toString()); }finally{ try{ if(fileReader!=null) fileReader.close(); }catch(Exception e){ System.out.println("----"+e.toString()); } } return sb.toString(); } //通过read(char[] ch)方法来读取字符数组 public static String ReadByCharArray(String fileName){ FileReader fileReader = null; String str = null; try{ fileReader = new FileReader(fileName); char[] ch = new char[1024]; int num = 0; while((num=fileReader.read(ch))!=-1){ str = new String(ch,0,num); } }catch(IOException e){ System.out.println("catch:"+e.toString()); }finally{ try{ if(fileReader!=null) fileReader.close(); }catch(Exception e){ System.out.println("----"+e.toString()); } } return str; } } ~~~ 带缓冲区的字符流BufferedReader及BufferedWriter的用法 ~~~ /** 为了提高文件的读写效率,java封装一个BufferReader和bufferWriter类。 作为文件的缓冲 BufferReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 BufferWriter: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 */ import java.io.*; public class BufferedReaderDemo{ public static void main(String args[]){ boolean flag = copyByBuffered("demo.txt","buf.txt"); System.out.println("复制成功:"+flag); } //通过ReadLine()方法来读取文件的一行数据 public static String ReadByReadLine(String fileName){ FileReader fileReader = null; StringBuffer sb = null; BufferedReader bufr = null; try{ fileReader = new FileReader(fileName); bufr = new BufferedReader(fileReader); sb = new StringBuffer(); String line = null; while((line=bufr.readLine())!=null){ sb.append(line); } }catch(IOException e){ System.out.println("catch:"+e.toString()); }finally{ try{ if(bufr!=null) bufr.close(); }catch(Exception e){ System.out.println("----"+e.toString()); } } return sb.toString(); } public static boolean copyByBuffered(String readFile,String writeFile){ boolean flag = false; BufferedReader bufr = null; BufferedWriter bufw = null; try{ //定义BufferedReader缓冲区,读取文件流 bufr = new BufferedReader(new FileReader(readFile)); //定义BufferedWriter缓冲区,向指定文件中写入。 bufw = new BufferedWriter(new FileWriter(writeFile)); String line = null; while((line=bufr.readLine())!=null){ bufw.write(line); bufw.flush(); flag =true; } }catch(IOException e){ e.toString(); }finally{ try{ if(bufr!=null&&bufw!=null){ bufr.close(); bufw.close(); } }catch(Exception e){ } } return flag; } } ~~~ 模拟BufferedReader中readLine()的实现方法 ~~~ /** 自定义一个MyBufferedReader类,模拟其中的readLine()方法。 一次读取一行数据,这个是基于read()方法来实现的。 自定义实现原理: 1、通过FileReader中的read()一个个读取文件中的字符。 2、将读取的字符存到StringBuilder中。 3、当读到\r时,不存入StringBuilder中,继续向下读取。 当\n时返回字符串, 4、为了简便,所有异常都抛出 这种自定义类,称为装饰设计模式 */ import java.io.*; class myBufferedReader{ private FileReader fr; public myBufferedReader(FileReader fr){ this.fr = fr; } public String myReadLine()throws IOException{ StringBuilder sb = new StringBuilder(); int ch = 0; while((ch=fr.read())!=-1){ if(ch=='\r') continue; if(ch=='\n') return sb.toString(); sb.append((char)ch); } if(sb.length()!=0) return sb.toString(); //读取到最后,返回空 return null; } //关闭流 public void myClose()throws IOException{ fr.close(); } } public class MyBufferedReaderDemo{ public static void main(String args[])throws IOException{ myBufferedReader mbr = new myBufferedReader(new FileReader("demo.txt")); String line = null; while((line=mbr.myReadLine())!=null){ System.out.println(line); } mbr.myClose(); } } ~~~ 模拟LineNumberReader中getLineNumber()的实现方法 ~~~ /** 模拟一个带行号的文件读取缓冲区。 实现思路: 1、mySetLineNumber(int number)方法用于设置从第number开始计数。 2、myGetLineNumber()获取读取文件的行号。 3、定义一个public int number = 0; 4、当遇到\n时,代表这行结束number++; */ import java.io.*; class myLineNumber extends myBufferedReader{ private int number=0; public myLineNumber(FileReader fr){ super(fr); } public void mySetLineNumber(int number){ this.number = number; } public int myGetLineNumber(){ return this.number; } public String myReadLine()throws IOException{ number++; return super.myReadLine(); } } public class LineNumberDemo{ public static void main(String []args)throws IOException{ myLineNumber mln = new myLineNumber(new FileReader("FileReaderDemo.java")); String line = null; mln.mySetLineNumber(20); while((line = mln.myReadLine())!=null){ System.out.println(mln.myGetLineNumber()+":"+line); } } } ~~~