IO流--字节流
1.1 什么是IO
生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了保存,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外界设备等等。
我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入和输出,即流向内存是输入流,流出内存的输出流。
Java中I0流操作主要指的是使用java.io包下的内容,进行输入,输出操作。输入也叫做读取数据,输出也叫做写出数据。
1.1 IO的分类
根据数据的流向分为:输入流和输出流
输入流:把数据从其他设备上读取到内存中的流。
输出流:把数据从内存中写到其他设备上的流。
格局数据的类型分类为:字节流和字符流
1.3字节流
1.3.1一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都是一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。
1.3.2字节输出流(OutputStream)
OutputStream是一个抽象类,是字节输出流所有的超类。它可以将指定的字节信息写出到文件中。它有一些共性的方法。
public abstract void write(int b) throws IOException:将指定的字节写入此输出流。 write的一般合同是将一个字节写入输出流。 要写入的字节是参数b的八个低位。 b的24个高位被忽略。
public void write(byte[] b) throws IOException:将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) throws IOException:从指定的字节数组写入len字节,从偏移off开始输出到此输出流。
public void flush() throws IOException:刷新此输出流并强制任何缓冲的输出字节被写出。
public void close() throws IOException:关闭此输出流并释放与此流相关联的任何系统资源。
1.3.3文件字节输出流(FileOutputStream)
FileOutputStream把内存中的数据写入到硬盘的文件中。
构造方法:
FileOutputStream(String name):创建一个指定名称的文件写入到硬盘的文件中。
FileOutputStream(File file):创建一个指定File对象表示的文件中写入到硬盘的文件中。
参数:
String name:文件的路径(一般指的是绝对路径)
File file:一个文件
作用:
1创建一个FileOutputStream对象。
2会根据构造方法中传递的文件/文件路径,创建一个空的文件。
3会把FileOutputStream对象指向创建好的文件。
写入数据的原理
Java程序–>JVM–>OS(操作系统)–>OS调用写数据的方法–>把数据写入到文件中
我们可以看下面一段代码看看FileOutputSream的使用
package io;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args){
try{
//1创建FileOutputStream对象
FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\a.txt");
//2调用FileOutputStream中write方法,写入数据
fileOutputStream.write(97);
//3释放资源
fileOutputStream.close();
}catch(IOException e){
e.toString();
}
stream();
}
public static void stream(){
try{
//1创建FileOutputStream对象
FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\b.txt",false);
//2调用FileOutputStream中write方法,写入数据
for (int i=0;i<10;i++){
fileOutputStream.write("你好".getBytes());
fileOutputStream.write("\r\n".getBytes());
}
//3释放资源
fileOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
使用步骤:
1创建一个FileOutputStream对象,构造方法中传递写入到数据的目的。
2调用FileOutputStream对象中的方法write(),把数据写入到文件中。
3释放资源(流使用会占用一定的内存,使用完毕把内存清空,提高程序的效率)。
上面的方法只能写入一个数据,那如果写多个数据,有什么方法呢?我们可以使用字节数组byte[] b。
OutputStream中的方法write(byte[] b),就可以写入多个数据。我们看看下面一段代码示例:
package io;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) {
try{
//1创建一个FileOutputStream对象
FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt");
//2写入数据
byte[] bytes={65,66,67,68,69};
fileOutputStream.write(bytes);
//3释放资源
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
若想写入几个数据,就可以使用void write(byte[] b,int off,int len)。其中off表示数组的索引号,len表示数据的个数。代码如下:
package io;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) {
try{
//1创建一个FileOutputStream对象
FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt");
//2写入数据
byte[] bytes={65,66,67,68,69};
fileOutputStream.write(bytes,0,3);
//3释放资源
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
注意:
1如果写的第一个字节是正数(0-127),那么显示的时候查询ASCII表。
2如果写的第一个字节是负数,那么第一个字节会和第二个字节组成一个中文显示,查询系统封默认码表。
数据的追加写/续写:
1FileOutputStream(String name,boolean append)
2FileOutputStream(File file,boolean append)
参数:
boolean append
true: 创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
false:创建一个新的文件,覆盖源文件。
package io;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) {
try{
//1创建一个FileOutputStream对象
FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt",true);
//2写入数据
byte[] bytes={65,66,67,68,69};
fileOutputStream.write(bytes,0,3);
//3释放资源
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
1.3.2字节输入流(InputStream)
InputStream是所有字节输入流的超类,它定义了一些共用的方法。
public abstract int read() throws IOException:从输入流读取数据的下一个字节。 值字节被返回作为int范围0至255 。
public int read(byte[] b) throws IOException:从输入流读取一些字节数,并将它们存储到缓冲区b 。
public int read(byte[] b,int off,int len) throws IOException从输入流读取len字节的数据到一个字节数组。
public void close() throws IOException关闭此输入流并释放与流相关联的任何系统资源。
FileInputStream(文件字节输入流)
作用:把硬盘文件中的数据读取到内存中使用。
构造方法:FileInputStream(String name),FileInputStream(File file).
参数:String name:文件路径,File file:源文件
构造方法的作用:
1创建一个FileInputStream对象
2会把FileInputStream对象指定构造方法中读取。
原理:Java程序–>JVM–>OS(操作系统)–>OS读取数据的方法–>读取文件
我们用一段代码解释上面的话语:
package io;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) {
try{
//1创建FileInputStream对象
FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
//2调用read方法
int len=0;
while((len=fileInputStream.read())!=-1){
System.out.println((char)len);
}
fileInputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
思路:
1创建一个FileInputStream对象,构造方法中绑定要读取的源文件
2使用read()方法,读取文件。
3释放资源
对于上面代码中(len=fileInputStream.read())!=-1,可以拆分为
1 fileInputStream.read() 读取一个字节
2 len=fileInputStream.read() 把读取到的字节赋值给变量len
3 (len=fileInputStream.read())!=-1:判断变量len是否不等于-1。
如果读取多个数据呢,可以用read(byte[] b)方法读取多个字节,用代码说明最清楚不过
package io;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo1 {
public static void main(String[] args) {
try{
//1创建FileInputStream对象
FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
//2读取数据
int length=0;
byte[] bytes=new byte[1024];
while ((length=fileInputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,length));
}
fileInputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
这里的用String方法是读取数据时会把数据转换为数字,也就是ASCII表中的数值,所以用String构造方法转换为源数据。
String构造方法:
1 String(byte[] b):把字节数组转换为字符串。
2 String(byte[] b,int offset,int length):把字节数组的一部分转换为字符串,offset:数组的索引号,length:转换字节的个数。
以上就是我写的文件输入/输出流的用法,下面我用一个综合案例来对这两个类使用说明,文件的复制。
文件复制
思路:
1 创建FileInputStream对象,构造方法中绑定要读取的文件
2 创建FileOutputStream对象,构造方法中绑定要写入的文件
3 使用read方法读取文件
4 使用write方法,把读取到的字节写入文件中
5 释放资源(先关FileInputStream,后关FileOutputStream)
代码如下:
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyDemo {
public static void main(String[] args) {
try{
//1创建FileInputStream
FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
//2创建FileOutputStream
FileOutputStream fileOutputStream=new FileOutputStream("D:\\C语言\\a.txt");
//3读取数据
int length=0;
byte[] bytes=new byte[1024];
while((length=fileInputStream.read(bytes))!=-1){
//4写入文件中
fileOutputStream.write(bytes,0,length);
}
//释放资源
fileInputStream.close();
fileOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
上一篇: Java中的IO流
下一篇: java中一维数组的使用(初级)