文件操作
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStream_ {
//写入文件时如果文件不存在,则会创建一个文件
//注意:当new FileOutputStream(File,boolean) 第二个参数设为true为在原文件中append而不是覆盖
//第一种写入方式:一次写一个字符
@Test
public void writeFile(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write('W');
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第二种一次写入多个字节
@Test
public void writeFile2(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("WST".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第二种一次写入多个字节,指定范围
@Test
public void writeFile3(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("WST hello".getBytes(),0,2);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileInputStream
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputSteam_ {
//第一种读取方式:一次读取一个字节
@Test
public void readFile(){
String filePath="d:\\a.txt";
File file = new File(filePath);
FileInputStream fileInputStream = null;
//用于接收读取出来的数据
int fileData=0;
try {
fileInputStream=new FileInputStream(file);
while ( (fileData=fileInputStream.read()) !=-1 ){
System.out.print((char) fileData);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第二种读取方式一次读取多个字节
@Test
public void readFile2(){
String filePath = "D:\\a.txt";
File file = new File(filePath);
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
byte[] aByte = new byte[8];
int readLen = 0;
while ((readLen = fileInputStream.read(aByte) )!= -1){
System.out.print(new String(aByte,0,readLen,"UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileOutputStream
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStream_ {
//写入文件时如果文件不存在,则会创建一个文件
//注意:当new FileOutputStream(File,boolean) 第二个参数设为true为在原文件中append而不是覆盖
//第一种写入方式:一次写一个字符
@Test
public void writeFile(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write('W');
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第二种一次写入多个字节
@Test
public void writeFile2(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("WST".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第二种一次写入多个字节,指定范围
@Test
public void writeFile3(){
String filePath = "d:\\b.txt";
File file = new File(filePath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("WST hello".getBytes(),0,2);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
节点流和处理流的区别
节点流可以从一个特定的数据源读写数据。
处理流也叫包装流是在已存在的流(节点流或者处理流)之上,为程序提供更强大的读写功能。
字节处理流拷贝文件
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.*;
public class CopyFile {
public static void main(String[] args){
}
//字节处理流文件拷贝
@Test
public void copyFile1() throws Exception{
String fileReadPath = "d:\\c.txt";
String fileWritePath = "d:\\d.txt";
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
bufferedReader = new BufferedReader(new FileReader(fileReadPath));
bufferedWriter = new BufferedWriter(new FileWriter(fileWritePath));
String fileData = "";
while ((fileData = bufferedReader.readLine()) != null){
bufferedWriter.write(fileData);
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
}
//字节流拷贝文件
@Test
public void copyFile2(){
String fileInputPath = "d:\\dog.png";
String fileOutPath = "d:\\dpg2.png";
BufferedInputStream bf = null;
BufferedOutputStream bo =null;
try {
bf = new BufferedInputStream(new FileInputStream(fileInputPath));
bo = new BufferedOutputStream(new FileOutputStream(fileOutPath));
byte[] data = new byte[1024];
int dataLen = 0;
while((dataLen=bf.read(data)) != -1){
bo.write(data, 0, dataLen);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bf != null){
bf.close();
}
if(bo != null){
bo.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
对象处理流(序列化)
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.*;
public class CopyFile {
public static void main(String[] args){
}
//字节处理流文件拷贝
@Test
public void copyFile1() throws Exception{
String fileReadPath = "d:\\c.txt";
String fileWritePath = "d:\\d.txt";
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
bufferedReader = new BufferedReader(new FileReader(fileReadPath));
bufferedWriter = new BufferedWriter(new FileWriter(fileWritePath));
String fileData = "";
while ((fileData = bufferedReader.readLine()) != null){
bufferedWriter.write(fileData);
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
}
//字节流拷贝文件
@Test
public void copyFile2(){
String fileInputPath = "d:\\dog.png";
String fileOutPath = "d:\\dpg2.png";
BufferedInputStream bf = null;
BufferedOutputStream bo =null;
try {
bf = new BufferedInputStream(new FileInputStream(fileInputPath));
bo = new BufferedOutputStream(new FileOutputStream(fileOutPath));
byte[] data = new byte[1024];
int dataLen = 0;
while((dataLen=bf.read(data)) != -1){
bo.write(data, 0, dataLen);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bf != null){
bf.close();
}
if(bo != null){
bo.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
节点流和处理流注意事项
1)读写顺序要一致
2)要求实现序列化或反序列化对象,需要实现 Serializable
3)序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
4)序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员5)序列化对象时,要求里面属性的类型也需要实现序列化接口
6)序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
转换流
inputStreamReader
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.*;
//读入字符转换流
public class InputStream_ {
String filePath = "d:\\e.txt";
@Test
public void test1() throws IOException{
BufferedReader bf = new BufferedReader(new FileReader(filePath));
String fileData = null;
while ((fileData=bf.readLine()) != null){
System.out.println(fileData);
}
bf.close();
}
@Test
public void inputStreamReader_() throws IOException {
//将字节流转换为字符流&&原文件是gbk编码,用默认编码解析会报错
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));
String fileData = null;
while ((fileData=bf.readLine()) != null){
System.out.println(fileData);
}
bf.close();
}
}
OutputStreamWriter
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
//输出字符转换流 字节流->字符流
//编码设置
public class OutputStreamWriter_ {
@Test
public void test() throws IOException {
String filePath = "d:\\e.txt";
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath,true), "gbk"));
bw.write("勇敢去飞!");
bw.newLine();
bw.write("123456");
bw.close();
}
}
打印流
打印流只有输出流,没有输入流。
PrintStream
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.PrintStream;
//打印字节流
public class PrintStream_ {
@Test
public void printStream() throws IOException {
PrintStream out = System.out;
out.println("勇敢去飞");
String filePath = "d:\\f.txt";
System.setOut(new PrintStream(filePath));
System.out.println("勇敢去飞3");
}
}
PrintWriter
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
//打印字符流
public class PrintWriter_ {
@Test
public void test() throws IOException {
PrintWriter pw = new PrintWriter(System.out);
pw.write("勇敢去飞");
String filePath = "d:\\g.txt";
PrintWriter printWriter = new PrintWriter(new FileWriter(filePath));
printWriter.write("123456");
printWriter.close();
}
}
注意:打印字符输出流一定要有关闭流操作,close方法中包含真正的写操作。
读写Properties文件
package com.st.io;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
//properties读写
public class Properties_ {
//properties读入
@Test
public void readProperties() throws IOException {
Properties p = new Properties();
//加载properties文件
p.load(new FileInputStream("C:\\Users\\songtao\\Desktop\\ideaWorkspace\\io\\src\\Properties_.properties"));
//控制台打印properties文件
p.list(System.out);
//获取属性
String user = p.getProperty("user");
String age = p.getProperty("age");
System.out.println("user:"+user);
System.out.println("age:"+age);
}
@Test
public void writeProperties() throws IOException{
Properties p = new Properties();
String filePath = "C:\\Users\\songtao\\Desktop\\ideaWorkspace\\io\\src\\Properties_.properties";
p.setProperty("age", "12");
p.setProperty("name", "张三");
p.store(new FileWriter(filePath), null);
}
}