IO流
IO流:Input 和 Output
IO流分类
按读取方式分类:
字节流:InputStram,OutputStream (”以 Stream 结尾)
字符流:Reader/Writer (“ Reader/Writer ”结尾)
JAVA常用的流
-
文件专属(字节字符流,需要定义数组存储读取/写,read/write 方法)
java.io.FileInputStream (字节输入流,需要byte数组存储,可以读取任何文件)
java.io.FileOutputStream(字节输出流,需要byte数组存储)java.io.FileReader(文件字符输入流,读取普通文本,需要char数组存储)
java.io.FileWriter(文件字符输出流。只能输出普通文本,需要char数组存储) -
缓冲流
java.io.BufferedReader(带有缓冲区的字符输入流,不需要定义数组,有特殊的readLine方法,可以一行一行读)
java.io.BufferedWriter (带有缓冲区的字符输出流,不需要定义数组)
java.io.BufferedInputStream(字节缓冲输入流,效率高,需要定义数组)
java.io.BufferedOutputStream (字节缓冲输出流,效率高,需要定义数组) -
转换流(将字节流转换为字符流)
java.io.InputStreamReader (字符字节输入流,将字节输入流转换为字符输入流)
java.io.OutputStreamWriter (字符字节输出流,将字节输出流转换为字符输出流) -
File
java.io.File (File类不能完成文件的读和写,File类和四大家族没有关系)
public class FileInputStreamTest {
public static void main(String[] args) throws FileNotFoundException {
//FileInputStream Stream都是字节流 FileInputStream是可以读取任何文件的
FileInputStream fis = null;
try {
fis = new FileInputStream("src/test.txt");
// 开始读,采用byte数组,一次读取多个字节。最多读取“数组.length”个字节。
byte[] bytes=new byte[1024];// 准备一个1024个长度的byte数组,一次最多读取1024个字节。
int readCount = 0;
// 这个方法的返回值是:读取到的字节数量。(不是字节本身);1个字节都没有读取到返回-1(文件读到末尾)
while((readCount = fis.read(bytes)) != -1) {
// 不应该全部都转换,应该是读取了多少个字节,转换多少个。
System.out.print(new String(bytes, 0, readCount));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 在finally语句块当中确保流一定关闭。
if (fis != null) {// 避免空指针异常!
// 关闭流的前提是:流不是空。流是null的时候没必要关闭。
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class FileOutputStreamTest {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
// myfile文件不存在的时候会自动新建!
// 这种方式谨慎使用,这种方式会先将原文件清空,然后重新写入。
//fos = new FileOutputStream("myfile");
// 以追加的方式在文件末尾写入。不会清空原文件内容。
fos = new FileOutputStream("src/test01.txt", true);
// 开始写。
byte[] bytes = {97, 98, 99, 100};
// 将byte数组全部写出!
fos.write(bytes); // abcd
// 将byte数组的一部分写出!
fos.write(bytes, 0, 2); // 再写出ab
// 字符串
String s = "我是一个中国人,我骄傲!!!";
// 将字符串转换成byte数组。
byte[] bs = s.getBytes();
// 写
fos.write(bs);
// 写完之后,最后一定要刷新
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class FileReaderTest {
public static void main(String[] args) throws FileNotFoundException {
//FileReader 文件字符输入流,只能读取普通文本。读取文本内容时,比较方便,快捷
FileReader reader = null;
try {
// 创建文件字符输入流
reader = new FileReader("src/test01.txt");
// 开始读
char[] chars = new char[4]; // 一次读取4个字符
int readCount = 0;
while((readCount = reader.read(chars)) != -1) {
System.out.print(new String(chars,0,readCount));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class FileWriterTest {
public static void main(String[] args) {
//FileWriter文件字符输出流。写。只能输出普通文本。
FileWriter out = null;
try {
// 创建文件字符输出流对象
//out = new FileWriter("file");
out = new FileWriter("src/test01.txt", true);
// 开始写。
char[] chars = {'你','是','中','国','人','吗'};
out.write(chars);
out.write(chars, 2, 3); // 中国人
out.write("我是一名java软件工程师!");
// 写出一个换行符。
out.write("\n");
out.write("hello world!");
// 刷新
out.flush();
} catch ( Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.example.IO;
import java.io.*;
public class BufferReaderTest {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("src/test.txt");
// 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流。
// 外部负责包装的这个流,叫做:包装流,还有一个名字叫做:处理流。
// 像当前这个程序来说:FileReader就是一个节点流。BufferedReader就是包装流/处理流。
BufferedReader br = new BufferedReader(reader);
//BufferedReader br = new BufferedReader( new FileReader("src/test.txt") );
// br.readLine()方法读取一个文本行,但不带换行符。
String s = null;
while((s = br.readLine()) != null){
System.out.println(s);
}
// 关闭流
// 对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭。(可以看源代码。)
br.close();
/*
// 字节流
FileInputStream in = new FileInputStream("src/test.txt");
// 通过转换流转换(InputStreamReader将字节流转换成字符流。)
// in是节点流。reader01是包装流。
InputStreamReader reader01 = new InputStreamReader(in);
// 这个构造方法只能传一个字符流。不能传字节流。
// reader是节点流。br是包装流。
BufferedReader br01 = new BufferedReader(reader01);
*/
// 合并
BufferedReader br01 = new BufferedReader(new InputStreamReader(new FileInputStream("src/test.txt")));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
// 关闭最外层
br.close();
}
}
package com.example.IO;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
public class BufferWriterTest {
public static void main(String[] args) throws Exception{
//BufferedWriter
BufferedWriter bw=new BufferedWriter( new FileWriter("src/test01.txt"));
bw.write("111");
bw.write("\n");
bw.write("00000000");
bw.flush();
bw.close();
//OutputStreamWriter 字节流转换成字符流
// 带有缓冲区的字符输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src/test01.txt", true)));
// 开始写。
out.write("hello world!");
out.write("\n");
out.write("hello kitty!");
// 刷新
out.flush();
// 关闭最外层
out.close();
}
}
package com.example.IO;
import java.io.*;
public class BufferedInOutputStreamTest {
public static void main(String[] args) {
String srcFilePath = "d:\\111\\boluo.jpg";
String destFilePath = "d:\\111\\ld.jpg";
//创建BufferedInputStream和BufferedOutputStream对象
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(srcFilePath));
bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
//循环的读取文件,并写入到
byte[] buff = new byte[1024];
int readLen = 0;
//当返回 -1时,就表示文件读取完毕
while((readLen = bis.read(buff)) != -1){
bos.write(buff,0,readLen);
}
System.out.println("文件拷贝完成~~~");
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭外层的处理流即可,底层去关闭节点流
try {
if (bis != null){
bis.close();
}
if(bos != null){
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class FileTest{
public static void main(String[] args) {
//创建文件
File f1 = new File("D:/IO/File1.txt");
if (!f1.exists()){
try {
f1.createNewFile();//创建文件
} catch (Exception e) {
e.printStackTrace();
}
}
//创建文件夹
File f2 = new File("D:/IO/File2");
if (!f2.exists()){
f2.mkdir();//创建文件夹
}
//创建多重文件夹
File f3 = new File("D:/IO/File3/a/b/c/d/e/f/g/h/i");
if (!f3.exists()){
f3.mkdirs();//创建多重文件夹
}
File f5 = new File("D:\\IO\\FileDelete");
f5.delete();
File f4 = new File("D:\\Data\\新建文件夹");
String s1 = f4.getName();//新建文件夹
System.out.println(s1);
String s2 = f4.getParent();//D:\Data
System.out.println(s2);
String s3 = f4.getPath();//D:\Data\新建文件夹
System.out.println(s3);
String s4 = f4.getAbsolutePath();//D:\Data\新建文件夹
System.out.println(s4);
File asf = f4.getAbsoluteFile();
System.out.println(asf.getAbsolutePath());//D:\Data\新建文件夹
File pf = f4.getParentFile();
System.out.println(pf.getAbsolutePath());//D:\Data
System.out.println(f4.isDirectory());//true
System.out.println(f4.isFile());//false
System.out.println(f4.isHidden());//false
System.out.println(f4.isAbsolute());//true
File f6 = new File("D:\\IO\\Day24.java");
System.out.println(f6.length());//5743字节
}
}