IO流:
FileInputStream:
package wwl.Io;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 读字节为单位读取文件的内容
*
*/
public class Test02 {
public static void main(String[] args) throws IOException {
//1.在当前程序与指定文件之间建立流通道,读取d:/abc.txt文件的内容,通过构造方法指定要访问的文件
//如果文件不存在就会抛出异常
FileInputStream fis = new FileInputStream("d:/abc.txt");
//文件内容:ABCabc
//2.读写文件内容
//read()方法从文件中读取一个字节,并把读到的字节返回,读到文件末尾返回-1
// int cc = fis.read(); //65,A的码值
// System.out.println(cc);
// cc = fis.read(); //66,B的码值
// System.out.println(cc);
// cc = fis.read(); //67,C的码值
// System.out.println(cc);
// cc = fis.read(); //97,a的码值
// System.out.println(cc);
// cc = fis.read(); //98,b的码值
// System.out.println(cc);
// cc = fis.read(); //99,c的码值
// System.out.println(cc);
// cc = fis.read(); //-1,已经读到文件末尾
// System.out.println(cc);
//使用循环读取:
int cc = fis.read(); //65,A的码值
while( cc != -1) {
//把读到的字节cc进行处理,把cc转换为字符再打印,因为当前文件中只有英文字符,有个字节对应一个字符
System.out.print((char)cc);
cc = fis.read();
}
//3.关闭流通道
fis.close();
}
}
读字节为单位读取文件的内容
package wwl.Io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
/**
* 一次读取一个字节数组
* 读取很多字节保存到字节数组中
* 循环读取
*
*/
public class Test03 {
public static void main(String[] args) throws IOException {
//1.在程序与读取文件之间建立流通道
FileInputStream fis = new FileInputStream("d:/abc.txt");
//ABCabcABC
byte[] bytes = new byte[4];
//从流中读取很多字节,保存到字节数组中,返回读到的字节数,如果读到文件末尾,返回-1
int len = fis.read(bytes);
while(len != -1) {
//从文件中读取了len个字节保存到bytes数组中,对len个字节进行处理
//把读到的len个字节转换为字符串 new String(byte[] bytes , 0 , len)
System.out.print(new String(bytes , 0 , len));
//继续读
len = fis.read(bytes);
}
// System.out.println(len);
// System.out.println(Arrays.toString(bytes));
//
// len = fis.read(bytes);
// System.out.println(len);
// System.out.println(Arrays.toString(bytes));
//
// len = fis.read(bytes);
// System.out.println(len);
// System.out.println(Arrays.toString(bytes));
//
// len = fis.read(bytes);
// System.out.println(len);
// System.out.println(Arrays.toString(bytes));
//
fis.close();
}
}
异常处理:
package wwl.Io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 异常处理
*
*/
public class Test04 {
public static void main(String[] args) {
m1(); //一次读取一个字节,手动关闭流,异常处理
System.out.println();
m2(); //从文件中读取字节保存到字节数组中,异常处理,自动关闭流
}
//从JDK7开始,流可以自动关闭
private static void m2() {
try( //try资源块,自动释放
FileInputStream fis = new FileInputStream("d:/abc.txt");
) {
byte[] bytes = new byte[4];
int len = fis.read(bytes);
while(len != -1) {
System.out.print(new String(bytes , 0 , len));
len = fis.read(bytes);
}
} catch (Exception e) {
e.printStackTrace();//打印异常
}
}
//手动关闭流,异常处理
//alt+shift+z可以捕获所选代码的异常
private static void m1() {
FileInputStream fis = null;
try {
fis = new FileInputStream("d:/abc.txt");
int cc = fis.read();
while( cc != -1) {
System.out.print((char)cc);
cc = fis.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if( fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} //关闭流,释放系统资源
}
}
}
}
Fileoutputstream:
package wwl.Io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*FileOutputStream
* 以字节为单位把数据保存到文件中
*/
public class Test05 {
public static void main(String[] args) throws IOException {
//1.建立流通道
//如果访问的文件不存在,系统会创建一个新文件;如果文件已存在内容,会覆盖原文件内容
// FileOutputStream fos = new FileOutputStream("d:/def.txt");
//如果文件不存在就创建文件,如果文件已存在,把内容保存到文件后面,即以追加的方式打开文件
FileOutputStream fos = new FileOutputStream("d:/def.txt" , true);
//2.保存数据
//一次写一个字节
fos.write(65); //把65对应的字符A保存到文件中
fos.write(66); //把66对应的字符A保存到文件中
fos.write(67); //把67对应的字符A保存到文件中
//换行,在windows操作系统中,换行需要使用\r\n两个字符
fos.write('\r'); //回车,13
fos.write('\n'); //换行,10
//一次写一个字节数组
byte[] bytes = "wwlssaa".getBytes();
fos.write(bytes); //把bytes数组中所有的字节保存到文件中
//换行
fos.write(13);
fos.write(10);
//把字节数组的部分字节保存到文件中
fos.write(bytes, 0, 2);
//3.关闭流
fos.close();
}
}
以字节为单位实现文件的复制:
package wwl.Io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import wwl.interfaces.swimer.fish;
/**
* 以字节为单位实现文件的复制
public class Test06 {
public static void main(String[] args) {
String src = "F:/Java code/wwl/src/wwl/Io/Test06.java";
String deString = "d:/test08.java";
copyFile(src, deString);
}
//一次复制一个字节,异常处理,手动关闭流
public static void copyFile(String srcFilename , String destFilename) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFilename);
fos = new FileOutputStream(destFilename);
int cc = fis.read();
//如果cc不是-1,把cc保存到目标文件中
while(cc != -1) {
fos.write(cc); // 把读到的字节cc保存到输出流中
cc = fis.read();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
以字节数组为单位实现文件的复制(效率要远远高于以字节为单位复制):
package wwl.Io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import wwl.interfaces.swimer.fish;
/**
* 以字节数组为单位实现文件的复制
*
*/
public class Test07 {
public static void main(String[] args) {
// String src = "F:/Java code/wwl/src/wwl/Io/Test06.java";
// String deString = "d:/test08.java";
String src = "F:\\学习\\2017MySQL\\001_动力节点_MySQL_MySQL数据库管理系统前言\\动力节点_MySQL_001_MySQL数据库管理系统前言.avi";
String deString = "d:/hehe.avi";
copyFile(src, deString);
}
//一次复制一个字节数组,异常处理,自动关闭流
public static void copyFile(String srcFilename,String destFilename) {
try (
FileInputStream fis = new FileInputStream(srcFilename);
FileOutputStream fos = new FileOutputStream(destFilename);
){
byte[] bytes = new byte[1024]; // 字节数组一般是1024的偶数倍
int len = fis.read(bytes);
while(len != -1) {
fos.write(bytes, 0, len);
len = fis.read(bytes);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileReader:
以字符为单位读写内容:
与字节流大同小异
package wwl.Io;
import java.io.FileReader;
import java.io.IOException;
/**
* FileReader/FileWriter
* 以字符为单位读写文件内容,只能读写纯文本文件,要求文本文件的编码格式要与当前环境的编码格式兼容
*
*/
public class Test08 {
public static void main(String[] args) throws IOException {
m1();//通过FileReader读取文件内容
m2();//读取文本文件内容,一次性读取一个字符数组,异常处理,自动关闭
}
private static void m2() {
try (
FileReader fr = new FileReader("d:/abc.txt");
){
char[] contents = new char[1024];
int len = fr.read(contents);
while(len != -1) {
//把读到的len个字符进行处理,转换为字符串打印
System.out.println(new String(contents, 0, len));
len = fr.read(contents);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void m1() throws IOException {
//建立流通道
//一般使用FileReader读取与当前环境编码一致的文件
FileReader fr = new FileReader("d:/abc.txt");
//read()一次读取一个字符,返回字符的码值,读到文件末尾返回-1
int cc = fr.read();
while(cc != -1) {
//把读到的字符打印到屏幕上
System.out.print((char)cc);
cc = fr.read();
}
fr.close();
}
}
FileWriter:
注意追加的方式打开
package wwl.Io;
import java.io.FileWriter;
import java.io.IOException;
/**
* FileWriter
* 保存数据时,只能把数据保存到utf-8编码(当前环境是UTF8)格式的文件中
*
*/
public class Test09 {
public static void main(String[] args) {
//建立流通道
FileWriter fw = null;
try {
//如果文件不存在,会创建新的文件,如果文件存在会覆盖原来的内容
// fw = new FileWriter("d:/abc.txt");
//文件不存在就创建,文件已存在,以追加的方式打开
fw = new FileWriter("d:/abc.txt",true);
//把字符保存到文件中
//一次写一个字符
fw.write('A');
fw.write('汉');
//一次写一个字符串
fw.write("哈师大哈师大");
//换行
fw.write("\r\n");
//一次写一个字符数组
char[] contents = "发生发生法发首发式发生,啊十分大方".toCharArray();
fw.write(contents);
//把字符数组的部分数组保存到文件中
fw.write(contents, 0, 5);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭
if(fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
文本的文件复制:
package wwl.Io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 文本文件复制
*
*/
public class Text10 {
public static void main(String[] args) {
String src = "d:/abc.txt";
String dest = "d:/abc.txt";
copyFile1(src, dest);
copyFile2(src, dest);
}
//以文本文件复制,一次复制一个字符,异常处理,自动关闭流
public static void copyFile1(String srcFilename , String destFilename) {
try (
FileReader fr = new FileReader(srcFilename);
FileWriter fw = new FileWriter(destFilename);
){
int cc = fr.read();
while(cc != -1) {
fw.write(cc);
cc = fr.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//以文本文件复制,一次复制一个字符数组,异常处理,手动关闭流
public static void copyFile2(String srcFilename , String destFilename) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader(srcFilename);
fw = new FileWriter(destFilename);
char[] contents = new char[1024];
int len = fr.read(contents);
while(len != -1) {
fw.write(contents,0,len);
len = fr.read(contents);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
转换流:
package wwl.Io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
/**
* FileReader/FileWriter只能读写与当前环境编码兼容的文本文件
* 如果文本文件与当前环境编码不兼容,使用InputStreamReader/OutputStreamWriter转换流读写
* 转换流采用了适配器模式
*
*/
public class Test11 {
public static void main(String[] args) throws IOException {
m1();//使用InputStreamReader读取文件内容
m2();
}
//当操作的文件编码与当前环境编码不兼容可以使用OutStreamwriter把字符以指定的编码转换为字符
private static void m2() throws IOException {
//把字符保存到d:/abc.txt文件,该文件是GBk编码,当前环境是utf8编码,把字符转换为GBK格式再保存
OutputStream out = new FileOutputStream("d:/abc.txt",true);
OutputStreamWriter osw = new OutputStreamWriter(out,"GBK");
osw.write("\r\n");
osw.write("当前文件是转换流保存到文件,工作区是utf8,文件是GBK");
osw.close();
}
//当文本文件的编码与当前环境编码不兼容时,使用InputStreamReader类读取
private static void m1() throws IOException {
//读取d:/abc.txt文件,该文件使用GBK编码,当前环境使用UTF-8编码
//在当前程序与指定文件之间创建字节流通道
InputStream in = new FileInputStream("d:/abc.txt");
//使用GBK编码,把in字节流中的数据转换为字符流
InputStreamReader isr = new InputStreamReader(in, "GBK");
int len = isr.read();
while(len != -1) {
System.out.print((char)len);
len = isr.read();
}
isr.close();
}
}
字符缓冲流:
package wwl.Io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
/**
* 字符缓冲流
* BufferedReader/BufferedWriter
* 也称一种处理流,包装流
*
*/
public class Text12 {
public static void main(String[] args) throws IOException {
m1();//使用BufferedReader读取文本内容
m2();//使用BufferedWriter保存文本到文件
m3();//从键盘上输入文本,把这些文本保存到文件中
}
private static void m3() throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("d:/abc.txt"));
//使用BufferedReader对键盘输入流缓存
// System.in(字节流)是标准的输入设备,即键盘
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
while(line.length() > 0) {
bw.write(line);
bw.newLine();
line = br.readLine();
}
br.close();
bw.close();
}
private static void m2() throws IOException {
Writer out = new FileWriter("d:/abc.txt",true);
BufferedWriter bw = new BufferedWriter(out);
bw.write("我送你");
//bw.flush();//清空缓存区把数据保存到文件中
bw.close();
}
private static void m1() throws IOException {
Reader in = new FileReader("d:/abc.txt");
BufferedReader br = new BufferedReader(in);
//从缓冲字符流中读取一行,读到文件末尾返回null
String Line = br.readLine();
while(Line != null) {
System.out.println(Line);
Line = br.readLine();
}
br.close();//把包装流关闭后,被包装的流也会关闭
}
}