-------android培训、java培训、期待与您交流! ----------
IO流是用来处理设备之间数据传输的,数据主要存储在硬盘、内存、高手缓存等设备中。Java对数据的操作时通过流的方式,流按照数据操作分为字符流和字节流,按照流的流向分为输入流和输出流。Java用于操作流的对象封装在IO包中。字符的编码方式主要有ASCII(American Standard Code Information Interchange),ANSI( American National Standard Institue),GB( Guo Biao),UTF(Unicode Translation Format)。IO常用的基类InputStream,OutputStream,Reader,Writer四个抽象基类。
Writer和Reader两个类的子类FileWriter和FileReader
FileWriter初始化时必须明确指定文件操作的位置,如果该目录下已有同名文件,如果FileWriter下的构造方法参数append为false,会被自动覆盖;如果为true,则不会覆盖;默认情况下append参数是false。
FileReader中read方法读取的字符数,如果已到达流的末尾,则返回 -1
流的close和flush的区别在于,close是资源关闭,关闭前会自动刷新流(即调用flush),关闭后不能调用flush或close方法,否则会抛出IO异常。
File类
流只能操作数据,如果想获得数据流的封装对象的相关信息,必须用File类。
File类和FileWriter不同:FileWriter在初始化时就已经完成了文件的创建,而File需要调用createNewFile方法来创建
File类的常用方法
1.exists()测试此抽象路径名表示的文件或目录是否存在。
2.createNewFile()当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。倘若文件的目录不存在会报IO异常。
3.createTempFile(String prefix,String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。默认临时文件目录是由机器指定的,一般是“c://user//用户名//AppData//Local//temp”目录,临时文件会生成一个随机数,文件格式是前缀+随机数+后缀的格式。
4.createTempFile(String prefix,String suffix,File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
5.delete()删除此抽象路径名表示的文件或目录。如果目录下有文件后目录,该目录无法删除。对于删除一般采用递归方式。
6.deleteOnExit()在虚拟机终止(程序退出)时,请求删除此抽象路径名表示的文件或目录。
7.mkdirs()创建多级目录。
列出目录下所有内容--带层次
public static String getLevel(int level){
StringBuffer sb=new StringBuffer();
sb.append("!--");
for (int i = 0; i <level; i++) {
sb.insert(0, "! ");
}
return sb.toString();
}
public static void showDir(File dir,int level){
System.out.println(getLevel(level)+dir.getName());
level++;
File[] files=dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
showDir(file,level);
}else {
System.out.println(getLevel(level)+file);
}
}
}
删除带目录内容的清单:
public static void removeDir(File dir){
File[] files =dir.listFiles();
for (File file : files) {
if(file.isDirectory())
removeDir(file);
else
System.out.println(file.toString()+":file:"+file.delete());
}
System.out.println(dir+":dir:"+dir.delete());
}
创建java文件列表清单代码:
/*
* 1.对指定的目录进行递归
* 2.获取递归过程中所有的java文件的路径
* 3.将这些路径存储到集合当中
* 4.将集合中的数据写入到文件当中
*/
public static void javaFileList(File dir,ArrayList<File> list){
File[] files=dir.listFiles();
for (File file:files) {
if (file.isDirectory()) {
javaFileList(file, list);
}else{
if (file.getName().endsWith(".java"))
list.add(file);
}
}
}
public static void writeToFile(String destPath,ArrayList<File> list) {
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new FileWriter(destPath));
for (File file : list) {
String pathName=file.getAbsolutePath();
bw.write(pathName);
bw.newLine();
bw.flush();
}
} catch (Exception e) {
throw new RuntimeException("将路径写入文件时发生异常");
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
throw new RuntimeException("字符缓存区无法关闭");
}
}
}
Properties对象
properties是HashTable 的子类,存储的键值对都是字符串,是集合技术和IO流结合的集合容器,可用于键值对形式的配置文件。
1.load(InputStream inStream)从输入流中读取属性列表(键和元素对)。然后可以用entrySet() 或KeySet方法得到集合,即的到了相关的数据,可以用for加强模式或集合的iterator()方法遍历集合。
InputStream ips=new FileInputStream("config.properties");
Properties properties =new Properties();
properties.load(ips);
Set hashSet=(Set) properties.entrySet();
String className=properties.getProperty("className");//通过键获取值
SequenceInputStream类
//PrintWriter out=new PrintWriter(new FileOutputStream("demo.txt"));
PrintWriter out=new PrintWriter(System.out,true);//当为true时,无需刷新,会自动刷新
//out.println(97);//保证数据原样性输出,文档中仍然是97,而不是a
//out.println(45.34);
//out.close();
String line=null;
while((line=bufr.readLine())!=null){
out.println(line.toUpperCase());
//out.flush();
//out.println(line);
}
out.close();
bufr.close();
IO流的切割和合并:
//切割方法
public static void spiltFile() throws IOException {
try {
FileInputStream fis = new FileInputStream("D:\\2.jpg");
FileOutputStream fos = null;
byte[] buf = new byte[1024 * 100];
int len = 0;
int count = 1;
while ((len = fis.read(buf)) != -1) {
fos = new FileOutputStream("E:\\" + count++ + ".part");
fos.write(buf, 0, len);
fos.close();
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
}
}
//合并方法
public static void merge() throws IOException {
ArrayList<FileInputStream> arr1 = new ArrayList<FileInputStream>();
for (int i = 1; i <= 5; i++) {
arr1.add(new FileInputStream("E:\\" + i + ".part"));
}
final Iterator<FileInputStream> it = arr1.iterator();
//Enumeration接口需要实现hasMoreElements和nextElement两个方法
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
@Override
public FileInputStream nextElement() {
return it.next();
}
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
};
//因为合并流SequenceInputStream的构造方法的参数是Enumeration,所以自己需写一个Enumeration子类
SequenceInputStream sips = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("d:\\2.gif");
byte[] buf = new byte[1024];
int len = 0;
while ((len = sips.read(buf)) != -1) {
fos.write(buf, 0, len);
}
sips.close();
fos.close();
}
------- android培训、java培训、期待与您交流! ----------