一:IO的分类:
根据数据的流向分为:输入流和输出流
.输入流:把数据从其他设备读取到内存中的流。
输出流:把数据从内存中写到其他设备。
根据数据的类型分为:
字节流和字符流
二:字节输出流OutputStream
java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指向的字节信息流写出到目的地。它定义了字节输出流的基本共性功能方法。
public void close();关闭此输出流并释放与此流相关联的任何系统资源
public void flush();刷新此输出流并强制任何缓冲的输出流字节流被写出。
public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
public abstract void write(int b);将指定的字节写入此输出流。
一次写一个字节。
package Demo4;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
java.io.OutputStream;此抽象类是表示输出字节流的所有类的超类。
定义了一些子类的共性的成员方法。
public void close();关闭此输出流并释放与此流相关联的任何系统资源
public void flush();刷新此输出流并强制任何缓冲的输出流字节流被写出。
public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
public abstract void write(int b);将指定的字节写入此输出流。
java.io.FileOutputStream extends OutputStream
FileOoutputStream:文件字节输出流
作用:把内存中的数据写入到硬盘文件中。
构造方法:
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据输出文件流
FileOutputStream(File file)
创建一个向指定File对象表示的文件中写入数据的文件输出流。
参数:写入数据的目的
String name:目的地是一个文件。
File file:目的地是一个文件。
构造方法的作用:
1:创建一个FileOutputStream对象
2:会根据构造方法中传递的文件/文件夹路径,创建一个空文件。
3:会把FileOutputStream对象指向创建好的文件。
写入数据的原理(内存-->硬盘)
java程序-->JVM(java虚拟机)--->OS(操作系统)-->OS调用写数据的方法--->会把数据写入到文件。
字节输出的使用步骤:
1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
3:释放资源。(流使用会占用一定的内存,使用完毕要把内存青葵,提供程序的效率)
*/
public class Demo01OutputStream {
public static void main(String[] args) throws IOException {
//1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one.txt");
//2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
//3:释放资源。(流使用会占用一定的内存,使用完毕要把内存青葵,提供程序的效率)
fos.write(97);
/*写数据的时候,会把10进制的整数97,转换为二进制97.
97---1100001
在任意的文本编辑器(记事本,notepad++)
在打开文件的时候,都会查询编码表,把字节转换我字符表示。
0-127:查询ASCII表
其它值:查询系统默认编码表。(中文系统GBK)
fos.close();
}
}
字节输出流写多个字节的方法
package Demo4;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
/*
一次写多个字节的方法:
public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
*/
public class Demo02OutputStream {
public static void main(String[] args) throws IOException {
//1:创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
FileOutputStream fos =new FileOutputStream(new File("C:\\Users\\Sky\\Desktop\\one.txt"));
//2:调用FileOutputStram对象中的方法write,把数据写入到文件中。
/*
public void write(byte[] b);将b.length字节从指定的字节数组写入此输出流。
一次写多个字节
如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表。
如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个一个中文显示,查询系统默认码表(GBK表
*/
byte[] bytes ={65,66,67,68,69};//ABCDE
fos.write(bytes);
/*
public void write(byte[] b,int off,int len);从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
*/
fos.write(bytes,1 ,2 );//BC
/*
写入字符的方法:可以使用String类中的方法把字符串,转换为字节数组。
byte[] getByte(); 把字符串转换为字节数组。
*/
byte[] byte3="你好".getBytes();
System.out.println(Arrays.toString(byte3));
fos.write(byte3);
//释放资源
fos.close();;
}
}
三:字节输出流的续写和换行
package Demo4;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/*
追加写/续写:使用两个参数的构造方法:
FileOutputStream(String name,boolean append); 创建一个向具体指定name的文件中写入数据的输出文件流。
FileOutputStream(File file,boolean append)
创建一个向指定File对象表示的文件中写入数据的文件输出流。
参数:
String name,File file :写入数据的目的地
boolean append;追加写开关 true:创建对象不会覆盖原文件,继续在文件的末尾追加写数据。
false:创建一个新文件,覆盖原文件。
写换行:
windows:\r\n
linux : /n
mac : /r
*/
public class Demo03OutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one.txt",true);
for (int i=1;i<=10;i++){
fos.write("你好".getBytes());
fos.write("\r\n".getBytes());
}
fos.close();;
}
}
四:字节输入流------InputStream类
java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读写字节信息到内存中。它定义了字节输入流的基本共性功能方法:
.public void close();关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read();//从输入流读取数据的下一个字节。
public int read(byte[] b);从输入流中读取一些字节数,并将它们存在到字节数组中。
注意:
close();当完成流的操作时,必须调用此方法,释放系统资源。
FileInputStream类
java.io.FileInputStream类是文件输入流,从文件中读取字节。
构造方法:
FileInputStream(File file);通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名。
FileInputStream(String name);通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的路径名name命名。
package Demo4;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
java.io.InputStream:字节输入流
此抽象类是表示字节输入流的所有类的超类。
定义了所有子类共性的方法:
int read();//从输入流中读取数据的下一个字节。
int read(byte[] b);从输入流中读取一定数量的字节,并将其存储在缓存区数组b中。
void close();关闭此输入流并释放与该流关联的所有系统资源。
java.io.FileInputStream extends InputStram
FileInputStream:文件字节输入流
作用:把硬盘文件中的数据,读取到内存中使用。
构造方法:
FileInputStream(String name);
FileInputStream(File file);
参数:读取文件的数据源。
String name;
File file:文件
构造方法的作用:
1:会创建一个FileInputStream对象。
2:会把FileInputStream对象指定构造方法中要读取的文件
读取数据的原理(硬盘---》内存)
java程序--->JVM---》OS--->OS读取数据的方法---->读取文件。
字节输入流的使用步骤:
1:创建FileInputStream对象,构造方法绑定要读取的数据源。
2:使用FileInputStream对象中方法read,读取文件。
3:释放资源。
*/
public class InputStream {
public static void main(String[] args) throws IOException {
// 1:创建FileInputStream对象,构造方法绑定要读取的数据源。
FileInputStream fis =new FileInputStream("C:\\Users\\Sky\\Desktop\\one.txt");
//2:使用FileInputStream对象中方法read,读取文件。
//int read()读取文件中的一个字节并返回,读取文件末尾返回-1
int len =0;//记录读取到字节。
while ((len=fis.read())!=-1){
//System.out.print(len);
}
/* while (fis.read()!=-1){
System.out.println(fis.read());//错误写法。
}*/
//释放资源。
System.out.println((char)98);
fis.close();;
}
}
五:字节输入流一次读取多个字节
package Demo4;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
/*
字节输入流一次读取多个字节的方法:
int read(byte[] b)从输入流中读取一定数量的的字节,并将器存储在缓冲区数组b中。
明确两件事:
1:方法的参数byte[]的作用?
缓存作用,存储读取的多个字节。
数组的长度一般定义1024(1kb)或者1024的整数倍。
2:方法的返回值int是什么?
读取的有效字节个数。
String类的构造方法:
String(byte[] bytes)把字节数组转换为字符串。
String(byte[] bytes,int offset,int length);把字节数组的一部分转换为字符串。offset:数组的开始索引,Length:转换的字节个数。
*/
public class Demo02InputStream {
public static void main(String[] args) throws IOException {
//创建FileInputStream对象,构造方法中绑定要读取的数据源。
FileInputStream fis =new FileInputStream("C:\\\\Users\\\\Sky\\\\Desktop\\\\one.txt");
//使用FileInputStream对象中的方法read读取文件。
//int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
/* byte[] bytes =new byte[1024];
int len =fis.read(bytes);
System.out.println(len);
System.out.println(new String(bytes));*/
/*
while循环结束的条件,读取到-1结束。
*/
byte[] bytes =new byte[1024];//存储读取的多个字节。
int len =0;//记录每次读取的有效字节个数。
while ((len = fis.read(bytes))!=-1){
System.out.println(new String(bytes,0,5));
}
}
}
六:字节流练习:图片复制。
原理:从已有文件中读取字节,将该字节写到另外一个文件中。
package Demo4;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
文件复制练习:一读一写:
明确:
数据源:C:\Users\Sky\Desktop\mmexport1577083312773.jpg
数据的目的地:C:\Users\Sky\Desktop、one\1.jpg
文件复制的步骤:
1:创建一个字节输入流对象,构造方法绑定要读取的数据源
2:创建一个字节输出对象,构造方法绑定要写入的目的地
3:使用字节输入流对象中的方法read读取文件.
4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
5:关闭资源。
*/
public class Demo01CopyFile {
public static void main(String[] args) throws IOException {
long e=System.currentTimeMillis();
//1:创建一个字节输入流对象,构造方法绑定要读取的数据源
FileInputStream fis = new FileInputStream("C:\\Users\\Sky\\Desktop\\mmexport1577083312773.jpg");
//2:创建一个字节输出对象,构造方法绑定要写入的目的地
FileOutputStream fos =new FileOutputStream("C:\\Users\\Sky\\Desktop\\one\\1.jpg");
//一次读取一个字节写入一个字节的方式
//3:使用字节输入流对象中的方法read读取文件.
/* int len=0;
while ((len = fis.read())!= -1) {
// 4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
fos.write(len);
}*/
//使用数组缓冲读取多个字节,写入多个字节
byte[] bytes=new byte[1024];
//3:使用字节输入流对象中的方法read读取文件.
int len=0;
while ((len=fis.read(bytes))!=-1){
//4:使用字节输出流中的方法write,把读取的字节写入到目的地文件中。
fos.write(bytes,0,len);
}
//释放资源(先关写的,后关闭读的,如果写完了,肯定读取完毕了)
fos.close();;
fis.close();
long e1 =System.currentTimeMillis();
System.out.println("复制文件耗时:"+(e1-e));
}
}
七:使用字节流读取中文的问题
package Demo4;
import java.io.FileInputStream;
import java.io.IOException;
/*
使用字节流读取中文文件:
1个中文:
GBK:占用两个字节
UTF-8:占用3个字节。
*/
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis =new FileInputStream("C:\\Users\\Sky\\Desktop\\one.txt");
int len =0;
while ((len =fis.read())!=-1){
System.out.println((char)len);
}
fis.close();
}
}