IO(一)----字节流
File类是文件的抽象表示,如果要对文件的内容进行读写就需要使用IO流技术。
IO流简介:(Input/Output)
I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作是通过流的方式。
表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设备之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。
Java用于操作流的对象都在IO包中。IO流技术主要用来处理设备之间的数据传输。
由于Java用于操作流的对象都在IO包中。所以使用IO流需要导包如:import java.io.*;
IO流的分类
流按操作数据类型的不同分为两种:字节流与字符流。
流按流向分为:输入流,输出流(以程序为参照物,输入到程序,或是从程序输出)
字节流
什么是字节流
计算机中都是二进制数据,一个字节是8个2进制位.字节可以表示所有的数据,比如文本,音频,视频.图片,都是作为字节存在的.也就是说字节流处理的数据非常多。
在文本文件中存储的数据是以我们能读懂的方式表示的。而在二进制文件中存储的数据是用二进制形式表示的。我们是读不懂二进制文件的,因为二进制文件是为了让程序来读取而设计的。例如,Java的源程序(.java源文件)存储在文本文件中,可以使用文本编辑器阅读,但是Java的类(字节码文件)存储在二进制文件中,可以被Java虚拟机阅读。二进制文件的优势在于它的处理效率比文本文件高。
字节流处理的单元是一个字节,用于操作二进制文件(计算机中所有文件都是二进制文件)。
java中的字节流体系:输入字节流和输出字节流
字节流体系
输入字节流体系:
----| InputStream 输入字节流的基类。 抽象
----------| FileInputStream 读取文件数据的输入字节流
----------| BufferedInputStream 缓冲输入字节流 缓冲输入字节流的出现主要是为了提高读取文件数据的效率。其实该类内部只不过是维护了一个8kb的字节数组而已。
输出字节流体系
--------| OutputStream 所有输出字节流的基类 抽象类
------------| FileOutputStream 向文件输出数据的输出字节流
------------| Bufferedoutputstream 缓冲输出字节流 BufferedOutputStream出现的目的是为了提高写数据的效率。 内部也是维护了一个8kb的字节数组而已。
注意:判断使用输入流还是输出流的依据是:以内存为参考物,数据进入内存使用input,数据出内存用output。
输入字节流
文件输入字节流文件:FileInputStream
步骤:
1. 找到目标文件
2. 建立数据的输入通道。
3. 读取文件中的数据。
4. 关闭资源.
常用方法:
1、构造方法:
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream
,该文件通过文件系统中的
File
对象 file
指定。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream
,该文件通过文件系统中的路径名
name
指定。
2、读取方法:
int read()
从此输入流中读取一个数据字节。返回读取的字节数据,如果到了文件末尾则返回-1
int read(byte[] b)
从此输入流中将最多 b.length
个字节的数据读入一个 byte 数组中。返回读入缓冲区的字节数,如果到了文件末尾返回-1;
3、关闭资源方法:
void close()
关闭此文件输入流并释放与此流有关的所有系统资源。
代码示例:
public static void readFile(String fileName){
File file = null;
FileInputStream fileInputStream = null;
try {
file = new File("E:\\nick.txt");
fileInputStream = new FileInputStream(file);
byte[] buf = new byte[1024]; //数组的大小一般为1024的倍数
int count = 0;
while((count = fileInputStream.read(buf))!= -1){
System.out.println(new String(buf, 0, count));
}
}catch(IOException e){
System.out.println("文件读取错误");
throw new RuntimeException(e);
} finally {
try {
if (fileInputStream != null ) {
fileInputStream.close();
}
} catch (IOException e) {
System.out.println("关闭文件失败");
throw new RuntimeException(e);
}
}
}
缓冲输入字节流BufferedInputStream
此类的目的是提高程序读取文件的效率。实现原理是内部维护了一个8KB的byte数组,读取的时候会一次读取满数组的字节,然后在对内存中的数组进行操作,从而来提高效率。
使用步骤:
1. 找到目标文件。
2. 建立数据的输入通道。
3. 建立缓冲输入字节流。
4. 读取文件中的数据。
5. 关闭文件。
常用方法:1、构造方法:
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream
并保存其参数,即输入流
in
,以便将来使用。
2、读取方法:
int read()
从此输入流中读取一个数据字节。
int
read(byte[] b)
从此输入流中将最多 b.length
个字节的数据读入一个 byte 数组中。
3、关闭资源方法:
void close()
关闭此文件输入流并释放与此流有关的所有系统资源。
代码示例:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; public class FileStream {
public static void main(String[] args){
ReadFile2();
} public static void ReadFile2() {
File file = null;
FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
file = new File("E:\\nick.txt");
fileInputStream = new FileInputStream(file);
bufferedInputStream = new BufferedInputStream(fileInputStream);
int content = 0;
while((content = bufferedInputStream.read())!=-1){
System.out.print((char)content);
}
} catch (IOException e) {
System.out.println("读取文件失败");
throw new RuntimeException(e);
}finally {
if (fileInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
System.out.println("关闭文件失败");
throw new RuntimeException(e);
}
}
}
}
}
输出字节流
文件字节输出流:FileOutputStream
步骤:
1. 找到目标文件
2. 建立数据的输出通道。
3. 把数据转换成字节数组写出。
4. 关闭资源
常用方法:
1、构造方法
FileOutputStream(File file)
创建一个向指定 File
对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append)
创建一个向指定 File
对象表示的文件中写入数据的文件输出流。当append为true时,续写文件。当apend为false时,重写文件。
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append)
创建一个向具有指定 name
的文件中写入数据的输出文件流。
2、写入方法:
void write(byte[] b)
将 b.length
个字节从指定 byte 数组写入此文件输出流中。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off
开始的
len
个字节写入此文件输出流。
void
write(int b)
将指定字节写入此文件输出流。
3、关闭资源:
void close()
关闭此文件输出流并释放与此流有关的所有系统资源。
代码示例:
public static void writeFile(){
FileOutputStream fileOutputStream = null;
try{
File file = new File("E:\\nick.txt");
fileOutputStream = new FileOutputStream(file,true);
String string = "abc";
fileOutputStream.write(string.getBytes());
System.out.println("写入文件成功");
}catch(IOException e){
System.out.println("写入文件出错");
throw new RuntimeException(e);
}finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
System.out.println("关闭资源文件失败");
throw new RuntimeException(e);
}
}
}
注意事项:
1. 使用FileOutputStream 的时候,如果目标文件不存在,那么会自动创建目标文件对象。 如果在目录不存在就会抛异常。
2. 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。
3.使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。
4.使用FileOutputStream的write()方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。
缓冲输出字节流
此类类似于BufferedInputStream,在内部也维护了一个8KB的byte数组。从而来提高文件写入的效率。
步骤:
1. 找到目标文件。
2. 建立数据的输入通道。
3. 建立缓冲输入字节流。
4. 写入文件。
5. 关闭文件。
常用方法
1、构造方法:
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
2、写入方法:
void write(int b)
将指定的字节写入此缓冲的输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off
开始的
len
个字节写入此缓冲的输出流。
void
flush()
刷新此缓冲的输出流。
3、关闭资源:
void close()
关闭此文件输出流并释放与此流有关的所有系统资源。
代码示例:
public static void writeFile2() {
File file = null;
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
file = new File("E:\\nick.txt");
fileOutputStream = new FileOutputStream(file,true);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
String string = "hello world";
bufferedOutputStream.write(string.getBytes());
bufferedOutputStream.flush();
System.out.println("写入文件成功");
} catch (Exception e) {
System.out.println("写入文件失败");
throw new RuntimeException(e);
}finally {
if (fileOutputStream != null) {
try {
bufferedOutputStream.close();
} catch (IOException e) {
System.out.println("关闭资源文件失败");
throw new RuntimeException(e);
}
}
}
}
注意事项:
1. 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中。
2. 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中,如果需要把数据真正的写到硬盘上面,需要调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。
3.BufferedOutStream写入文件的时候是续写文件,并不清空原有文件中的数据。
实战
需求:拷贝图片。
代码示例如下:
public static void copyImage(){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
File infile = new File("E:\\Image\\IMG_1885.JPG");
File outfile = new File("E:\\nick.jpg");
fileInputStream = new FileInputStream(infile);
fileOutputStream = new FileOutputStream(outfile);
byte[] buf = new byte[1024];
int count = 0;
while((count = fileInputStream.read(buf)) != -1){
fileOutputStream.write(buf, 0, count);
}
} catch (IOException e) {
System.out.println("复制图片失败");
throw new RuntimeException(e);
}finally{
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
System.out.println("关闭输出流失败");
throw new RuntimeException(e);
}finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
System.out.println("关闭输入流失败");
throw new RuntimeException(e);
}
}
}
}
}
}
注意:
文件操作中对于资源的开启和关闭的原则:先开后关,后开先关。
IO(一)----字节流的更多相关文章
- Java IO: 其他字节流(上)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackInputStream,SequenceInputS ...
- [Java IO]02_字节流
概要 字节流有两个核心抽象类:InputStream 和 OutputStream.所有的字节流类都继承自这两个抽象类. InputStream 负责输入,OutputStream 负责输出. 字节流 ...
- Java IO之字节流
Java中的输入是指从数据源等读到Java程序中,这里的数据源可以是文件,内存或网络连接,输出则是指从Java程序中写到目的地. 输入输出流可以分为以下几种类型(暂时不考虑File类) 类名 中文名 ...
- JAVA之IO流(字节流)
输入和输出 JAVA的流分为输入流和输出流两部分, 输入流:InputStream或者Reader:从文件中读到程序中: 输出流:OutputStream或者Writer:从程序中输出到文件中: Re ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- [Day23]IO(字节流、字符流)
1.字节流 1.1 字节输出流OutputStream-抽象类,表示输出字节流的所有类的超类 (1)void close() 关闭此输出流并释放与此流相关的所有系统资源 (2)void flush() ...
- IO流(字节流,字符流,缓冲流)
一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: 二:字符字节 ...
- IO 复习字节流字符流拷贝文件
/* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...
- Java——IO类 字节流概述
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- Java之IO流(字节流,字符流)
IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...
随机推荐
- oracle 分析函数的使用(1)
LISTAGG(columnName,'拼接符') WITHIN GROUP(ORDER BY clause) --order by 子句决定拼接内容的顺序 LISTAGG(columnName,'' ...
- php框架laravel:数据库建立:artisan
aravel 迁移是一种数据库的版本控制.迁移通常和 结构生成器 配对使用来管理您应用程序的数据库结构. 配置数据库 我们安装wamp,并且使用mysql方式.用wamp自带的phpMyAdmin添加 ...
- EF深入系列--Code First
首先是创建DbContext,有两种途径 ①手动编写DbContext代码,同时还要记得去配置文件中添加connectionStrings public class BooksContext : Db ...
- Nginx状态码499
1.问题描述 140.207.202.187 - - [18/May/2016:10:30:58 +0800] "POST/v3/violations HTTP/1.1" 499 ...
- Tomcat 目录详解
一.文字版本: bin: 该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是 ...
- 其他(一)Visual Studio 自动排版快捷键
自动对齐快捷键为:ctrl+k+d 按快捷键前,请先将需要对齐的代码选中.不选中是不行的.
- android xml 布局错误(黑掉了)Missing styles. Is the correct theme chosen for this layout?
发现在调整页面的时候 ,老是报以下错误,导致无法静态显示ui效果. Missing styles. Is the correct theme chosen for this layout? Use t ...
- 关于JavaScript继承的那些事
在JavaScript中,对象的创建可以脱离类型(class free),通过字面量的方式可以很方便的创建出自定义对象. 另外,JavaScript中拥有原型这个强大的概念,当对象进行属性查找的时候, ...
- java 知识点随记
JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class ...
- UVA 11800 Determine the Shape --凸包第一题
题意: 给四个点,判断四边形的形状.可能是正方形,矩形,菱形,平行四边形,梯形或普通四边形. 解法: 开始还在纠结怎么将四个点按序排好,如果直接处理的话,有点麻烦,原来凸包就可搞,直接求个凸包,然后点 ...