public File(String pathname)
public File(String parent,String child)
public File(File parent,String child)
windows和DOS系统默认使用“\”来表示
UNIX和URL使用“/”来表示
public static final String separator。// 根据操作系统,动态的提供分隔符。
File类的获取功能:
File类的重命名功能
File类的判断功能
File类的创建功能
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
File类的删除功能
删除注意事项:
package com.yx.demo1;
import java.io.File;
import java.io.IOException;
import org.junit.Test;
/*
* 本类用于演示File类的常用方法
*/
public class TestOne {
@Test
public void testOne() throws IOException {
// 绝对路径
// File("D:\\testfile\\hello.txt");//创建File类对象的时候需要一个字符串参数,这个字符串是个路径
// 相对路径
File file = new File("src\\hello1.txt"); // 相对路径是当前项目下,文件类型
//File file1 = new File("src\\com\\yx\\demo2"); // 相对路径是当前项目下,目录类型
boolean flag = file.exists();//对象代表的文件是否存在,返回true代表文件存在,返回false代表文件不存在。
System.out.println(flag);
if(file.isFile()){//返回true代表这是一个文件对象,返回false代表不是
if(!flag){
file.createNewFile();//创建新文件
}
long l = file.length();//该文件的长度,字节数。
System.out.println(l);
System.out.println(file.getAbsoluteFile());//返回文件的绝对路径+文件名的那个文件
System.out.println(file.getAbsolutePath());//返回文件的绝对路径+文件名的路径
System.out.println(file.getPath());//返回相对路径创建文件时的相对路径名+文件名,如果是绝对路径创建文件则和getAbsolutePath()返回一样。
System.out.println(file.getName());//返回无路径文件名
System.out.println(file.getParent());//返回文件所在文件夹的名字
System.out.println(file.length());
System.out.println(file.lastModified());
System.out.println(file.isFile());
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.isHidden());
file.delete();
}
if (file.isDirectory()) {// 返回true代表这是一个文件夹,返回false代表不是
file.mkdir();//创建文件夹
String[] names = file.list();// 返回该文件夹下所有的文件及文件夹的名字
File[] files = file.listFiles();// 返回该文件夹下所有的文件的文件对象数组
// for(String s : names){
// System.out.println(s);
// }
for (File currFile : files) {
showFileName(currFile);
}
}
}
// 用于递归的调用文件夹里的文件内容
public void showFileName(File file) {
if (file.isDirectory()) {
System.out.println(file.getName());
File[] files = file.listFiles();
for (File currFile : files) {
showFileName(currFile);
}
} else {
System.out.println(file.getName());
}
}
}
1. Java IO原理:
2. 节点流和处理流
抽象基类是不可实例化对象的类!
3. InputStream (字节输入流抽象基类)& Reader (字符输入流抽象基类)
int read()
int read(byte[] b) // 字节流 8 bit = 1byte
int read(byte[] b, int off, int len)
int read()
int read(char [] c) // 字符流 16bit = 2bytes = 1 char (java中char是2字节)
int read(char [] c, int off, int len)
①. InputStream
package com.yx.demo1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.junit.Test;
/*
* 本类用于演示字节节点输入流
*/
public class TestFileInputStream {
// 本方法用于演示一次读取单个字节的情况
@Test
public void testOne() throws Exception {
File file = new File("src\\FileInputStream.txt");// 和硬盘上的文件产生输入流,是要占用硬盘文件的。
if (!file.exists()) {
file.createNewFile();
}
FileInputStream fis = new FileInputStream(file); // 构造方法也可以是下面的直接传文件路径
// FileInputStream fis = new FileInputStream("src\\FileInputStream.txt");
// FileInputStream 每次读出来是一个字节
// 现在假设文件存在,并且里面是有数据的,我们说过FileInputStream 最好是来读取二进制文件
// 还有就是比如纯英文这类的文件(因为是ASCII范围内 一个字节就可以表示)
// 中文的话读出来的肯定是乱码!
int i;
// while((i = fis.read())!=-1){//每次读取一个字节的2进制数,返回这个2进制数的十进制形式。
// char c = (char)i;//将对应的十进制整数转换长字符
// System.out.print(c);
// }
while (true) {
i = fis.read();
if (i == -1) {
break;
}
char c = (char) i;
System.out.print(c);
}
fis.close();// 关闭流
}
// 本方法用于演示一次读取一个字节数组的情况
@Test
public void testTwo() throws Exception {
File file = new File("src\\FileInputStream.txt");// 和硬盘上的文件产生输入流,是要占用硬盘文件的。
if (!file.exists()) {
file.createNewFile();
}
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
//为什么要string封装,因为为了打印出来,byte没有重写toString方法
String s = new String(data);
System.out.println(s);
fis.close();
// for(byte b : data){
// char c = (char)b;
// System.out.print(c);
// }
}
// 本方法用于演示一次读取一个字节数组固定长度的情况
@Test
public void testThree() throws Exception {
File file = new File("src\\FileInputStream.txt");// 和硬盘上的文件产生输入流,是要占用硬盘文件的。
if (!file.exists()) {
file.createNewFile();
}
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[1024];
int length;
// fis.read(data,begin,length)//读取从begin位置开始,length个长度的元素进入到数组中
// 由于文件内容我这边知道多长,为了演示,我想从开头20个字节偏移开始读取
// 从20个字节开始读取, skip跳过字节
fis.skip(20);
System.out.println(data);
while ((length = fis.read(data)) != -1) {
fis.read(data, 0, length);
String s = new String(data);
System.out.print(s);
}
fis.close();
}
}
②. Reader
package com.yx.demo1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import org.junit.Test;
/*
* 本类用于演示字符节点输入流
*/
public class TestFileReader {
//测试字符节点输入流
@Test
public void testOne() throws Exception{
// FileReader 读取英文,中文其他文本文件都是OK的
File file = new File("src\\FileReader.txt");
FileReader reader = new FileReader(file);
// int i = reader.read();
// System.out.println(i);
char[] data = new char[(int)file.length()];
reader.read(data);
String s = new String(data);
System.out.println(s);
reader.close();
}
}
4. OutputStream (字节输出流抽象基类)& Writer (字符输出流抽象基类)
void write(int b/int c);
void write(byte[] b/char[] cbuf);
void write(byte[] b/char[] buff, int off, int len);
void flush();
void close(); // 需要先刷新,再关闭此流
void write(String str);
void write(String str, int off, int len);
①. OutputStream
package com.yx.demo1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
/*
* 本类用于演示字节节点输出流
*/
public class TestFileOutputStream {
/*
* 本方法演示一次输出一个字节
*/
@Test
public void testOne() throws Exception{
File file = new File("src\\FileOutputStream.txt");
if(!file.exists()){
file.createNewFile();
}
//利用硬盘File文件对象构建输入出流。
//第二个参数是一个boolean类型,这个参数的意思是是否覆盖原文件中的内容,默认值是false.意思是覆盖原文件中的内容。
//如果是true,就代表保留原文件中的内容,新的输出会追加到文件原来内容的末尾。
FileOutputStream fos = new FileOutputStream(file,true);
//fos.write(97);//向文件中输出一个字节的内容,ASCII码值OK
fos.write('b');
//fos.write('你'); //乱码,中文是一个字符不是一个字节,被截取了当然是乱码!
//fos.write('好');
fos.close();
}
/*
* 本方法演示一次输出一个字节数组
*/
@Test
public void testTwo() throws Exception{
File file = new File("src\\FileOutputStream.txt");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file,true);//利用硬盘File文件对象构建输入出流。
// 为什么这里可以输出中文了? 因为调用了 getBytes 去把每个字符转为了相对应的字节数
// 所以写入的时候其实原本数据都写了,并没有截取
// 下面的输出长度可以看到,10个字符被转为20个字节
System.out.println("好好学习,天天向上。".length()); // 10
byte[] data = "好好学习,天天向上。".getBytes();
System.out.println(data.length); // 20
fos.write(data);
fos.close();
}
/*
* 本方法演示一次输出一个固定长度的字节数组
*/
@Test
public void testThree() throws Exception{
File file = new File("src\\FileOutputStream.txt");
if(!file.exists()){
file.createNewFile();
}
//利用硬盘File文件对象构建输入出流。
//第二个参数是一个boolean类型,这个参数的意思是是否覆盖原文件中的内容,默认值是false.意思是覆盖原文件中的内容。
//如果是true,就代表保留原文件中的内容,新的输出会追加到文件原来内容的末尾。
FileOutputStream fos = new FileOutputStream(file,false);
byte[] data = "好好学习,天天向上。".getBytes();
//fos.write(data,begin,length);
fos.write(data,0,data.length/2);//三个参数的时候,第一个参数就是存储数据的数组,从第二个参数位置开始,输出第三个参数个长度。
// 只写入了 "好好学习,"
fos.close();
}
}
②. Writer
package com.yx.demo1;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.junit.Test;
/*
* 本类用于演示字符节点输出流
*/
public class TestFileWriter {
//演示字符节点输出流
@Test
public void testOne() throws IOException{
File file = new File("src\\FileWriter.txt");
FileWriter fw = new FileWriter(file,true);
// fw.write('女');
// fw.flush();
String s = "同一个世界,同一个梦。";
char[] data = s.toCharArray();
System.out.println(s.length()); // 11
System.out.println(data.length); // 11
// 因为FileWriter本身是处理字符流
fw.write(data);
fw.write(s);
//清空缓冲区,将缓冲区中的所有内容一起写出去。
//一般我们write时候最后最好是要调用flush!
fw.flush();
fw.close();//关闭流,关闭流的同时清空缓冲区。
}
}
注意点:
演示加异常处理代码:
package com.yx.demo1;
import java.io.File;
import java.io.FileInputStream;
import org.junit.Test;
public class FileTest {
FileInputStream fis;
@Test
public void testOne() throws Exception {
try {
File file = new File("src\\aaa.txt"); // 假如没有aaa.txt文件
fis = new FileInputStream(file);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage()); // src\aaa.txt (系统找不到指定的文件。)
} finally {
// 我们把关闭文件放在finally 语句块中,因为不管什么时候finally 一定会执行到
// 如果写的严谨,很多地方都加上try-catch,
//if (fis != null) {
try {
fis.close();// 关闭流
} catch (Exception e2) {
// TODO: handle exception
System.out.println(e2.getMessage()); // null
}
//}
}
}
}
5. 处理流之一: 缓冲流
public class BufferedInputStream extends FilterInputStream {
private static int DEFAULT_BUFFER_SIZE = 8192;
public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
public class BufferedReader extends Reader {
private static int defaultCharBufferSize = 8192;
public class BufferedWriter extends Writer {
private static int defaultCharBufferSize = 8192;
字节缓冲流: BufferedInputStream 和 BufferedOutputStream
字符缓冲流: BufferedReader 和 BufferedWriter
package com.yx.demo1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.junit.Test;
public class TestBuffered {
// TODO Auto-generated method stub
//演示字符处理流:缓冲流 写
@Test
public void testOne()throws IOException{
File file = new File("src\\BufferedWriter.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
//bw.write("世界那么大,我想去看看。");
bw.newLine();
bw.write("锄禾日当午,");
bw.newLine();
bw.write("汗滴禾下土。");
bw.newLine();
bw.write("谁知盘中餐,");
bw.newLine();
bw.write("粒粒皆辛苦。");
bw.flush();
bw.close();
}
//演示字符处理流:缓冲流 读
@Test
public void testTwo() throws Exception{
File file = new File("src\\BufferedWriter.txt");
//BufferedReader是一个处理流对象,处理流对象必须由一个节点流对象构建。
BufferedReader br =new BufferedReader(new FileReader(file));
String s;
while((s=br.readLine())!=null){
System.out.println(s);
}
}
}
6. 处理流之二:转换流
InputStreamReader:将InputStream转换为Reader
OutputStreamWriter:将Writer转换为OutputStream
InputStreamReader:
public InputStreamReader(InputStream in)
public InputSreamReader(InputStream in,String charsetName)
如: Reader isr = new InputStreamReader(System.in,”gbk”);
OutputStreamWriter:
public OutputStreamWriter(OutputStream out)
public OutputSreamWriter(OutputStream out,String charsetName)
package com.yx.demo1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import org.junit.Test;
/*
* 本类用于演示转换流
*/
public class TestStreamReaderWriter {
//演示利用转换流构建字符输入流
@Test
public void testOne()throws Exception{
File file = new File("src\\StreamReaderWriter.txt");
//利用转换流将一个字节的节点流封装成一个字符的处理流
//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
//第一步,构建字节节点流
FileInputStream fis = new FileInputStream(file);
//第二步,利用字节节点流构建转换流
InputStreamReader isr = new InputStreamReader(fis);
//第三步,利用转换流作为基础构建字符处理流
BufferedReader br = new BufferedReader(isr);
String s;
while((s=br.readLine())!=null){
System.out.println(s);
}
br.close();
}
//演示利用转换流构建字符输出流
@Test
public void testTwo()throws Exception{
File file = new File("src\\StreamReaderWriter.txt");
if(!file.exists()){
file.createNewFile();
}
//利用转换流,将一个字节节点输出流转换成字符的处理输出流
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true)));
//第一步,利用字节节点流和文件建立输出流
FileOutputStream fos = new FileOutputStream(file,true);
//第二步,利用转换流,将一个字节节点流构建成字符流
OutputStreamWriter osw = new OutputStreamWriter(fos);
//第三部,利用转换流创建字符处理流
BufferedWriter bw = new BufferedWriter(osw);
bw.newLine();//再追加到文件上时,先换行。
bw.write("鹅鹅鹅");
bw.newLine();
bw.write("曲颈用刀割");
bw.newLine();
bw.write("拔毛添上水");
bw.newLine();
bw.write("点火盖上锅");
bw.close();
}
}
7. 处理流之三:标准输入、输出流
public static void setIn(InputStream in)
public static void setOut(PrintStream out)
package com.yx.demo1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class SystemInOutStream {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入信息(退出输入e或exit):");
// 把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = null;
try {
while ((s = br.readLine()) != null) { // 读取用户输入的一行数据 --> 阻塞程序
if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)) {
System.out.println("安全退出!!");
break;
}
// 将读取到的整行字符串转成大写输出
System.out.println("-->:" + s.toUpperCase());
System.out.println("继续输入信息");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close(); // 关闭过滤流时,会自动关闭它包装的底层节点流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
8. 处理流之四:打印流
package com.yx.demo1;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class TestPrintStream {
public static void main(String[] args) {
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream(new File("src\\PrintStream.txt"));
// 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)
ps = new PrintStream(fos, true);
if (ps != null) {// 把标准输出流(控制台输出)改成文件
System.setOut(ps);
}
for (int i = 0; i <= 255; i++) { // 输出ASCII字符
System.out.print((char) i);
if (i % 50 == 0) { // 每50个数据一行
System.out.println(); // 换行
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
}
}
}
10. 处理流之五:对象流 (字节流子类)
对象的序列化
1. Serializable
2. Externalizable
private static final long serialVersionUID;
使用对象流序列化对象:
创建一个 ObjectOutputStream
调用 ObjectOutputStream 对象的 writeObject(对象) 方法输出可序列化对象
注意写出一次,操作flush()一次
创建一个 ObjectInputStream
调用 readObject() 方法读取流中的对象
package com.yx.demo1;
import java.io.Serializable;
/*
*Serializable被称为可序列化接口,一个类实现了这个接口就允许该类的对象执行序列化和反序列化操作
*这个接口里没有任何方法,序列化和反序列化实际上是虚拟机操作。
*这个接口的作用实际上标记的作用。
*如果需要对象流操作的对象,它的类必须要实现这个接口
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String stuName;
private Integer stuAge;
private String stuGender;
public Student(String stuName, Integer stuAge, String stuGender) {
super();
this.stuName = stuName;
this.stuAge = stuAge;
this.stuGender = stuGender;
}
public Student() {
super();
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getStuAge() {
return stuAge;
}
public void setStuAge(Integer stuAge) {
this.stuAge = stuAge;
}
public String getStuGender() {
return stuGender;
}
public void setStuGender(String stuGender) {
this.stuGender = stuGender;
}
@Override
public String toString() {
return "Student [stuName=" + stuName + ", stuAge=" + stuAge + ", stuGender=" + stuGender + "]";
}
}
package com.yx.demo1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
/*
* 本类用于演示对象输入输出流
*/
public class TestObjectStream {
//演示对象输出流
@Test
public void testOne()throws Exception{
File file = new File("src\\objectStream.txt");
if(!file.exists()){
file.createNewFile();
}
//ObjectOutputStream流是处理流需要一个节点流FileOutputStream辅助构建对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
Student stu = new Student("Tom",20,"男");
oos.writeObject(stu);//输出一个对象
oos.flush();//清空缓冲区,立即写出。
oos.close();
}
//演示对象输入流
@Test
public void testTwo()throws Exception{
File file = new File("src\\objectStream.txt");
//创建对象输入流,使用文件输入流作为构建对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Student stu = (Student)ois.readObject();
System.out.println(stu);
ois.close();
}
}