IO 输入/输出
- File类
- 作用:将具体的文件映射到内存中
- 构造方法:
(1)File file = new File(String path)
(2)File file = new File(String relativePath,String subPath)
path:是文件的路径
文件的路径:
-》绝对路径:(一般是从项目的根目录开始的路径)
-》相对路径:D:\test.txt (从磁盘盘符开始的路径) - 常用的方法(具体可见API):
lengeh() 获取文件大小
getName() 获取文件名称
list() 列出目录下所有的文件(文件及文件夹)
getPath() 获取相对路径
getAbsolutePath() 获取绝对路径
getParent() 获取上一级目录
getLastModified() 最后一次修改时间
delete() 删除文件对象指向的文件
canRead() 文件是否可读
canWrite() 文件是否可写
exists() 文件是否存在
mkdir() 创建空的目录
mkdirs() 创建多级目录
createNewFile() 创建文件
isDirectory() 是否是一个目录
isFile() 是否是一个文件
getParent() 获取父目录的对象,返回是字符串
getParentFile() 获取父目录对应的文件对象,返回File对象
具体实例:访问文件和目录
public class FileTest {
public static void main(String[] args) throws Exception{
//File类代表一个文件或者目录
File file =new File("C:/helloguigu/guigu.txt");
show(file);
}
public static void show(File file) throws Exception {
//获取文件的名字
System.out.println(file.getName());
//得到当前文件的父目录
System.out.println(file.getParent());
//获取上一级目录
System.out.println(file.getAbsoluteFile().getParent());
//得到文件的属性信息
System.out.println(file.canExecute());
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.length());
//通过File类在磁盘创建文件或者目录
File file2 =new File("C:/helloguigu/abc.txt");
// file2.createNewFile();
//创建一个目录
File file3 =new File("C:/abc");
// file3.mkdir();
//创建多级目录
File file4 =new File("C:/abcd/abc/ab/a");
// file4.mkdirs();
//删除文件或者目录
// file2.delete();
// file3.delete();
// file4.delete();
//得到指定目录下的 所有的文件或者目录
File file5 =new File("C:\\Users\\yhtx-22\\Desktop\\Java\\api\\jdk\\jdk-8u151-docs-all\\docs\\api");
// String [] fileList=file5.list();
// for (String str : fileList) {
// System.out.println(str);
// }
//得到所有的磁盘信息
File [] root =File.listRoots();
System.out.println("----根磁盘信息如下------------");
for (File ff : root) {
System.out.println(ff);
}
//判断文件是否存在
File file6 =new File("C:/guigu.txt");
System.out.println(file6.exists());
//得到指定内容的路径信息
System.out.println(file5.getPath());
System.out.println(file5.isDirectory());
System.out.println(file5.isFile());
}
}
文件过滤器:得到指定目录的指定文件
public class FileFilter {
public static void main(String[] args) {
dirIterator("data");
}
//递归输出
public static void dirIterator(String path) {
File file = new File(path); //传入一个文件路径
if(file.isDirectory()) { //判断它是不是目录
File[] f = file.listFiles();//获取目录下的所有文件及子目录
for(File x:f) {
if(x.isFile()) {
if(x.getName().endsWith(".txt")) { //遍历获取到后缀名为.txt的文件
System.out.println(x.getName());
}
}else {
dirIterator(x.getPath()); //递归调用
}
}
}else {
System.out.println(file.getName());
}
}
}
- Java中的IO流
Java中的IO是实现输入和输出的基础。
它可以方便的实现数据的输入和输出,在java把不同的输入源(键盘、文件、网络连接)描述为流,通过的流的方式,允许java程序使用相同的方式来访问不同的输入和输出源。
Java的io流涉及到的类都在java.io包下。
- 流的分类
输入流和输出流:
(1)输入流:只能从流中读取数据,不能向其写入数据。
(2)输出流:只能向其写入数据,而不能从中读取数据。
Java的输入流的基类主要是由InputStream 和Reader组成,输出流的基类主要是由OutputStream和Writer组成。
字符流和字节流:
(1)字节流和字符流的用法基本相同,区别在于字节流和字符流操作的数据单元不同----字节流操作的数据单元是8位字节,而字符流操作的数据单元是16位字节。
(2)字节流主要是由InputStream和OutputStream组成
(3)字符流主要是由Reader和Writer组成 - 字节流和字符流
(1)输入流:InputStream是所有字节输入流的父类,Reader是所有字符输入流的父类。
字符输入流举例:输出data/config.xml下的内容到控制台
public class CharReader {
public static void main(String[] args) throws IOException {
//需求:使用字符输入流读取字符类型的文件内容
//1.创建文件对象,需要读取的文件
File file=new File("data/config.xml");
//2.利用文件对象创建字符输入流
FileReader reader=new FileReader(file);
//3.创建字符数组作为容器
char[] chars=new char[20];
//循环将文件的字符数据读字符数组,每次读取20个字符,直到返回-1,读取完成
// reader.read(chars,0,chars.length);
//reader读取完数据返回-1
int len=-1;
while((len=reader.read(chars,0,chars.length))!=-1) {
//输出读取到的字符数据
for(int i=0;i<len;i++) {
System.out.print(chars[i]);
}
// System.out.println("");
}
}
}
字节输入流举例:输出C:/man.txt文件的内容到控制台
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis =null;
try {
//创建字节输入流
fis =new FileInputStream("C:/man.txt");
// FileInputStream fis2 =new FileInputStream(new File("C:/man.txt"));
byte [] buffer =new byte[2];
int hasRead=0;
while((hasRead=fis.read(buffer))!=-1) {
String str=new String(buffer,0,hasRead);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(2)输出流
字符输出流举例:向C:/abc.txt文件中写入内容
public class FileWriterDemo {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("C:/abc.txt",true);//实现文件内容的追加
fw.write("hello jack\r\n");
fw.write("hello java\r\n");
//立即写入
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节输出流举例:向C:/aaa.txt文件中写入内容
public class FileOutputStreamDemo {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("C:/aaa.txt",true);//实现文件内容的追加
fos.write("hello java".getBytes());//string类型的字符串转换为字节写入内容中
fos.write("hello oracle".getBytes());
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close(); //关闭字节输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
经典案例:输入流和输出流实现文件的复制
输出流实现:
public class CopyFile {
public static void main(String[] args) throws IOException{
//需求:使用字符输入流与输出流实现复制当前文件到另一个文件
//输入流
FileReader reader = new FileReader("data/config.xml");//要复制的文件内容
FileWriter writer = new FileWriter("data/new_config.xml");//复制成功的文件内容
char[] chars = new char[20];
int len=-1;
while((len=reader.read(chars))!=-1) {
writer.write(chars, 0, len); //将读到的文件内容写入新的文件中
}
reader.close();
writer.close();
writer.close();
}
}
字节流实现:
public class CopyStream {
public static void main(String[] args) throws IOException{
//需求:以字节流的形式读取字符文件,然后输出到控制台
File file1=new File("data/1.png");
File file2=new File("data/2.png");
//利用File对象创建字节输入流
FileInputStream input=new FileInputStream(file1);
FileOutputStream output=new FileOutputStream(file2);
//每次读取字节数
byte[] bytes=new byte[1024];
int len=-1;
while((len=input.read(bytes))!=-1) {
output.write(bytes, 0, len);
}
output.flush();
output.close();
input.close();
}
}
注意:如果操作的是纯文本文件,需要使用字符流,防止出现乱码问题;而如果操作的是二进制文件则使用字节流。