黑马程序员————IO流3(day20)
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
IO流3
l File概述
l File类常见方法
l 列出目录下所有内容-递归
l 删除带内容的目录
l 创建java文件列表
l Properties简述
l Properties存取
l Properties存取配置文件
l PrintWriter
l 合并流
l 切割文件
File概述
File类
用来将文件或者文件夹封装成对象,方便对文件与文件夹进行操作。
File对象可以作为参数传递给流的构造函数。
了解File类中的常用方法。
File类似乎IO包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操纵文件,通过调用File类提供的各种方法,能够完成创建、删除文件,重命名文件等,判断文件的读写权限及文件是否存在,设置和查询文件的最近修改时间等操作。
示例:
import java.io.*;
class FileDemo {
public static void main(String[] args) {
consMethod();
}
// 创建File对象
public static void consMethod() {
// 将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹封装成对象
File f1 = new File("a.txt");// 相对路径,输出时就输出相对路径
File f2 = new File("f:\\abc", "b.txt");// 绝对路径,输出时就输出绝对路径
File d = new File("d:\\abc");
File f3 = new File(d, "c.txt");
System.out.println("f1:" + f1);
System.out.println("f2:" + f2);
System.out.println("f3:" + f3);
// File.separator代表目录分隔符,可以跨平台,相当于\\
File f4 = new File("f:" + File.separator + "abc" + File.separator
+ "zzz" + File.separator + "a.txt");
}
}
运行结果:f1:a.txt
f2:f:\abc\b.txt
f3:d:\abc\c.txt
Java能正确处理UNIX和Windows/DOS约定路径分隔符。如果在Windows版本的Java下用斜线(/),路径处理依然正确。记住:如果Windows/DOS使用反斜线(\)的约定,就需要在字符串内使用它的转移序列(\\)。Java约定是用UNIX和URL风格的斜线来作路径分隔符。
File类常见方法
File类常见方法:
1. 创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2. 删除
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();在程序退出时删除指定文件。
3. 判断
boolean exists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
4. 获取信息
getName():
getPath():
getParent():
getAbsolutePath()
long lastModified()
long length()
创建删除示例:
import java.io.*;
class FileDemo {
public static void main(String[] args) throws IOException {
method_1();
}
public static void method_1() throws IOException {
File f = new File("file.txt");
// 在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
System.out.println("create:" + f.createNewFile());
// f.deleteOnExit();// 在程序退出时删除指定文件。
// 删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
System.out.println("delete:" + f.delete());
}
判断示例:
import java.io.*;
class FileDemo {
public static void main(String[] args) throws IOException {
method_2();
}
// 判断
public static void method_2() {
File f1 = new File("file.txt");
System.out.println("exists:" + f1.exists());// 判断文件是否存在
// System.out.println("execute:"+f1.canExecute());
// 创建文件夹
// File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
// System.out.println("mkdir:"+dir.mkdirs());
File f2 = new File("F:\\myjava\\Demo\\src\\day20\\IO\\file2.txt");
// f.createNewFile();
// f.mkdir();
// 记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
// 通过exists判断。
System.out.println("dir:" + f2.isDirectory());// 判断f2是目录吗
System.out.println("file:" + f2.isFile());// 判断f2是文件吗
System.out.println(f2.isAbsolute());// 判断f2路径是否为绝对路径
}
运行结果:exists:false
dir:false
file:false
true
获取示例:
import java.io.*;
class FileDemo {
public static void main(String[] args) throws IOException {
method_3();
}
// 获取
public static void method_3() {
File f1 = new File("file.txt");
System.out.println("path:" + f1.getPath());// 封装成什么路径就获取什么路径
System.out.println("abspath:" + f1.getAbsolutePath());// 不管封装成什么,只获取绝对路径
// 该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null
// 如果相对路径中有上一层目录那么该目录就是返回结果
System.out.println("parent:" + f1.getParent());// 把f2重命名为f3,Test.java重命名为haha.java
File f2 = new File("f:\\Test.java");
File f3 = new File("f:\\haha.java");
System.out.println("rename:" + f2.renameTo(f3));
}
运行结果:path:file.txt
abspath:F:\myjava\Demo\file.txt
parent:null
rename:true
列出目录下所有内容-递归
列出指定目录下文件或者文件夹,包含子目录中的内容,也就是列出指定目录下所有内容。
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是函数自身调用自身,这种表现形式,或者编程手法,称为递归。
递归要注意:
1. 限定条件
2. 要注意递归的次数,尽量避免内存溢出。
示例:
import java.io.*;
class FileDemo2 {
public static void main(String[] args) {
File dir = new File("f:\\myjava");
showDir(dir);
//toBin(6);
//int n = getSum(100);
//System.out.println("n="+n);
}
// 累加和
public static int getSum(int n){
if(n==1)
return 1;
return n+getSum(n-1);// 递归,函数自身调用自身
}
// 转二进制
public static void toBin(int num){
if(num>0){
toBin(num/2);// 递归,函数自身调用自身
System.out.println(num%2);
}
}
// 列出指定目录下文件或者文件夹,包含子目录中的内容
public static void showDir(File dir){
System.out.println(dir);
File[] files = dir.listFiles();
for(int x=0;x<files.length; x++){
if(files[x].isDirectory())
showDir(files[x]);// 递归,函数自身调用自身
else {
System.out.println(files[x]);
}
}
}
}
删除带内容的目录
删除一个带内容的目录。
删除原理:
在window中,删除目录从里面往外删除的,既然是从里往外删除,就需要用到递归。
示例:
import java.io.*;
class RemoveDir {
public static void main(String[] args) {
File dir = new File("f:\\myjava1");
removeDir(dir);
}
public static void removeDir(File dir) {
File[] files = dir.listFiles();
for (int x = 0; x < files.length; x++) {
if (files[x].isDirectory())
removeDir(files[x]);
else
System.out.println(files[x].toString() + ":-file-:"
+ files[x].delete());
}
System.out.println(dir + "::dir::" + dir.delete());
}
}
创建java文件列表
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件。
思路:
1. 对指定的目录进行递归。
2. 获取递归过程所以的java文件的路径。
3. 将这些路径存储到集合中。
4. 将集合中的数据写入到一个文件中。
示例:
import java.io.*;
import java.util.*;
class JavaFileList {
public static void main(String[] args) throws IOException {
File dir = new File("f:\\myjava");
List<File> list = new ArrayList<File>();
fileToList(dir, list);
// System.out.println(list.size());
File file = new File(dir, "javalist.txt");
writeToFile(list, file.toString());
}
public static void fileToList(File dir, List<File> list) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory())
fileToList(file, list);
else {
if (file.getName().endsWith(".java"))
list.add(file);
}
}
}
public static void writeToFile(List<File> list, String javaListFile)
throws IOException {
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(javaListFile));
for (File f : list) {
String path = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
throw e;
} finally {
try {
if (bufw != null)
bufw.close();
} catch (IOException e) {
throw e;
}
}
}
}
Properties简述
Properties是hashtable的子类,也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串,是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
那么在加载数据时,需要数据有固定格式:键=值。
Properties存取
示例:
import java.io.*;
import java.util.*;
class PropertiesDemo {
public static void main(String[] args) {
setAndGet();
}
// 设置和获取元素
public static void setAndGet() {
Properties prop = new Properties();
prop.setProperty("zhangsan", "20");
prop.setProperty("lisi", "30");
// System.out.println(prop);
String value = prop.getProperty("lisi");
// System.out.println(value);
prop.setProperty("lisi", 89 + "");
Set<String> names = prop.stringPropertyNames();
for (String s : names) {
System.out.println(s + ":" + prop.getProperty(s));
}
}
}
Properties存取配置文件
示例:
import java.io.*;
import java.util.*;
class PropertiesDemo {
public static void main(String[] args) throws IOException {
// method_1();
loadDemo();
}
public static void loadDemo() throws IOException {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream("info.txt");
// 将流中的数据加载进集合。
prop.load(fis);
prop.setProperty("wangwu", "39");
FileOutputStream fos = new FileOutputStream("info.txt");
prop.store(fos, "haha");
// System.out.println(prop);
prop.list(System.out);
fos.close();
fis.close();
}
// 演示,如何将流中的数据存储到集合中。
// 想要将info.txt中键值数据存到集合中进行操作。
/*
* 1,用一个流和info.txt文件关联。 2,读取一行数据,将该行数据用"="进行切割。
* 3,等号左边作为键,右边作为值。存入到Properties集合中即可。
*/
public static void method_1() throws IOException {
BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
String line = null;
Properties prop = new Properties();
while ((line = bufr.readLine()) != null) {
String[] arr = line.split("=");
// /System.out.println(arr[0]+"...."+arr[1]);
prop.setProperty(arr[0], arr[1]);
}
bufr.close();
System.out.println(prop);
}
}
PrintWriter
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:PrintStream,构造函数可以接收的参数类型:
1. file对象。File
2. 字符串路径。String
3. 字节输出流。OutputStream
字符打印流:PrintWriter,构造函数可以接收的参数类型:
1. file对象。File
2. 字符串路径。String
3. 字节输出流。OutputStream
4. 字符输出流,Writer。
示例:
import java.io.*;
class PrintStreamDemo {
public static void main(String[] args) throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter out = new PrintWriter(new FileWriter("a.txt"), true);
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
out.println(line.toUpperCase());
// out.flush();
}
out.close();
bufr.close();
}
}
合并流
示例:
import java.io.*;
import java.util.*;
class SequenceDemo {
public static void main(String[] args) throws IOException {
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("f:\\1.txt"));
v.add(new FileInputStream("f:\\2.txt"));
v.add(new FileInputStream("f:\\3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("f:\\4.txt");
byte[] buf = new byte[1024];
int len = 0;
while ((len = sis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
}
切割文件
示例:
import java.io.*;
import java.util.*;
class SplitFile {
public static void main(String[] args) throws IOException {
// splitFile();
merge();
}
public static void merge() throws IOException {
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for (int x = 1; x <= 3; x++) {
al.add(new FileInputStream("c:\\splitfiles\\" + x + ".part"));
}
final Iterator<FileInputStream> it = al.iterator();
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
public boolean hasMoreElements() {
return it.hasNext();
}
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");
byte[] buf = new byte[1024];
int len = 0;
while ((len = sis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
public static void splitFile() throws IOException {
FileInputStream fis = new FileInputStream("c:\\1.bmp");
FileOutputStream fos = null;
byte[] buf = new byte[1024 * 1024];
int len = 0;
int count = 1;
while ((len = fis.read(buf)) != -1) {
fos = new FileOutputStream("c:\\splitfiles\\" + (count++) + ".part");
fos.write(buf, 0, len);
fos.close();
}
fis.close();
}
}
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
详情请查看:http://edu.csdn.net
黑马程序员————IO流3(day20)相关推荐
- 黑马程序员——IO流
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- 黑马程序员————IO流2(day19)
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流! IO流2 l BufferedWriter l B ...
- 黑马程序员————IO流1(day18)
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流! IO流1 l 其它对象(System) l 其它对 ...
- 黑马程序员 IO流
------- android培训.java培训.期待与您交流! ---------- IO流 java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字 ...
- 黑马程序员————IO流4(day21)
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流! IO流4 l 对象的序列化 l 管道流 l Ra ...
- 黑马程序员——IO 流总结
------<a href="http://www.itheima.com"target="blank">Java培训.Android培训.iOS培 ...
- 黑马程序员---IO流
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net ...
- 黑马程序员————IO流------(3)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- File类: 流只能操作数据,若想要用流操作被文件封装的数据信息,必须用file对象. > ...
- 黑马程序员--IO流(19天)
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 缓冲区的出现时为了提高流的操作而出 ...
最新文章
- spring cloud微服务分布式云架构--hystrix的使用
- “不亦乐乎”是“乐”还是“悦”?
- 再谈 CSS 预处理器
- Java 并发编程—核心理论
- Asp.NetWebForm的控件属性
- 靠信用购物!芝麻信用上线新功能:用户可先用后买
- oracle中自定义异常编号,Oracle自定义异常的使用
- centos8共享文件夹挂载_linux挂载群辉的NFS共享文件夹
- 转眼人到中年:前端老程序员无法忘怀的一次百度电话面试(二)
- 妙盈科技:ESG数据提供商获融资
- linux limbo镜像文件下载,limbo 2000镜像下载
- Java List retainAll方法使用注意事项
- 新手用python写牛牛扑克牌玩法
- JDE 的扫盲知识介绍。。。
- 关于消息队列的一些思考
- 使用kermit串口工具时出现 /dev/ttyS0 is not a terminal device 错误
- windows中truffle unbox react失败总结
- 5000 字带你快速入门 Apache Kylin
- Problem A: 农夫果园
- 如何使用hub.docker.com