




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaSE 输入流详解 最近在复习 JSP Java server page 用过 Java 语言实现动态网站的 技术 复习到通过前端页面输入文件的标题和内容 点击提交后将 文件保存在本地的小实例 发现 IT 行业的技术都是一环扣一环的 如 果能够扎实的掌握了基本功和内部原理 那么后面的学习会更加的轻 松 自己也会有更高的成就感 相反 如果前面的基础知识掌握的不 够牢固 后面学习更多的技术 只会给自己带来更大的打击 后端业务逻辑代码 base href My JSP saveFileSuccessful jsp starting page contentArea width 50 margin 20px auto text align left border 1px solid red padding 10px 写入成功 while sc hasNext buf append sc next append sc close 返回 在后端业务逻辑代码中发现了之前复习 JavaSE 部分时 关于如何通过 输入输出流向文件中写入数据和从文件中读取数据的知识在动态网站 的开发过程中也会完整的用到 而且学习一门技能不应该浅尝辄止的学了皮毛 就好像学武术 不能 只学习那一招一式 还应该理解这些招式在什么情况下应用 只有懂 得其中的原理道理 才会在日后信手拈来 游刃有余 那么我就给大家详细的解释其中的原理 李老师讲堂开讲啦 首先回到 JavaSE 部分 给大家一个简单的实例 整数与字符之间的转换 public class IntCharTransform public static void main String args char c a int ascii System out println 直接输出字符 c ascii int c System out println 得到 a 的 ASCII 编码 ascii System out println 通过 ASCII 码的强制类型转换 直接输出字符 char 97 运行结果 直接输出字符 a 得到 a 的 ASCII 编码 97 通过 ASCII 码的强制类型转换 直接输出字符 a 通过这个小例子可以发现 字符类型其实和整数类型之间有着一一对 应的关系 那么连接这个关系的东西就是字符的 ASCII 编码 计算机 原理中用 7 位二进制数来表示键盘上每个字符的 ASCII 编码 而一个 字节是 8 位二进制数 所以在计算机中 用一个字节就可以表示英语 世界的所有字符 而中文则比较复杂 本身中文的文字就比较多 所 以一个字节就不够用 那么伟大的中华民族就用 2 个字节来表示我们 祖先创造的伟大的汉字 那么问题就出现了 在代码中 如果程序是按照一个字节一个字节的 读取文件中的数据 那么不做任何的加工 读取出来的内容就会是乱 码 请看下面的例子 我在本地事先保存了一个文本文件 内容如下 第一行是中文 第二行是短横线字符 其他是中文字符 那么我用之前微信里发布的程序来读取中文 就会有问题 package wechat import java io File import java io FileInputStream import java io InputStream public class ReadContentFormFile public static void main String args throws Exception File separator 会自动识别程序所运行的操作系统中的 文件路径分隔符 因为 windows 和 Linux 的文件分割符不同 为了使 得 Java 程序能够在不修改的情况下跨平台运行 就要调用 File 类中的 separator 属性 File file new File d File separator info txt 实例化一个字节输入流 FileInputStream 用于从文件 中读取内容 InputStream in new FileInputStream file 定义一个整形变量 用于接收读取出来的字符的 ASCII 码 int temp while temp in read 1 System out print char temp 记得关闭输入流 节省系统资源 CPU 内存 in close 运行结果 D info txt 从结果中我们发现 只有字符和英文可以正常读取出来 但是中文就 变成了乱码 这是什么原因呢 问题就在输入流的 read 方法 这是关于 InputStream 字节输入流的 read 方法的介绍 Reads the next byte of data from the input stream The value byte is returned as an int in the range 0 to 255 If no byte is available because the end of the stream has been reached the value 1 is returned This method blocks until input data is available the end of the stream is detected or an exception is thrown 有图有真相 为了看的清楚 我认为的给每个字节的 ASCII 码 中间加入了空格 Read 方法读取的文件中的每一个字节 那么等这个方法第一次运 行时 指针会指向第一个字节 读取出这个字节的 ASCII 码 读取出 来这个 ASCII 码后这个指针就会自动的移动到后一个字节上去 以此 类推 那么对于英文 正好每次读取一个英文字母的 ASCII 码 对于 字符也是如此 对于中文 每次其实读取的是半个中文字符 所以当 读取完全部的 ASCII 码后 如果不做任何处理 则系统也不知道是拼 接哪两个字节的 ASCII 码 所以就会产生乱码 当指针读取完最后一 个字符后 在运行 read 方法 指针就会指向一个空的位置上 读 不到任何数据 则返回 1 表示指针已经移动到了尾部 数据全部读 取完毕 所以在程序中的 while 循环的判断条件中 以 read 方法的返回值 不等于 1 为继续循环的条件 这种按照字节读取信息的方式处理字节很合适 InputStream 和它的 子类 FileInputStream 本身就是字节输入流 他们的对象的 read 方法就是按照字节进行读取的 但是处理大量中文则显得太麻烦 Java 还提供了一个字符流的类 Reader 和它的子类 FileReader package wechat import java io File import java io FileReader import java io Reader public class FileReaderDemo public static void main String args throws Exception File separator 会自动识别程序所运行的操作系统中的 文件路径分隔符 因为 windows 和 Linux 的文件分割符不同 为了使 得 Java 程序能够在不修改的情况下跨平台运行 就要调用 File 类中的 separator 属性 File file new File d File separator info txt Reader reader new FileReader file int temp while temp reader read 1 System out print char temp 记得关闭输入流 节省系统资源 CPU 内存 reader close 程序运行结果 D info txt 杰出程序员永远都不会说的几句话 我习惯于使用 但我不知道它是如何工作 杰出的程序员源于自己的好奇心和不断的探索 这样才掌握了一项项 非凡的技能 他们会仔仔细细研究事物运作的原理 即使这些信息可 能永远也不会派上用场 目前我们还不知道这种深入挖掘是一种选择 意识还是强迫行为 但是这似乎已经成为了所谓人才的特质 可以运作 但是我不知道该如何解释 之所以形容他们杰出不但是因为他们知道如何解决问题 也包括他们 大多非常乐意给别人讲解如何起效的原因和过程 有时候 即使旁人 对此毫无兴趣 他们依然会如此喋喋不休 甚至于越是才华出众能力 卓绝 就越是时间讲得久 这下大家满意了吧 下面是字符流 Reader 中 read 方法的简介 Reads a single character This method will block until a character is available an I O error occurs or the end of the stream is reached Subclasses that intend to support efficient single character input should override this method Returns The character read as an integer in the range 0 to 65535 0 x00 0 xffff or 1 if the end of the stream has been reached 从介绍里我们能够看到 这个 read 方法的指针不再指向一个个的 字节了 而是一个个的字符 无论是英文还是中文字符 而且返回 int 整形值 但是返回的范围是 0 65535 65535 正好是 216 1 的值 注意 16 次方就是表示 16 位二进制数 也就是 2 个 8 位 也就是 2 字节 正好可以满足英文和中文的 ASCII 码 那么还有没有什么其他的方式 能更加简单快捷的把文件的内容全部 读取出来 并输出呢 有 程序的世界很丰富 你的需求早已有人想 到并帮你解决了 只要我们会利用即可 用 Scanner 类进行读取文件内容 package wechat import java io File import java util Scanner public class ScannerReadFileContent public static void main String args throws Exception File file new File d File separator info txt Scanner scan new Scanner file System out println scan next System out println scan nextLine 这两种方式不行 因为 Scanner 对象在读取内容时的 默认结束符为回车 换行 而且 next 方法在读取的时候碰到空 格和回车都会中断读取 nextLine 虽然读取一整行内容 但是当一行结束时 就会碰到回车换行 也会中断读取 所以如果不加判断直接输出 顶 多读取一行的内容 while scan hasNext System out println scan nextLine 程序运行结果 D info txt 杰出程序员永远都不会说的几句话 我习惯于使用 但我不知道它是如何工作 杰出的程序员源于自己的好奇心和不断的探索 这样才掌握了一项项 非凡的技能 他们会仔仔细细研究事物运作的原理 即使这些信息可 能永远也不会派上用场 目前我们还不知道这种深入挖掘是一种选择 意识还是强迫行为 但是这似乎已经成为了所谓人才的特质 可以运作 但是我不知道该如何解释 之所以形容他们杰出不但是因为他们知道如何解决问题 也包括他们 大多非常乐意给别人讲解如何起效的原因和过程 有时候 即使旁人 对此毫无兴趣 他们依然会如此喋喋不休 甚至于越是才华出众能力 卓绝 就越是时间讲得久 按照下面这个图来解释一下 Scanner 类的 hasNext 方法和 nextLine 方法 图中的 n 是我自己加上去的 表示回车换行 在文件中不会显示 但 是在文件的编码里面是存在的 这个换行也有字符编码 当 while 循环第一次循环开始的时候 scan 对象的指针其实指向的是 这个文件内容的开头的前面 在判断条件中有 scan hasNext 顾 名思义 这个指针的下一个位置有内容 返回 true 循环条件满足 指针马上指向了文件内容的第一行 进入循环体后执行 scan nextLine 读取一整行的内容 遇到回车换行结束读取 第一次循环结束后 进行第二次循环 这时指针仍然指向第一行 进 行了 hasNext 判断后 发现第二行是有内容的 就是这个 n 然 后指针来到第二行 进入循环体后 nextLine 方法读取第二行的内 容 第三次循环类似 循环完后指针停留在第三行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析卷人教版八年级物理上册第5章透镜及其应用-生活中的透镜专题测评试题(解析版)
- 难点解析人教版八年级物理上册第6章质量与密度-质量难点解析试卷(解析版)
- 2025年葡萄霜霉病绿色防控技术考核试卷
- 2025年互联网与信息技术岗位晋升考试数字人交互设计与应用数字人内容创作用户研究考核试卷
- 2025年急诊急救技术应用专项能力测试(新冠重症患者中医护理)考核试卷
- 考点解析人教版八年级物理上册第6章质量与密度-质量定向攻克试卷(附答案详解)
- 难点解析-人教版八年级物理上册第4章光现象专项测试试卷(含答案详解)
- 2025年建筑教育合同协议
- 2025临床医学综合能力(西医)考研专业型硕士专项模拟考核试卷
- 商铺如何装修合同(标准版)
- 2025版非婚生子女抚养权及监护协议范本
- 集团党建品牌创建工作实施方案公司国有企业
- 2025年市事业单位公开招考事业单位考试押题【附答案】
- 工厂采购业务知识培训课件
- 工地移动围挡租赁合同范本
- DG-TJ08-2205-2025 建筑信息模型技术应用标准(市政给水排水工程)
- 2025年知识产权竞赛题库及答案
- 2025年庆阳市辅警招考试题题库及答案
- 教师教龄管理办法
- 煤矿奖励管理办法
- ERP上线奖惩管理办法
评论
0/150
提交评论