黑马程序员--IO流

来源:互联网 发布:淘宝卖新鲜苹果没人买 编辑:程序博客网 时间:2024/04/30 07:07

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


IO流的概述

复制粘贴 上传下载
IO流的分类
按流向
输入流
输出流
按操作的数据
字符流
字节流

文件类File类
构造方法:
 File(String pathname):根据指定的路径创建File对象。
 File(String parent, String child):根据指定的父文件夹和子文件或者文件夹创建File对象
 File(File parent, String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象


创建功能:
  创建文件:public boolean createNewFile()
       如果指定的文件不存在,就创建。如果存在,就不创建。
  创建文件夹:public boolean mkdir()
  创建指定的目录,如果存在,就不创建。
    public boolean mkdirs()
  创建指定的目录,如果存储,就不创建。这个时候,如果父目录不存在,它也会自动创建。

删除功能:
  public boolean delete():既可以删除文件,也可以删除文件夹。取决于你使用的对象。

注意:
  A:如果你删除的目录下还有内容,那么,必须先把所有内容删除完毕后,在删除目录。
  B:java语言的删除不走回收站


判断功能

 boolean exists():判断file对象是否存在
 boolean isFile():判断file对象是否是文件
 boolean isDirectory():判断file对象是否是文件夹
 boolean isAbsolute():判断file对象是否是绝对路径
 boolean canRead():判断file对象是否可读
 boolean canWrite():判断file对象是否可写
 boolean isHidden():判断file对象是否隐藏


获取功能:


 String getAbsolutePath():绝对路径
 String getPath():相对路径
 String getName():文件名称
 long length():文件大小,单位是字节
 long lastModified():上次修改时间的毫秒值。


重要获取功能

 public static File[] listRoots():列出可用的系统文件根目录
 public String[] list():返回的是指定目录下所有文件或者文件夹的名称数组
 public File[] listFiles():返回的是指定目录下所有文件或者文件夹对象数组

绝对路径:以盘符开始的路径。

相对路径:不以盘符开始的路径。

字节流:
1:基本字节输出流的操作
A:创建字节输出流对象
FileOutputStream fos = new FileOutputStream("a.txt");
B:调用写数据的方法
fos.write(97);
C:释放资源
fos.close();


注意:写数据的方法有
write(byte b)
write(byte[] bys);
write(byte[] bys, int start,int lenth);
     追加写入用两个参数构造
FileOutputStream fos = new FileOutputStream("a.txt",true);


2:基本字节输入流的操作
FileInputStream fis = new FileInputStream("b.txt");

//方式1
int by = 0;
while ((by = fis.read()) != -1) {
System.out.println(by);
}

//方式2
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
//释放资源
fis.close();



注意:
1):read():读一个,光标就在下一行等着读下一个,读完后光标就放到了最后,再读就没了
和集合里面迭代器的next() 有点相似


2):当用字节流读汉字并打印到控制台上,有时候会出现 "??" 问题,是因为汉字是由两个字节
组成的,每次读一个字节,所以就会出现"??"的现象,但是此问题用字节流复制文本文件时不会出现


3:高效字节输出流

BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("4.mp4"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"d:\\a.java"));


byte[] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}


bos.close();
bis.close();


4:高效字节输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"d:\\copy.java"));

byte[] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys))!=-1){
System.out.print(new String(bys, 0, len));
}
bis.close();

注意:不能用字符流复制二进制数据
 二进制流数据:图片,视频,音频等。
 由于二进制的合并为字符,在我们使用的编码表中没有对应的数据,那么,将来在写回去的时候,就会有数据的丢失。
 所以,二进制流数据只能使用字节流进行操作。

字符流
基本字符输出流FileWriter
1)方式一:完成一个简单在指定文件中写入数据的操作的步骤
A:创建字符输出流FileWriter对象(并且传入一个你要写入的位置)
FileWriter fw = new FileWriter("a.txt");
B:调用写数据的功能
fw.write("hello,io,我来了。祝你元旦快乐。");
C:刷新缓冲区
fw.flush();
D:释放资源(jvm不会自动回收流的资源,除非你手动标记该流已成为垃圾)
fw.close();

     方式二:

2)对简单在指定文件中写入数据的操作提出了疑问

①为什么FileWriter没有无参构造方法?
因为写数据的时候,一定要明确写道哪里去。

②flush()和close()的区别?
flush():只刷新缓冲区,流对象还可以继续使用。
close():先刷新缓冲区,在关闭流对象。流对象不可以继续被使用。

③定时刷新
int count = 0;
for (int x = 0; x < 1000000; x++) {
fw.write("hello" + x);
if (++count % 10000 == 0) {
fw.flush();
}
}


3)用try{}catch(){}来处理异常

FileWriter fw = null;(必须初始化)
try {
//把有可能报错的部分都写在try里面
fw = new FileWriter("d.txt");
fw.write("hello");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {//有可能try里面报错了,fw就是null,这时候如果不判断 下面的fw.close()就会报空指针异常
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

基本字符输入流FileReader

方式一

 A:创建字符输入流对象(并且明确你要从哪个文件读数据)
FileReader fr = new FileReader("FileWriterDemo.java");
 B:调用读取数据功能,并显示
int ch = 0;
while((ch=fr.read())!=-1){//如果数据没有了,读取的时候,将返回-1
 //如果有数据则返回int类型(字符的int值),并自动移动到下一个数据位置等待读取
System.out.print((char) ch);
}
 C:释放资源
fr.close();

方式二:

public int read(char[] cbuf)每次读取数据,把数据存储到字符数组中,返回值是实际读取长度。
A: 创建字符输入流
FileReader fr = new FileReader("FileWriterDemo.java");
B:读取数据每次读取一个数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {//len表示read(chs)读取到多少个字符
   //如果实际读取长度是-1的情况,那么,说明已经读取到结尾了

System.out.print(new String(chs, 0, len));//new String(chs, 0, len) 是为了写入实际读入的数据,否则读取到最后的时候可能会有偏差
}

C:释放资源
fr.close();

高效字符输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));

高效字符输入流
// 创建字符缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("c.txt"));

// 读取数据方式一
int ch = 0;
while ((ch = br.read()) != -1) {
System.out.print((char) ch);
}
// 读取数据方式二
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
// 释放资源
br.close();


5:高效字符流的特殊复制文本文件方式

BufferedReader br = new BufferedReader(new FileReader(
"FileOutputStreamDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}

bw.close();
br.close();

注意:1)我们开始自己定义数组,给出缓冲区大小,是为了提高效率。
那么,java在设计类的时候,它也考虑到了这一点,所以,就提供了一种高效的流。带缓冲区的流。
BufferedWriter:写入数据
BufferedReader:读取数据
构造方法:BufferedWriter(Writer out) 
为什么传递的是Writer呢?
因为BufferedWriter这种流,被称为缓冲流,它只提供数据的缓冲功能。
真正的读写还得靠别人。所以,我们这里将使用FileWriter作为参数传递。
缓冲区只提供缓冲功能,没有真正的读写。

基本流:能直接进行读写的流对象。
高级流:站在基本流的基础上,提供一些特殊的功能。(处理流。)

0 0