A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李厚斌 于 2014-3-31 14:43 编辑

io流。。的read机制是什么机制啊。。即便再局部内没读完。。当再次调用的时候会接着继续读。难不成是read的特有机制。。没完全读完。会接着继续读?
  1. class MyStringBuffer

  2. {

  3.         private FileReader f;

  4.         MyStringBuffer(FileReader f)

  5.         {
  6.                 this.f=f;
  7.         }
  8.         public String myLine() throws IOException
  9.         {
  10.                 StringBuilder sb=new StringBuilder();
  11.                 int num=0;
  12.                 while((num=f.read())!=-1)
  13. //难不成是read的特有机制。。没完全读完。会接着继续读?
  14.                 {
  15.                         if(num=='\n')
  16.                                 return sb.toString();
  17.                         String m=sb.toString();
  18.                         System.out.println("sb===="+sb.toString());
  19.                         if(num=='\r')
  20.                                 continue;
  21.                         else
  22.                                 sb.append((char)num);
  23.                 }

  24.                 if((sb.length())!=0)
  25.                         return sb.toString();
  26.                 System.out.println("sb=="+sb.toString());
  27.                 return null;
  28.         }
  29.         public void myClose() throws IOException
  30.         {
  31.                 f.close();
  32.         }
  33. }

  34. class Demo
  35. {
  36.         public static void main(String[] args)throws IOException
  37.         {
  38.                 FileReader fr=new FileReader("g.txt");
  39.                 MyStringBuffer mbf=new MyStringBuffer(fr);
  40.                 String line=null;
  41.                 while((line=mbf.myLine())!=null)
  42.                 {
  43.                         System.out.println(line);
  44.                 }
  45.                
  46.                 mbf.myClose();
  47.         }
  48. }


  49. class Demo
  50. {
  51.         public static void main(String[] args)throws IOException
  52.         {
  53.                 FileReader fr=new FileReader("g.txt");
  54.                 int ch=0;
  55.                 while((ch=fr.read())!='e')
  56.                 {
  57.                         System.out.println((char)ch);
  58.                 }
  59.                 while((ch=fr.read())!=-1)
  60.                 {
  61.                         System.out.println((char)ch);
  62.                 }
  63.         }
  64. }
  65. read的特有机制。

  66. 2.
  67. class Demo
  68. {
  69.          public static void main (String[] args)throws IOException
  70.          {
  71.                 BufferedReader br=new BufferedReader(new FileReader("2.txt"));
  72.                 BufferedWriter bw=new BufferedWriter(new FileWriter("12.txt"));
  73.                 String line=null;
  74.                 int x=0;
  75.                 while((line=br.readLine())!=null)
  76.                  {   
  77.                         if(x!=0)//多个换行。
  78.                         bw.newLine();
  79.                         x++;
  80.                         bw.write(line);
  81.                         bw.flush();        
  82.                  }
  83.                 bw.close();
  84.                 br.close();

  85.          }

  86. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

7 个回复

正序浏览
read不是你说的特有机制, while((num=f.read())!=-1)是根据你使用的流来决定读取的方式的,字节流就是一字节一字节读,字符流就是按字符流读取即两字节一次的读;当读到文件的末尾时,会返回-1;这里不等于-1就是当文件没到末尾就一直循环读取啊
回复 使用道具 举报
read()方法在JDK API的描述是这样的:读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。 也就是说read()方法一次读取一个字符,读到流的末尾时才结束。到达流结尾是返回-1;
Windows下的回车使用”\r\n“表示,不是应该先判断num=='\r'吗?

回复 使用道具 举报
  1. read
  2. public int read()
  3.          throws IOException读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
  4. 用于支持高效的单字符输入的子类应重写此方法。


  5. 返回:
  6. 作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
  7. 抛出:
  8. IOException - 如果发生 I/O 错误
复制代码
回复 使用道具 举报
read()中有个指针,他会记录当前读指针的位置,如果读了一次没有读完,指针记录当前读取到的位置,下次再调用此方法时会从指针标记的位置开始读取

评分

参与人数 1黑马币 +2 收起 理由
枫儿 + 2 赞一个!

查看全部评分

回复 使用道具 举报
每一行的读取,如果返回值不等于-1的时候,read会 继续读取,知道到这行的最后一个字符;
然后判定num是否到了换行处,如果读到了会读取下一行。
回复 使用道具 举报
while((num=f.read())!=-1)中read()方法一次只读一个字符,如果没读到结尾会接着上一次的位置接着读,当读到结尾时返回-1,readline()方法则是可以识别换行符,当读到换行符时这一行读取结束,返回读到的数据,返回的值不包括换行符,
回复 使用道具 举报
read方法就是这样,一次读一个字符,下一次继续上一次的地方再读取。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马