IO流基础
IO流,也称为数据流,用于处理设备之间的数据传输。
JAVA对数据的操作就是通过流的方式,而流分为两种:字符流,字节流
字符流:
可以内部制定码表,处理文字很方便,字符流里的基类是Reader,Writer
字节流:
操作字节数据。和字符流差不多,基类是InputSteram,OutputStream,如果不使用缓冲区,不需要flush()方法,查看父类方法,使用子类建立对象。
IO包中子类名称后缀就分明了字节流和字符流,前缀说明了功能,缓冲区的出现是为了提高流的效率,在创建缓冲区之前要先有流对象,只要用到缓冲区就要用到flush()刷新方法。关闭缓冲区就会关闭缓冲区中调用的流对象。
bufferedWriter缓冲区提供跨平台换行符方法newLine();
bufferedReader缓冲区提供一次读取一个文本行的方法readLine();不包含终止符,读到文件末尾返回null,加强了原有功能,如果想提高效率就使用缓冲区,Bufferedxxx。
装饰设计模式:
当想要对已有的对象进行功能增强时,定义一个类将已有对象传入,基于已有功能,提供加强功能,那么这个自定义的类就称为装饰类,装饰模式比继承要灵活,避免继承体系臃肿,降低类与类的关系,装饰类和被装饰类通常是一个体系的。
因为增强已有对象,具备的功能和已有的是相同的,只不过是加强功能,通常通过构造方法(接收被装饰的对象),基于传入对象的功能提供更强的功能方法。
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成
1,明确源和目的。
源:输入流。InputStream Reader。
目的:输出流。OutputStream Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘。
目的设备:内存,硬盘,控制台。
流操作的只有数据,而数据最明显的体现形式就是文件,而文件包含很多信息,属性,想操作文件的话,java就把文件封装成了对象File类,方便对文件或者文件夹的属性进行操作。
properties是Hashtable的子类,具备Map集合的特点,存储的键值对都是字符串,是集合中和IO技术结合的容器,用于键值对形式的配置文件。
字节流的两个顶层父类:
1.InputStream 2.outputStream
字符流的两个顶层父类:
1.Reader 2.Writer
这些体系的子类都是已父类名做为后缀,而前缀是该对象的功能。
字符流:
简单例子:将一个字符串写入到文件中
//创建一个可以往文件中写入字符数据的字符流输出对象
FileWriter fe = null;
try {
//在创键对象时必须要明确该文件的存储目的地
//如果目的地存在该文件,则会被覆盖
//如果构照文件中加入true,则可以对文件进行续写
fe=new FileWriter("F:/1.txt",true);
//调用write写入数据
fe.write("asjhgfajkshgfaksjdfg");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {//关闭流,关闭资源,在关闭前会调用flush();刷新缓冲区
fe.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//将硬盘中的文件读取然后输入到控制台中:
//1.创建读取流对象
FileReader fr=null;
try{
//2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
fr=new FileReader("f:/1.txt");
int aa=0;
while((aa=fr.read())!=-1){
System.out.println((char)aa);
}
. . . .. . . .
//用数组读取文件:
//1.创建读取流对象
FileReader fr=null;
try{
//2.在读取的时候一定要 被明确被读取的文件,确保这个文件存在,不然会发生异常
fr=new FileReader("f:/1.txt");
char [] ch=new char[1024];
int leng=0;
while((leng=fr.read(ch))!=-1){
System.out.println(new String(ch,0,leng));
}
如果字符串中需要换行,可以在字符串中加入常量:(根据系统资源获取对应的换行符)
private static final String LINE_SEPARATOR =System.getProperty("line.separator");
IO异常:在用读写流对象调用colse()的时候一定要加判断判断对象不等于null否则会抛空指针异常
字符流缓冲区对象:BuffredReader , BuffredWriter
在字符流缓冲区中:
newLine():写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。
Newline():只有BuffredWriter对象具备。
readLine():读取一个文本行,一次读取一行数据,遇到换行符就终止,返回读取到的字符串,如果读取到流的末尾就返回null。
readKine():方法只有BuffredReader具备。
使用方法:
public static void main(String[] args) throws IOException {
//字符流关联文件
FileReader fr=new FileReader("f:/1.txt");
FileWriter fw=new FileWriter("f:/2.txt");
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw=new BufferedWriter(fw);
char [] ch=new char[1024];
int leng=0;
//使用缓冲区读取数据,从缓冲区中读取数据
while((leng=br.read(ch))!=-1)
{
//使用缓冲区写入数据到内存中
bw.write(ch, 0, leng);
}
//关闭缓冲区,实际上就是关闭了流对象
br.close();
bw.close();
}
自定义缓冲区:
public class MybufferReader {
private Reader r;
//定义一个数组作为缓冲区
private char [] ch=new char[1024];
//定义一个指针用于操作数组中的元素,当操作到最后一个元素时指针归零
private int pos=0;
//定义一个计数器,用于记住缓冲区的数据个数,当缓冲区中数据减到零,就从源中继续获取数据到缓冲区中
private int count=0;
public MybufferReader(Reader r) {
this.r=r;
}
/*
该方法一次从缓冲区中取一个字符
*/
public int myReader() throws IOException
{
//从源中获取一批数据到缓冲区中,只有count为0时。
if(count==0)
{
count=r.read(ch);
pos=0;
}
//当源中的数据取完时候返回负一
if(count<0)
return -1; char ch1=ch[pos];//读取缓冲区中数据
pos++;//数组的指针+1
count--;//缓冲区中数据的个数-1
return ch1; }
public String myReaderLine() throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=myReader())!=-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 mycolse() throws IOException
{
r.close();
} }
装饰设计模式:
对一组对象的功能进行增强的时候,就可以使用该模式来解决问题。
例如:public class PersonDemo {
public static void main(String[] args) {
Person p=new Person();
p.chifan();
newperson p1=new newperson(p);
p1.chifan();
newperson2 p2=new newperson2();
p2.chifan();
}
}
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
//这个类的出现是为了增强Person的功能出现的
class newperson
{
private Person p;
//构造方法中传入Person对象
public newperson(Person p) {
this.p=p;
}
//增强chifan方法
public void chifan()
{
System.out.println("喝酒");
p.chifan();
System.out.println("吃甜点");
}
}
//这个类继承于Person
class newperson2 extends Person
{
public void chifan()
{
System.out.println("喝酒");
super.chifan();
System.out.println("吃甜点");
}
}
装饰设计模式和继承都能实现这一特点,特点:只为提高功能,进行的继承导致继承体系越来越臃肿,不够灵活,而装饰比继承灵活。
BufferedReader的子类LineNumberReader的基本使用。
例子: public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("ArrayListTest.java");
LineNumberReader lin=new LineNumberReader(fr);
String str=null;
//一次读取一行
while((str=lin.readLine())!=null)
{//输出行号和行内容
System.out.println(lin.getLineNumber()+":"+str);
}
}
IO流基础的更多相关文章
- Java 中级IO流基础及主要API编程
1. IO流基础知识,流 是字节从源到目的地的运行的轨迹,次序是有意义的, 字节会按照次序进行传递, 比如Hello World 在下图中的传递的轨迹.该图形象的解释了IO中流的概念.流中全是字节.2 ...
- 乐字节Java之file、IO流基础知识和操作步骤
嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...
- Java IO流基础总结
前言 好久不用Java的IO流,把好多的基础知识都忘了,昨天在写一段代码,发现好多细节都忘了.那天在组织组内代码评审的时候,发现有人在乱用IO流相关的类,所以还是写篇文章,把这个知识点总结一下. IO ...
- IO流-基础
//创建输出流对象 FileWriter fw = new FileWriter("d:\\a.txt"); /* * 创建输出流对象做了哪些事情: * A:调用系统资源创建了一个 ...
- IO流基础,创建File对象与方法是用
1.io流主要用途读取本地文件或服务器文件,进行本地或者服务器开呗工作 构造函数 绝对路径够构造方法: File f = new File("D:\\test\\a.txt&quo ...
- Java之IO流基础流对象
输入流和输出流是相对于内存设备而言 即将外设中的数据读取到内存中就是输入 将内存中的数据写入到外设中就是输出 字符流的由来: 其实就是:字节流读取文字字节数据后,不直接操作而是先查指 ...
- IO流基础加强
字节流对象:InputStream,OutputStream 缓冲字节流对象:BufferedInputStream , BufferedOutputStream 用法和字符流对象一样,但也有区别, ...
- java io 流基础
- Java中的IO流之输入流|乐字节
亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入 ...
随机推荐
- .net开源工作流引擎ccflow
关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...
- 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的期望
在关于离散型随机变量函数的期望的讨论中,我们很容易就得到了如下的等式: 那么推广到连续型随机变量,是否也存在类似的规律呢? 即对于连续型随机变量函数的期望,有: 这里给出一个局部的证明过程,完整的证明 ...
- 深入理解jvm之内存区域与内存溢出
文章目录 1. Java内存区域与内存溢出异常 1.1. 运行时数据区域 1.1.1. 程序计数器 1.1.2. java虚拟机栈 1.1.3. 本地方法栈 1.1.4. Java堆(Java Hea ...
- hud1856 并查集
Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...
- Quartz.Net任务调度框架
Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作. 相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上 ...
- mxGraph实现按住ctrl键盘拖动图形实现复制图形功能
实现这个功能很easy,仅仅须要重写moveCells方法就能够了.以下是源文件里的代码: mxGraph.prototype.moveCells = function(cells, dx, dy, ...
- 搭建docker私有仓库 笔记
抄送消息到企业微圈 avalon组件 twitterCopy/twitterCopy 说明 说明 说明 说明 说明 说明 该组件提供接口 开发者可以吧 有需要分享到微圈的的信息 发布到微圈中去. 应用 ...
- vim note(6)--vim的一个较全的介绍(转)
vim的配置文件 ~/.vimrc 用户的默认配置文件 ~/.vim/plugin/ 用户的默认脚本文件的存放文件夹 ~/.vim/ftplugin/ 用户的默认文件类型相关脚本文件的 ...
- 一个备份MySQL数据库的简单Shell脚本(转)
Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反 ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...