黑马程序员---java基础-Java之IO
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、概念
1、概念
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按流向分为两种:输入流,输出流。
流按操作类型分为两种:字节流与字符流。 字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。
2、常用基类
字节流的抽象基类:
InputStream ,OutputStream
字符流的抽象基类:
Reader , Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
注意: InputStreamReader 是字符流, 可以从字节流中读取字符
IO流使用步骤:
使用前,导入IO包中的类
使用时,进行IO异常处理
使用后,释放资源
3、异常处理
<1.凡是能和设备上的数据发生关联的,调用底层资源的都会发生IOException。
<2."K:\\demo.txt"没有K盘,会抛出出FileNotFoundException(系统找不到指定的路径) 异常。
FileNotFoundException是IOException的子类。
<3.初始化抛出异常,说明初始化失败,fw还为空,故不可调用对象的close()方法,
所以抛出NullPointerException异常,finally中一定要对关闭的流对象进行不等于 空的判断。
二、字符流文件读写
1、字符流读写文件
<1.读取文件
定义字符流关联指定文件
FileReader reader = new FileReader("Test.txt");
读取一个字符,返回int,该字符的码表值
int ch = reader.read();
关闭流,释放资源
reader.close();
<2.写出文件
定义字符输出流关联指定文件
FileWriter writer = new FileWriter("Test.txt");
写出一个字符,接收int码表值
writer.write(97);
关闭流,释放资源
writer.close();
注意事项
<1.文件路径
定义文件路径时Windows中的目录符号为“\”,但这个符号在Java中是特殊字符,需 要转义。
可以用“\\”或“/”表示。
<2.读取文件
读取文件时必须保证文件存在,否则将抛出FileNotFoundException。
<3.写出文件
写出时文件如不存在时程序会创建新文件,如文件已存在则会清空原文件内容重新写入。
如需追加内容可调用FileWriter构造函数FileWriter(String fileName, boolean append),传入true之后则不会清空原有文件
2、字符流缓冲区读写文件
自定义缓冲区读写
为什么定义缓冲区
由于单个字符读写需要频繁操作文件,所以效率非常低。
我们可以定义缓冲区将要读取或写出的数据缓存,减少操作文件次数。
<1.缓冲区读取
先定义一个数组,然后调用FileReader读取一个数组的方法。
int read(char[] cbuf)
<2.缓冲区写出
将要写出的数据存放在数组中,调用FileWriter方法,一次写出一个数组。
void write(char[] cbuf,int off, int len)
内置缓冲区的BufferedReader和BufferedWriter
Java提供了带缓冲功能的Reader和Writer类:BufferedReader,BufferedWriter
这两个类都是提供包装功能,需要提供其他流来使用,给其他流增加缓冲功能
当我们调用BufferedReader读取数据时,程序会从文件中一次读取8192个字符用来缓冲
当我们调用BufferedWriter写出数据时,程序会先将数据写出到缓冲数组,直到写满8192个才一次性刷出到文件中
例:
1 //现有一个程序是一个试用程序, 2 //每次启动提示剩余次数,如果执行了10次.提示已到期. 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 public classExercise4{ 8 public static void main(String[] args)throws IOException { 9 BufferedReader br = new BufferedReader(newFileReader("times.txt")); //定义BufferedReader 10 String line = br.readLine(); //从times.txt读取一行文本 11 br.close(); // 关闭流, 释放资源 12 int times =Integer.parseInt(line); //把String转为int, Integer.parseInt() 13 if (times > 0) { //如果次数大于0 14 System.out.println("欢迎试用Xxx软件,剩余使用次数: " + --times +"次"); //打印次数,并且-1 15 FileWriter fw = newFileWriter("times.txt");//定义FileWriter 16 fw.write(times+ ""); //把次数转为String,写出次数. 17 fw.close(); // 关闭流 18 }else 19 System.out.println("软件已到期!"); 20 } 21 }
三、装饰设计模式(Decorator)
当我们需要对一个类的功能进行改进、增强的时候会使用装饰设计模式.
格式:
含有被装饰类的引用
通过构造函数传入被装饰类对象
和被装饰类含有同样的方法,其中调用被装饰类的方法,对其进行改进、增强
和被装饰类继承同一个类或实现同一个接口,可以当做被装饰类来使用
BufferedReader、BufferedWriter都是装饰类,他们可以装饰一个Reader或Writer,给被装饰的Reader和Writer提供缓冲的功能。
就像我们用BufferedReader、BufferedWriter装饰FileReader和FileWriter,使用的读写功能还是FileReader和FileWriter的,但给这两个类的读写添加了缓冲功能
四、字节流
1、字节流
基本操作与字符流相同
字节流可以操作任意类型数据
1 //拷贝一个Jpg文件 2 package com.itheima.io.test 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 public class Demo5_CopyByArray { 8 public staticvoid main(String[]args)throws IOException { 9 FileInputStream fis = new FileInputStream("ts.jpg"); 10 FileOutputStream fos = new FileOutputStream("F:/ts.jpg"); 11 // 定义一个较小的缓冲区(1KB), 提高效率又不太占内存 12 byte[] buffer =newbyte[1024]; 13 // 该变量用来记录每次拷贝的字节个数 14 int len; 15 // 从文件中读取数据到数组,len记住个数, 判断如果不是文件末尾(-1) 16 while ((len = fis.read(buffer)) != -1) { 17 //将数组中的数据写出,从0号索引写出len个 18 fos.write(buffer,0, len); 19 } 20 fis.close(); 21 fos.close(); 22 } 23 }
五、字节流缓冲区文件读写
自定义缓冲区读写
原理和字符流相同,都是为了提高效率
定义数组缓冲数据,一次读取一个数组,一次写出一个数组,减少操作文件的次数
BufferedInputStream、BufferedOutputStream
和BufferedReader、BufferedWriter原理相同,都是包装类
BufferedInputStream、BufferedOutputStream包装InputStream和OutputStream提供缓冲功能
读取键盘输入:
<1.读取键盘录入:
System.out:对应的是标准输出设备,控制台。
System.in :对应的是标准输入设备:键盘。
<2. in
public static final InputStream in
“标准”输入流。此流已打开并准备提供输入数据。
通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 public class Demo{ 6 public static void main(String[] args) throws IOException { 7 //获取键盘录入对象 8 InputStream inputStream=System.in; 9 //将字节流对象转成字符流对象,使用转换率,inputStreamReader 10 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); 11 //为了提高效率,将字符流串进行缓冲区技术高效操作,使用BufferedReader 12 BufferedReader bufferedReader=new BufferedReader(inputStreamReader); 13 String lineString=null; 14 while ((lineString=bufferedReader.readLine())!=null) { 15 if ("over".equals(lineString)) { 16 break; 17 } 18 System.out.println(lineString.toUpperCase()); 19 } 20 bufferedReader.close(); 21 } 22 }
转载于:https://www.cnblogs.com/ZkSnug/p/4457584.html
黑马程序员---java基础-Java之IO相关推荐
- 黑马程序员----0704期java基础班心得
------<a target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 黑马程 ...
- 黑马程序员_基础测试
-------android培训.java培训.期待与您交流! ---------- 黑马程序员训练营基础测试题及个人代码(包含思路.步骤和基本注释) 1. 编写程序计算12+22+32+....+1 ...
- 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...
看黑马程序员Python基础班视频挺好,犹豫该不该报班? 如果看视频比较好的话,还是建议自学吧,毕竟录制视频的老师不一定参与实质的讲课,且能自学也省一笔培训费用了.我是看的bilibili上黑马程序员 ...
- 黑马程序员-iOS基础-Objective-C基础(六)内存管理
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序员-iOS基础-Objective-C基础(六)内存管理 一.内存管理的必要性 移动设备 ...
- 黑马程序员-黑马程序员训练营基础测试
---------------------- ASP.Net+Unity开发. .Net培训.期待与您交流! ---------------------- 为了帮助更多的人了解黑马,让更多想知道黑马测 ...
- 黑马程序员 一、java 概述与基础知识
获取更多资源关注Java帮帮IT资源分享网 一.黑马程序员-java 概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程. 为了使 ...
- 黑马程序员 C++ 基础语法入门 学习记录
基础语法入门 文章目录 一.初识C++ 1.1 新建项目 1.2 编写项目 1.3 运行程序 1.4 注释 1.5 变量 1.6 常量 1.7 关键字 1.8 标识符命名规则 二.数据类型 2.1 整 ...
- 黑马程序员——JavaScript基础1(初识 JavaScript)
文章目录 一.初识 JavaScript 1.1 JavaScript 是什么 1.2 JavaScript 的作用 1.3 HTML/CSS/JS 的关系 1.4 浏览器执行 JS 简介 1.5 J ...
- 黑马程序员___Java基础[02-Java基础语法](一)
Java语言基础组成 一.关键字 1)定义:被Java语言赋予了特殊含义的单词 2)特点:关键字中所有字母均为小写 3)作用及分类: 下面是Java语言保留专用的50个关键字: 用于定义数据类型的关键 ...
- 黑马程序员_基础知识
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
最新文章
- ArrayList集合为什么不能使用foreach增加、删除、修改元素
- Centos7创建用户并授予sudo权限
- BZOJ 2429: [HAOI2006]聪明的猴子【最小生成树】
- 解决第一个div浮动,后面div覆盖的问题
- nginx日志自动切割
- Yii2 的 redis 应用
- FFMPEG结构体分析之AVStream
- Windows Tftpd32 DHCP服务器 使用
- java实现飞机大战游戏
- 【js Date】时间字符串、时间戳转换成今天,明天,本月等文字日期
- 06.Android之消息机制问题
- 【重点】commons-dbutils
- TOC约束理论AUTOCAD技巧
- 第 25 章 基于小波变换的数字水印技术
- 基本遗传算法(GA)详解
- 学习Bash shell编程资料推荐
- PDF添加图片(图片透明)
- 一款陌生人状态社交软件--same
- 单身程序员上班路上二三事(一)
- scrollView无限滚动,横屏和竖屏
热门文章
- 崩坏3服务器维护2月8号,崩坏38月2日版本更新维护通知_游戏堡
- c4d语言包英文,Maxon Cinema 4D R23(C4D R23)中英文安装及设置详细教程(附下载)
- 大前端CPU优化技术--NEON技术
- 盛世昊通解析为什么你买不到想要的新能源汽车
- BeanUtils.populate的作用
- 法外狂徒——格雷福斯
- mysql 5.6 64 位安装 缺少libai.so_CentOS6.7安装部署LNMP(nginx1.8.0+php5.6.10+mysql5.6.12) 法外狂徒...
- 构建一阶谓词逻辑和有限域上多项式方程的同构
- jsp:session的跟踪方式
- C#中调用OCX控件