黑马程序员--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作为参数传递。
缓冲区只提供缓冲功能,没有真正的读写。
基本流:能直接进行读写的流对象。
高级流:站在基本流的基础上,提供一些特殊的功能。(处理流。)
- 黑马程序员 IO流
- 黑马程序员IO流
- 黑马程序员-IO流
- 黑马程序员---IO流
- 黑马程序员-----IO流
- 黑马程序员--io流
- 黑马程序员:IO流
- 黑马程序员----IO流
- 黑马程序员--IO流
- 黑马程序员-IO流
- 黑马程序员:IO流
- 黑马程序员IO流
- 黑马程序员:IO流
- 黑马程序员-IO流
- 黑马程序员---IO流
- 黑马程序员---IO流
- 黑马程序员---IO流
- 黑马程序员---IO流
- 安卓2.3以上选项菜单不能显示图标问题
- solr5.2.1的在tomcat下的安装(Linux和Windows都可以)
- Theme.AppCompat.Light在高版本问题的解决方法
- codeforces 354C C. Vasya and Beautiful Arrays( 数论+枚举)
- 第一日学习(一)osgViewer/ViewerBase.cpp
- 黑马程序员--IO流
- Java添加注册表协议
- Android 4.4 后透明状态栏和导航栏效果实现(学习总结)
- python通过get方式,post方式发送http请求和接收http响应-urllib urllib2
- SpringMVC两种方式实现多文件上传
- 15个必须知道的 Chrome 开发技巧
- android framework MediaScanner等sd卡u盘扫描流程简要跟踪分析
- HashMap,HashTable,synchronizedMap,ConcurrentHashMap,TreeMap,IdentityHashMap的比较分析
- JVM 堆内存设置原理