java新手,IO部分基础问题,为啥能用While语句循环读取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java新手,IO部分基础问题,为啥能用While语句循环读取?相关的知识,希望对你有一定的参考价值。

请看while 循环那个地方,他读取了第一个字符,不是转行,让后输出了第一个字符。那么为什么接下来去判断第二个字符了?没有代码让他去执行那样的东西啊,难道while循环默认能和他配合这样做? package IO; import java.io.*; /* * 代码是将 键盘输入的东西,放到一个text文本中,文本默认在包的根目录下。 * 不断运行文件,新的信息会覆盖原来的。 * 不用文本了,就把它关掉。老是忘记 * 要写异常处理。 */ public class 如何把文本输出到Text文本中 public static void main(String[] args) // TODO 自动生成的方法存根 FileInputStream fin;// 声明一个全局的FileInputStream对象,构建输入通道 FileOutputStream fout;// 声明一个全局的FileOutputStream对象,构建输出通道。 int ch; // 声明一个整型的变量用来读取用户输入的字符。 try fin = new FileInputStream(FileDescriptor.in); fout = new FileOutputStream("output.text"); while ((ch = fin.read()) != '\r') //判断:不断读取下一个字符,直到用户输入换行 fout.write(ch);//输出:不断输出下一个字符,只当判断不成立。 fin.close(); fout.close(); catch (FileNotFoundException e) //处理异常 System.out.println("文件没有找到"); catch (IOException e) //这个异常是必须的。 // TODO 自动生成的 catch 块 System.out.println("输入有误!"); 在线等!

参考技术A 如果while的循环条件一直成立,就会一直执行循环体,然后在判断条件,当没有输入与/r匹配的时候,就会一直的循环的读取字符,直到输入了与/r匹配的字符,就会退出循环。 参考技术B 因为你在
while
((ch
=
fin.read())
!=
'\r')
//判断:不断读取下一个字符,直到用户输入换行
这个中,ch=fin.read()这个是不断的读取文件中的内容,直到内容结束。
参考技术C 你可以认为有一个指针,开始的时候在文件头,每次从指针处读取,读完了指针就后移
对于指针也有方法可以操作的

Java基础部分(Java异常与Java IO/NIO)

1.异常

1.1 什么是异常

1.2异常体系结构

1.3 java异常处理机制,如何处理异常

1.4 怎么自定义异常


原文链接:https://blog.csdn.net/strivenoend/article/details/116487275
链接: 参考链接.
链接: java入门学习路径.

2. 接口与抽象类的区别

链接: 接口与抽象类.

3. Java IO (含IO多路复用)

3.1 字节流、字符流


字节流继承于InputStream和OutputStream
字符流继承于InputStreamReader和OutputStreamWriter
文件类 FileInputStream 和 FileOutputStream

3. 2 IO多路复用

3.2.1. select函数

  1. 可监听的文件描述符的个数说受限的。bitmap 1024位(内核规定的)
  2. 客户端操作服务器时就会产⽣这三种⽂件描述符(简称fd):writefds(写)、readfds(读)、和 exceptfds(异常)。select会阻塞住监视3类⽂件描述符,等有数据、可读、可写、出异常 或超 时、就会返回;返回后通过遍历fdset整个数组来找到就绪的描述符fd,然后进⾏对应的IO操 作。
  3. 优点: ⼏乎在所有的平台上⽀持,跨平台⽀持性好
  4. 缺点: 由于是采⽤轮询⽅式全盘扫描,会随着⽂件描述符FD数量增多⽽性能下降。 每次调⽤ select(),需要把 fd 集合从⽤户态拷⻉到内核态,并进⾏遍历(消息传递都是从 内核到⽤户空间) 默认单个进程打开的FD有限制是1024个,可修改宏定义,但是效率仍然慢。

3.2.2. poll函数

基本原理与select⼀致,只是没有最⼤⽂件描述符限制,因为采⽤的是链表存储fd。

3.2.3. epoll函数

epoll之所以⾼性能是得益于它的三个函数

  1. epoll_create()系统启动时,在Linux内核⾥⾯申请⼀个B+树结构⽂件系统,返回 epoll对象,也是⼀个fd。
  2. epoll_ctl() 每新建⼀个连接,都通过该函数操作epoll对 象,在这个对象⾥⾯修改添加 删除对应的链接fd, 绑定⼀个callback函数。
  3. epoll_wait() 轮训所有的callback集合(就绪的数据),并完成对应的IO操作
    优点: 没fd这个限制,所⽀持的FD上限是操作系统的最⼤⽂件句柄数,1G内存⼤概⽀持10万个句柄 效率提⾼,使⽤回调通知⽽不是轮询的⽅式,不会随着FD数⽬的增加效率下降 内核和⽤户空间mmap同⼀块内存实现。

3.2.4 selcet 与 epoll区别

select函数采用的有一个rset参数,采用的bitmap结构 1024位,每次调用需要将bitmap拷贝到内核,就绪的数据拷贝返回给用户态,哪一位置为1, 说明这位对应的socket是就绪的。太麻烦了 如果前700个都为0,也需要去依次查找。
epoll函数
通过epoll_ctl 将需要关注的socket注入到epoll对应的一块空间(epoll 监听的列表中),将就绪列表中的(另外一块空间)就绪数据拷贝给用户态,不需要按位去检查。
优势2: select函数最多1024个socket。

以上是关于java新手,IO部分基础问题,为啥能用While语句循环读取?的主要内容,如果未能解决你的问题,请参考以下文章

给Java新手的一些建议----Java知识点归纳(Java基础部分)

给Java新手的一些建议——Java知识点归纳(Java基础部分)

给Java新手的一些建议——Java知识点归纳(Java基础部分)

给Java新手的一些建议——Java知识点归纳(Java基础部分)

Java基础部分(Java异常与Java IO/NIO)

java变量命名中为啥能用中文