------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
今天刚学完IO流,下面整理一下我的学习笔记。
①根据处理数据的数据类型的不同可以分为:字节流(抽象基类为InPutStream和OutPutStream)和字符流(抽象基类为Reader和Writer)。
注意:由这四个类派生出来的子类名称都是以其父类名作为子类明的后缀。
②根据流向不同,可以分为:输入流和输出流。
字节流和字符流的区别:
字符流,它的原理就是基于字节流读取字节时去查了指定的码表。它和字节流的区别有两点:1.在读取数据的时候,字节流读到一个字节就返回一个字节,字符流使用了字节流读到一个或多个字节时,先去查指定的编码表,再将查到的字符返回;2.字节流可以处理所有类型的数据,如jpg、avi、mp3、wav等等,而字符流只能处理字符数据。所以可以根据处理的文件不同考虑使用字节流还是字符流,如果是纯文本数据可以优先考虑字符流,否则使用字节流。
一、字符流
字符流主要用来处理字符的,主要是对纯文本数据进行操作。其中子类有
InputStreamReader/OutputStreamWriter:是字节流到字符流转换的桥梁;
FileReader/FileWriter:对文件按字符流来进行操作;
BufferedReader和BufferedWriter:这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理; 缓冲区流要用flush方法刷新,
代码示例:使用缓冲区拷贝文本文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//readLine()只返回换行符之前的值,不返回换行符
public class MyBuffer{
public static void main(String[] args) {
BufferedReader bufr=null;
BufferedWriter bufw=null;
try {
//定义输入输出字符流
bufr=new BufferedReader(new FileReader("1.txt"));
bufw=new BufferedWriter(new FileWriter("2.txt"));
String line=null;
while((line=bufr.readLine())!=null){
//写入文件
bufw.write(line);
//缓冲区流要刷新
bufw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭输入输出流
if(bufr!=null){
try {
//关闭缓冲区流,其实就是关闭其中的流对象,所以流对象就不用再关闭了
bufr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufw!=null){
try {
bufw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二、字节流
字节流的子类有
FileInputStream/FileOutputStream:字节流,(注意FileInputStream(path名,boolean)Boolean为true 表示拼接);
BufferedInputStream/BufferedOutputStream 字节缓冲流 用于给节点流增加一个缓冲的功能。(典型的牺牲空间换时间)
1.字节输入流:io包中的InputStream为所有字节输入流的父类。
Int read();读入一个字节(每次一个);
可先使用new byte[]=数组,调用read(byte[] b)
read (byte[])返回值可以表示有效数;read (byte[])返回值为-1 表示结束。
2.在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。
原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。
代码示例:使用字节流拷贝图片
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyStream{
public static void main(String[] args) {
FileOutputStream fos=null;
FileInputStream fis=null;
try {
//定义输入输出字节流
fos=new FileOutputStream("D:\\2.jpg");
fis=new FileInputStream("D:\\1.jpg");
byte[] b=new byte[1024];
int len=0;
//读取字节
while((len=fis.read())!=-1){
//写入文件
fos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭输入输出流
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
注:I/O流是很消耗性能,所以使用完后必须调用close()方法关闭流并释放资源。在关闭流时只关闭最外层的流即可。
三、File类
一个File类的对象,表示了磁盘上的文件或目录,File类提供了与平台无关的方法来对盘上的文件或目录进行操作,File类直接处理文件和文件系统。File类没有指定信息怎样从文件读取或向文件存储。
下面的构造方法可以用来生成File 对象:
File(StringdirectoryPath)
File(StringdirectoryPath, String filename)
File(FiledirObj, String filename
这个类的常用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
listFile(FileFilter),主要用来过滤文件这里有(可以用来嵌套内部类)
mkdir(),mkdirs(),toString(),
FileFilter接口只有accept方法,其返回值为Boolean型,可以在其里边写一些正则表达式来对文件进行筛选。
这里需要注意的是传入accept的参数必须是final类型(匿名内部类的要求),这样他才能使用该类范围之外的队像。
目录管理
– 目录操作的主要方法为:
– publicboolean mkdir() 根据抽象路径名创建目录。
– publicString[] list() 返回抽象路径名表示路径中的文件名和目录名。
File类中的常用方法
| boolean | canExecute() |
| boolean | canRead() |
| boolean | canWrite() |
| boolean | createNewFile() |
| boolean | delete() |
| void | deleteOnExit() |
| boolean | exists() |
| getAbsoluteFile() | |
| getAbsolutePath() | |
| getName() | |
| getParent() | |
| getParentFile() | |
| getPath() | |
| boolean | isAbsolute() |
| boolean | isDirectory() |
| boolean | isFile() |
| boolean | isHidden() |
| long | lastModified() |
| long | length() |
| String[] | list() |
| boolean | mkdir() |
| boolean | mkdirs() |
| boolean | |
| boolean | setLastModified(long time) |
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
本文整理了Java中的IO流,包括字节流与字符流的分类、特点和使用场景,详细介绍了InputStreamReader、OutputStreamWriter、FileReader、FileWriter、BufferedReader、BufferedWriter等子类,以及File类的操作方法,提供了字节流和字符流的代码示例。

873

被折叠的 条评论
为什么被折叠?



