IO流(一) 待续....

在学习中总结的知识点,希望被吐槽,只有这样才能发现问题和不足 。。。

system:不能被实例化类(说明里面的是静态成员),描述系统的相关信息
out:标准输出,默认是控制台
in: 标准输入,默认是键盘
获取/设置系统属性信息,Properties getProperties()/setProperties()
//因为Properties是maptable的子类,也就是map集合的子类对像。
//那么可以通过map方法取出该集合的元素。该集合存储的都是字符串数据。
可以在jvm启动时可以动态加载一些属性信息:在doc中 java -D 键值 文件

Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
可以通过 getRuntime 方法获取当前对象。

eg : Runtime r = Runtime.getRuntime();
Process p = r.exec("qq.exe");
p.destory();

Date :日期 Calendar

重点:IO流

1. 字符流基于字节流
2. OI的类名特点是:流的功能_流的父类名
3. 创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的对象。
而且该文件会在指定目录下,如果该目录下有同名文件将会被覆盖。
其实该步骤就是在明确数据要存放的目的地。
FileWriter file = new FileWriter("c:\demo.txt");
file.write("aaaa");
fw.flush();
//关闭流资源,但是关闭之前会刷新缓冲区的数据到目的地中。
//和flush的区别在于flush刷新,流还可以继续使用。close将会关闭流。
fw.close();

4. IO流异常处理
package xyxysjxy.io;

import java.io.FileWriter;
import java.io.IOException;

public class IOExceptionTest {
public static void main(String[] args) {
FileWriter fw = null ;
try {
//并且在已有的文件的末尾处进行数据续写.
fw = new FileWriter( "demo.txt",true );
//window中换行需要\r\n,而linux是\n
fw.write( "qwerr\r\n" );
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw != null )
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

6. 文件的读
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在就会抛出FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法,一个一个的读字符,而且会自动的往下读,返回整型,读到末尾返回-1
两种方式:
1. 一个接着一个的读取单个字符:
fr = new FileReader( "f:\\demo.txt" );
fr.read();
int num= 0;
while ((num= fr.read()) != -1)
System. out .println(( char )num);
2.把数据读入到一个字符组中去
fr = new FileReader( "f:\\demo.txt" );
int num= 0;
char [] arr = new char [1024];
//读到最后或者所给的缓冲区装不下了就会返回读的数目,
//但是假如读到了文件最后的还读的话就返回-1。
//假如文件没有读完而是缓冲区不够空间的话再读就会覆盖缓冲区的已存在的字符数据
while ((num= fr.read(arr)) != -1)
// 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
System. out .println( new String(arr, 0,num));

7. 拷贝文本文件中数据到某一个目录下的文件中
package xyxysjxy.io;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopy {

public static void main(String[] args) {
copy_1();
}

public static void copy_1() {
FileReader fr = null ;
FileWriter fw = null ;
try {
fr = new FileReader( "f:\\copyfrom.txt" );
fw = new FileWriter( "f:\\copyto.txt" );
// 单个字符的读取
//intc = 0;
// while ((c = fr.read()) != -1) {
// fw.write(c);
// }
char [] arr = new char [1024];
int len = 0;
while ((len = fr.read(arr)) != -1) {
fw.write(arr, 0, len);
}
System. out .println( "已经写完了!!!!!" );
} catch (IOException e) {
throw new RuntimeException();
} finally {
if (fw != null )
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null )
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}


缓冲区的出现是为了提高流的操作效率而出现的。
所以创建缓冲区之前,必须先要有流对象。
bufferReafer 和 bufferWriter
public static void testBufferReaderWriter() {
FileReader fr = null ;
BufferedReader br = null ;
FileWriter fw = null ;
BufferedWriter bw = null ;
try {
// 创建一个字符输出输入流流对象
fr = new FileReader( "f:\\bufferwriter.txt" );
fw = new FileWriter( "f:\\bufferwriterreader.txt" );
// 为了提高字符输出效率,加入一个缓冲技术
// 只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);

String s = null ;
// 在读数据的时候并不会把行终结符一起读取,
// 缓冲区提供了读取一行的方法readLine();读到了末尾返回null
while ((s = br.readLine()) != null ) {
bw.write(s);
// 缓冲区提供了一个跨平台的换行符 newLine()
bw.newLine();
// 记住:只要用到了缓冲区,就要记得刷新
bw.flush();
}
System. out .println( "通过缓冲区成功写入数据" );
} catch (IOException e) {
throw new RuntimeException( "没有写成功!!" );
} finally {
try {
if (br != null )
br.close();
} catch (IOException e) {
e.printStackTrace();

} finally {
if (bw != null )
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能
那么就自定义的该类称之为装饰类

// 通过源码,你会发现其实 bufferreader 也是通过fileReader的read
// 方法一个一个字符的读数据,只是在里面定义了一个字符数组来作为缓冲的效果


class MyBufferReader {
private FileReader fr ;

public MyBufferReader(FileReader fr) {
this . fr = fr;
}

public String myReaderLine() throws IOException {
StringBuilder sb = new StringBuilder();
int c = 0;
while ((c = fr .read()) != -1) {
if (c == '\r' )
continue ;
if (c == '\n' )
return sb.toString();
sb.append(( char )c);
}
if (sb.length() != 0)
//默认toString()转换的是空字符不是null
sb.toString();
return null ;
}

public void close() throws IOException {
fr .close();
}

}

继承和装饰的区别:
IO流(一) 待续...._第1张图片
IO流(一) 待续...._第2张图片

你可能感兴趣的:(IO流)