-
流的分类
输入流和输出流是以内存为参照物的,读入内存是输入流,内存中存到硬盘叫输出流。 输入流 :把数据从其他设备上读取到内存中的流。 输出流 :把数据从内存 中写出到其他设备上的流。 按照读取或写入数据方式不同分为字节流和字符流。 字节流 :以字节为单位,读写数据的流。 字符流 :以字符为单位,读写数据的流。 我们必须明确一点的是,一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
Java中所有的流都是在java.io包中,有四大类,这四个都是抽象类。
字节输入流:java.io.InputStream
字节输出流:java.io.OutputStream
字符输入流:java.io.Reader
字符输出流:java.io.Writer
(Stream结尾的是字节流,Reader和Writer结尾的都是字符流)
所有的流都实现了closeable()接口用完的时候要记得close(),所有的输出流都实现了flushable()接口。用完的时候要flush()刷新一下。
2.要掌握的16个流
注意:IDEA默认的当前路径是工程Project的根目录
文件专属:
java.io.FileInputStream:万能的,任何类型的文件都可以读。
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter
转换流:
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流:
java.io.BufferedInputStream
java.io.BufferedOutputStream
java.io.BufferedReader
java.io.BufferedWriter
数据流:
java.io.DataInputStream
java.io.DataOutputStream
标准输出流:
java.io.PrintStream
java.io.PrintWriter
对象专属流:
java.io.ObjectInputStream
java.io.ObjectOutputStream
package IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class Test01_FileInputStream {
public static void main(String[] args) {
FileInputStream inputStream = null;
try {
//inputStream = new FileInputStream("src/static/1.txt");
//read方法,依次读取一个字节,返回值是这个字节的ascii值
// 读完了之后返回的-1。
//int a = inputStream.read();
//System.out.println(String.valueOf((char)a));
/**
* read方法可以传入一个byte数组,读取文件中的内容到这个数组中,
* 返回值是读取到的字符个数。
* 建议使用这种方式读取,这样可以减少读取的次数,上面那种方法读取次数太多很耗时。
*/
/**
* 这种读取方式不太合适,只是用来测试,实际中,我们不知道问价的字符个数,所以实际上要循环读取
* 中间要做判断什么时候结束。
*/
// inputStream = new FileInputStream("src/static/2.txt");
// byte[] bytes = new byte[250];
// int a = inputStream.read(bytes);
//System.out.println(a);
//new String()可以传入一个byte数组,后面还可以在跟两个参数,不跟的话默认是
//全部转换成字符串,跟的第一个参数是起始下标,后面一个是转换多少个字符
//System.out.println(new String(bytes,0,a));
//available()方法返回这个流当中未读取的字节数量
//skip方法表示跳过几个字节不读,这个会导致available()返回值减小
inputStream = new FileInputStream("src/static/2.txt");
System.out.println(inputStream.available());
inputStream.skip(2);
System.out.println(inputStream.available());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test02_FileOutputStream {
public static void main(String[] args) {
FileOutputStream outputStream= null;
try {
// outputStream = new FileOutputStream("src/static/3.txt");
outputStream = new FileOutputStream("src/static/3.txt",true);
byte[] bytes = new byte[5];
for (Byte i = 0; i < bytes.length; i++) {
bytes[i]=(byte) (i+97);
}
/**
* 文件字节输出流的write方法,后面参数可以是一个byte数组,
* 但是这个write方法要注意会根据你这个流的属性选择
* 先清空原来的文件中的内容还在直接追加
*
*/
//outputStream.write(bytes);
outputStream.write(bytes);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test03_FileCopy {
public static void main(String[] args) {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream("src/static/1.txt");
outputStream = new FileOutputStream("src/static/4.txt");
byte[] bytes = new byte[1024];
int a =0;
try {
while (a!=-1){
a = inputStream.read(bytes);
outputStream.write(bytes,0,a);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package IO;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test04_FileReader {
public static void main(String[] args) {
/**
* 字符输入流,专门用来读取文本文件的
*/
FileReader reader = null;
char[] chars = new char[1024];
int a = 0;
try {
reader = new FileReader("D:\\word文档\\电子版练习册\\JAVA\\00-JAVA基础\\project\\src\\static/1.txt");
try {
while ((a=reader.read(chars))!=-1){
System.out.print(new String(chars,0,a));
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package IO;
import java.io.FileWriter;
import java.io.IOException;
public class Test05_FileWriter {
public static void main(String[] args) {
FileWriter writer = null;
try {
writer = new FileWriter("src/static/5.txt",true);
writer.write("你好,世界!");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (writer!=null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package IO;
import java.io.BufferedReader;
import java.io.FileReader;
public class Test06_BufferedReader {
public static void main(String[] args) throws Exception{
/**
* 被传进去的流叫做节点流,外边的流是包装流也叫做处理流
* 关闭的时候,我们只需要关闭最外层的流,里面的节点流会自动关闭。
*
*/
/**
* readLine()依次读取一行,读完的时候返回null
* 注意细节:它读的时候没有读到换行符
*/
BufferedReader reader = new BufferedReader(new FileReader("src/static/1.txt"));
String s;
while ((s=reader.readLine())!=null)
System.out.println(s);
}
}
package IO;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Test07_OutputStreamWriter {
public static void main(String[] args) throws Exception{
//BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src/static/6.txt")));
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src/static/6.txt",true)));
writer.write("输出字节流转换成字符输出流");
writer.flush();
writer.close();
}
}
package IO;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class Test08_DataOutputStream {
public static void main(String[] args) throws Exception{
/**
* 数据专属的输出流,这个流输出的不是普通文件,
* 不但能写入数据,而且能写入数据的数据类型
* 读取的时候怎么加的怎么取,顺序不能错,不然也会出错
*/
DataOutputStream stream = new DataOutputStream(new FileOutputStream("src/static/7.txt"));
stream.write((byte) 97);
stream.write(1);
stream.writeBytes("你好");
stream.flush();
stream.close();
}
}
package IO;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test09_PrintStream {
public static void main(String[] args) throws Exception {
/**
* 标准输出流,不需要关闭
*/
PrintStream stream = System.out;
stream.println("nihao");
stream.println("sss");
/**
* 日志框架的实现原理
*/
PrintStream stream1 = new PrintStream(new FileOutputStream("src/static/8.txt"));
System.setOut(stream1);
stream = System.out;
stream.println("Hello World!");
}
}
package IO;
import java.io.File;
import java.io.IOException;
public class Test10_File {
public static void main(String[] args) {
File file = new File("src/static/9.txt");
boolean exist;
// 判断文件存不存在
exist = file.exists();
//判断是否是一个文件
exist = file.isFile();
System.out.println(exist);
// if (!exist){
// file.mkdir();
// try {
// System.out.println(file.createNewFile());
// System.out.println("创建了一个文件");
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
}
}