黑马程序员-JAVA基础之IO流(1)
来源:互联网 发布:gartner 云计算 2015 编辑:程序博客网 时间:2024/06/15 20:31
————– android培训、java培训、java学习型技术博客、期待与您交流! ———–
IO流是用来处理设备之间的数据传输的,java对数据的操作是通过流的方式;JAVA用于操作流的对象都在IO包中。
流栈操作数据分为两种:字节流和字符流;按流向分为: 输入流输出流。
Java IO体系:
|–字节流抽象基类
| –OutputStream
|–InputStream
常用的字节型的节点流有:
文件:FileInputStream,FileOutputStream
内存(数组):ByteArrayInputStream,ByteArrayOutputStream
管道:PipedInputStream,PipedOutputStream
|–字符流抽象基类
|–Reader
|–Writer
常用的字符型的节点流有:
文件:FileReader, FileWriter
内存(数组):CharArrayReader,CharArrayWriter
内存(字符串):StringReader,StringWriter
管道:PipedReader,PipedWriter
字符流
字符流的特点:
数据最常见的体现形式是:文件
需求:在硬盘上,创建一个文件,并写入一些文字数据。
用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。
操作步骤:
1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖。
FileWriter fw=new FileWriter(“demo.txt”);
2.调用write方法,将字符串写入到流中。
fw.write();
3.刷新流对象中的缓冲中的数据,将数据刷到目的地
fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后将会将流关闭。
fw.close();
下面是一段专门用于操作文件Writer子类对象的异常处理,其中包括操作Writer子类对象
FileWriter fw=null; try { fw=new FileWriter("demo.txt"); fw.write("sdfasd"); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(fw!=null) fw.close(); } catch (IOException e) { e.printStackTrace(); } } }
文件的读取
文件的读取方式一:
FileReader();
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader(“demo.txt”);
2.调用读取流的对象的read方法
(1)int ch=fr.read();一次读一个字符,会自动往下读。
(2)读出所有字符
while((ch=fr.read())!=-1)
{
System.out.println((char)ch);
}
3.关闭流资源,
fr.close();
文件的读取方式2:
通过字符数组进行读取
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader(“demo.txt”);
2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。
char[] buf=new char[1024];一般定义1024-2个字节。
int num=0;
while((num=fr.read(buf))!=-1)
{
System.out.println((new String(buf,0,num));
}
接着先一个复制文本文件例子,刚好可以理清纯文本的读写;
原理:就是将一个文件中的数据存储到另一个文件中。
步骤:
1,在d盘创建一个文件,用于存储c盘文件中的数据。
2,定义读取流和源文件相关联。
3,通过不断的读写完成数据存储。
4,关闭资源。
import java.io.*;class CopyText { public static void main(String[] args) throws IOException { copy_1(); } //从C盘读一个字符,就往D盘写一个字符。 public static void copy_1()throws IOException { //创建目的地。 FileWriter fw = new FileWriter("RuntimeDemo_copy.txt"); //与已有文件关联。 FileReader fr = new FileReader("RuntimeDemo.java"); int ch = 0; while((ch=fr.read())!=-1) { fw.write(ch); } fw.close(); fr.close(); }}
BufferdWriter是字符写入流缓冲区,可以提高写入效率
BufferedReader是字符读取流缓冲区
字节流
InputStream和OutputStream和字符流的使用方法差不多。
OutputStream,字节写入流
初始化时就需要和存储文件相关联。
同样需要关闭资源
InputStream,字节读取流:
读取时可以定义好一个刚刚好的缓冲区,或者定义一个数组[1024*x],x表示长度是1024的整数倍的数组,一般使用后者,防止文件过大时造成内存溢出。初始化时也需要和源文件相关联,读取完成以后同样需要关闭资源
字符流处理的数据都是纯文本,需要将指定的数据,查指定的编码表。而字节流处理的数据不一定都是文字数据,所以不需要指定查表,直接在操作文件数据的时候,就将具体的字节数据写入到目的地址。
下面通过一个示例演示
/*复制一个图片思路:1,用字节读取流对象和图片关联。2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。3,通过循环读写,完成数据的存储。4,关闭资源。*/import java.io.*;class CopyPic{ public static void main(String[] args) { FileOutputStream fos = null; FileInputStream fis = null; try { fos = new FileOutputStream("c:\\2.bmp"); fis = new FileInputStream("c:\\1.bmp"); byte[] buf = new byte[1024]; int len = 0; while((len=fis.read(buf))!=-1) { fos.write(buf,0,len); } } catch (IOException e) { throw new RuntimeException("复制文件失败"); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { throw new RuntimeException("读取关闭失败"); } try { if(fos!=null) fos.close(); } catch (IOException e) { throw new RuntimeException("写入关闭失败"); } } }}
可以看出:字节流不需要flush(),但close()仍是必须的。
原因:字节流直接是字节数据在源地址和目的地址之间的存储,而字符流会将数据进行临时存储,根据编码表解析成二进制数据后才进行传输,在底层也使用了字节流。
————– android培训、java培训、java学习型技术博客、期待与您交流! ———–
- 黑马程序员--Java基础之IO流(1)
- 黑马程序员-JAVA基础之IO流(1)
- 黑马程序员--JAVA基础之IO流
- 黑马程序员----Java基础之IO流
- 黑马程序员--JAVA基础之IO流
- 黑马程序员 Java基础之IO流
- 黑马程序员-----java基础十八(java之IO流)
- 黑马程序员--Java基础之IO流(2)
- 黑马程序员-----Java基础-----IO流-1
- 黑马程序员----Java基础基础之IO流
- 黑马程序员--java基础--io流(1)
- 黑马程序员-java基础IO流(1)
- 黑马程序员——Java基础--IO流(1)
- <<黑马程序员>>java基础之IO
- 黑马程序员--Java基础之IO
- 黑马程序员--java基础复习之IO
- 黑马程序员 Java基础之IO流字节流
- 黑马程序员java 基础之io流中的字符流
- 文件描述符号
- 再谈set和multiset容器
- 轻量级数据库框架LitePal - 查询数据
- Docker 实验
- mysql 日期转换 比较
- 黑马程序员-JAVA基础之IO流(1)
- 补充一道2015年华为校园招聘机试题(字符串处理)
- 数据结构基础 排序算法(三)算法的稳定性
- Python学习:mac下使用boost.bython扩充python
- 进程(WINAPI),遍历并查找树状的进程信息,实现控制系统进程
- 设置Win7共享+设置MAC共享+VMware Fusion帮助中心
- Android学习之Activity
- 对插入排序以及内存管理的一些分析
- 解题报告 之 HDU5305 Friends