文件流: 顾名思义,程序和文件打交道.
此时我们谈及的文件,值得是纯文本文件(txt的,不要使用Word,Excel),
在字节流中,暂时不要使用中文.
FileInputStream: 文件的字节输入流
FileOutputStream: 文件的字节输出流
FileReader:文件的字符输入流
FileWriter:文件的字符输出流
文件字符流:
文件的字节流:
FileInputStream:
FileOutputStream:
使用字节流操作汉字或特殊的符号语言的时候,容易乱码,建议使用字符流.
先有字节流,后有字符流,字符流是对字节流的补充.
使用记事本打开某个文件,可以看到内容的就是文本文件,否则可以理解二进制.
一般的,操作二进制文件(图片,音频,视频等)必须使用字节流.
一般的,操作文本文件使用字符流.
如果不清楚是哪一类型文件,使用字节流.
文件的字符流:
FileReader:
FileWriter:
代码:
文件字节输入流:
public static void main(String[] args) throws IOException {File file = new File("file/stream.txt");InputStream in =new FileInputStream(file);File fileCopy = new File("file/streamCopy.txt");OutputStream out = new FileOutputStream(fileCopy);//System.out.println(in.read());
/* int read 读取一个字节,返回读取的字节int read(byte[] b)读取多个字节,并存储到数组中int read(byte[] b, int off, int len) */byte[] b = new byte[11];
/* * 输出文件内容方式一* in.read(b);String str = new String(b);System.out.println(str);*///System.out.println(Arrays.toString(b));打印结果为Unicode编码//输出文件内容方式二int len = -1;//-1表示文件读取到最后while((len = in.read(b))!=-1){String str = new String(b,0,len);//文件拷贝out.write(b,0,len);System.out.println(str);}in.close();}
文件字节输出流:
public static void main(String[] args) throws Exception {//文件可以帮我创建但是目录不能够帮我们创建,点解file文件夹refresh刷新file文件夹File file = new File("file/stream.txt");//如果文件不存在会自动创建刷新项目文件可以看见出现该文件了//获取FileOutputStream文件输出流对象,false表示不追加,true向文件中追加内容OutputStream out = new FileOutputStream(file,false);//在write方法中传入的参数为int或者是Byte如果传入的是int常量为65则转为Aout.write("hello java!".getBytes());
/* write(int b);把一个字节写出到文件中write(byte[] b, int off, int len);从b数组中的第off位置开始向文件中写入len位数字*/out.close();}
}
文件字符输出流:
package IO;import java.io.File;
import java.io.FileReader;
import java.io.Reader;public class CharReaderDemo {public static void main(String[] args) throws Exception {//获取源文件File file = new File("file/aaa.txt");//获取流对象Reader reader = new FileReader(file);int len = -1;//每次只能读取5个字符char[] cnt = new char[5];while((len = reader.read(cnt)) != -1){System.out.println(cnt);}}
}
文件字符输入流:
package IO;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class CharWriteDemo {public static void main(String[] args) throws IOException {File file = new File("file/aaa.txt");//如果想追加内容设为true,否则或者默认为falseWriter out = new FileWriter(file,true);String str = "我是新添加的字符串";char[] c= str.toCharArray();out.write(c);out.close();}
}
文件拷贝操作和资源的正确关闭:
文件拷贝:
package IO;import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;public class FileCopy {public static void main(String[] args) throws IOException {//获取源File srcfile = new File("file"); File[] files = srcfile.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return (new File(dir,name).isFile()&&name.endsWith(".txt"));}});File newFile = new File("new/copyFile.txt");OutputStream out = new FileOutputStream(newFile,true);System.out.println("------------写入操作---------------");for (File file : files) {System.out.println("文件名"+file.getName());InputStream in = new FileInputStream(file);int len = -1;byte[] b = new byte[10];len = in.read(b);while(len != -1){String fileContent = new String(b);System.out.println("文件内容"+fileContent+"有效长度"+len);out.write(b, 0, len);len = in.read(b);}in.close();}InputStream in1 = new FileInputStream(newFile);int len = -1;byte[] B = new byte[1024];System.out.println("----------输出拷贝后的文件内容-----------------");while((len = in1.read(B)) != -1){String str = new String(B);System.out.println(str);}in1.close();out.close();}
}
资源的正确关闭:
文件字节流使用案例:
案例1:文件拷贝案例-拷贝指定目录的指定类型文件到指定目录.
分析: 比如把C:/java目录中所有的java文件拷贝到D:/text/把拷贝的所有文件的拓展名改为.txt.
案例2:获取进程数据-编译和运行Java代码.
package IO;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;public class dynamicCompile {public static void main(String[] args) throws IOException {String str = "System.out.println(\"hello word!\")";exec(str);}static void exec(String str) throws IOException{//1.获取源文件File file = new File("file/Hello.java");//2.拼接一个完整的程序StringBuilder sb = new StringBuilder();sb.append("public class Hello {");sb.append("public static void main(String [] args) {").append(str).append(";").append("}}");//3.保存到hello.java文件中OutputStream out = new FileOutputStream(file);byte[] b = new byte[100];out.write(sb.toString().getBytes());out.close();//4.读取javac进程来编译hello.javaString command = "javac Hello.java";Process javacProcess = Runtime.getRuntime().exec(command);//5.读取javac进程中的错误流信息InputStream error = javacProcess.getErrorStream();//6. 读取流中的数据byte[] buffer = new byte[1024];int len = -1;while((len = error.read(buffer)) != -1){String msg = new String(buffer, 0, len);System.out.println(msg);}error.close();//7.调用java进程来运行hello.classProcess javaProcess = Runtime.getRuntime().exec("java Hello");//8.读取进程中的流信息InputStream info = javaProcess.getInputStream();while((len = info.read(buffer)) !=-1){String msg = new String(buffer, 0, len);System.out.println(msg);}info.close();//9.删除java和class文件file.delete();}
}