java IO


-------------  android培训 java培训 、java博客、java学习型技术博客、期待与您交流! --------------

 


1: IO(Input Output)流

          

1: IO流用来处理设备之间的数据传输


2: Java对数据的操作是通过流的方式


3: Java用于操作流的对象都在IO包中


4:流按操作数据分为两种:字节流与字符流 。


5: 流按流向分为:输入流,输出流。


2: IO流常用基类

字节流的抽象基类:

InputStream ,OutputStream。


字符流的抽象基类:

Reader ,Writer。


注:由这四个类派生出来的子类名称都是 以其父类名作为子类名的后缀。

如:InputStream的子类FileInputStream。

如:Reader的子类FileReader。


3: IO程序的书写

1:导入IO包中的类

2:进行IO异常处理

3:在finally中对流进行关闭


4:字符流——创建文件

创建流对象,建立数据存放文件

•FileWriter fw = new FileWriter(“Test.txt”);

调用流对象的写入方法,将数据写入流

•fw.write(“text”);

关闭流资源,并将流中的数据清空到文件中。

•fw.close();


FileWriter fw = null;
try{
fw = new FileWriter("Test.txt");
fw.write("text");
}
catch (IOException e){
System.out.println(e.toString());
}
finally{
If(fw!=null)
try{
fw.close();
}
catch (IOException e){
System.out.println(e.toString());
}
}


5: 字符流——读取文件


建立一个流对象,将已存在的一个文件加载进 流。

•FileReader fr = new FileReader(“Test.txt”);

创建一个临时存放数据的数组。

•char[] ch = new char[1024];

调用流对象的读取方法将流中的数据读入到数组 中。

•fr.read(ch);

FileReader fr = null;
try{
fr = new FileReader("c:\\test.txt");
char[] buf = new char[1024];
int len= 0;
while((len=fr.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
}
catch (IOException e){
System.out.println("read-Exception :"+e.toString());
}
finally{
if(fr!=null){
try{
fr.close();
}
catch (IOException e){
System.out.println("close-Exception :"+e.toString());
}


6: 注意

定义文件路径时,可以用“/”或者“\\”。

在创建一个文件时,如果目录下有同名文 件将被覆盖。

在读取文件时,必须保证该文件已存在, 否则出异常。


7:   字符流的缓冲区

缓冲区的出现提高了对数据的读写效率。

对应类

BufferedWriter

BufferedReader

缓冲区要结合流才可以使用。

在流的基础上对流的功能进行了增强


8: 字节流

                     基本操作与字符流类相同

                    但它不仅可以操作字符,还可以操作其他 媒体文件

例程

•Copy一个Jpg文件

9: 字节流的缓冲区

同样是提高了字节流的读写效率。

10:转换流

InputStreamReader,OutputStreamWriter

转换流的由来

•字符流与字节流之间的桥梁

•方便了字符流与字节流之间的操作


转换流的应用

•字节流中的数据都是字符时,转成字符流操作 更高效。

例程:标准输入输出。


11: 标准输入输出流

System类中的字段:in,out。

它们各代表了系统标准的输入和输出设备。

默认输入设备是键盘,输出设备是显示器。

System.in的类型是InputStream.

System.out的类型是PrintStream是 OutputStream的子类FilterOutputStream 的子 类.



例:获取键盘录入数据,然后将数据流向显示器,那么显示器就是目 的地。

通过System类的setIn,setOut方法对默认设备进行改变。
•
System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
•
System.setOut(new FileOutputStream(“2.txt”));//将目的改成文件2.txt

因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。

BfferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(System.out));


12: File类

用来将文件或者文件夹封装成对象

方便对文件与文件夹的属性信息进行操作 。

File对象可以作为参数传递给流的构造函 数。

了解File类中的常用方法。

13:IO包中的其他类


RandomAccessFile
随机访问文件,自身具备读写的方法。
通过skipBytes(int x),seek(int x)来达到随机访 问。

管道流
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接,通过结合线程使用
打印流
PrintWriter与PrintStream
可以直接操作输入流和文件。

序列流
SequenceInputStream
对多个流进行合并。

操作对象
ObjectInputStream与ObjectOutputStream
被操作的对象需要实现Serializable (标记接口);
操作基本数据类型
DataInputStream与DataOutputStream

操作字节数组
ByteArrayInputStream与ByteArrayOutputStream

操作字符数组
CharArrayReader与CharArrayWrite

操作字符串
StringReader 与StringWriter




14: 字符编码

字符流的出现为了方便操作字符。

更重要是的加入了编码转换。

通过子类转换流来完成。
InputStreamReader
OutputStreamWriter

在两个对象进行构造的时候可以加入字符 集。
ASCII:美国标准信息交换码。
用一个字节的7位可以表示。

ISO8859-1:拉丁码表。欧洲码表
用一个字节的8位表示。

GB2312:中国的中文编码表。

GBK:中国的中文编码表升级,融合了更多的中文文字符 号。

Unicode:国际标准码,融合了多种文字。
所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符。


15:应用实例: 删除文件夹中的所有文件    

public class FileUtils {
    // 删除文件夹下所有文件
    public static void deleteFiles(File rootFile) {
        if (rootFile.listFiles().length == 0) {// 如果用户给定的是空文件夹就退出方法
            return;
        } else {
            File[] files = rootFile.listFiles();// 将非空文件夹转换成File数组
            for (File file : files) {
                if (file.isFile()) {
                    file.delete();// 删除指定文件夹下的所有文件
                } else {
                    if (file.listFiles().length == 0) {
                        file.delete();// 删除指定文件夹下的所有空文件夹
                    } else {
                        deleteDirectories(file);// 删除指定文件夹下的所有非空文件夹
                    }
                }
            }
        }
    }
    
    // 删除文件夹及文件夹下所有文件
    public static void deleteDirectories(File rootFile) {
        if (rootFile.isFile()) {
            rootFile.delete();// 如果给定的File对象是文件就直接删除
        } else {// 如果是一个文件夹就将其转换成File数组
            File[] files = rootFile.listFiles();
            for (File file : files) {
                deleteDirectories(file);// 如果不是空文件夹则就迭代deleteDictionary()方法
            }
            rootFile.delete();// 如果是空文件夹就直接删除
        }
        
    }
    
    // 获得指定目录下的所有文件的路径
    public static List<String> getFilePath(List<String> list, File rootFile) {
        File[] files = rootFile.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                getFilePath(list, file);
            } else {
                list.add(file.getAbsolutePath().replace("\\", File.separator));
            }
        }
        return list;
    }
}


16: 键盘录入内容到文本文件:     

package com.cdd.util;
import java.io.*;
public class Employ {
public static void main(String args[]) {
    File file = new File("Example8.txt");
    try {
        if (!file.exists())                      // 如果文件不存在
            file.createNewFile();                // 创建新文件
        InputStreamReader isr = new InputStreamReader(System.in);   //定义输入流对象
        BufferedReader br = new BufferedReader(isr);            
        System.out.println("请输入:");
        String str = br.readLine();             //读取用户输入的信息
        System.out.println("您输入的内容是:" + str);
        FileWriter fos = new FileWriter(file, true);         // 创建文件输出流
        BufferedWriter bw = new BufferedWriter(fos);
        bw.write(str);                          //向文件写入信息
        br.close();
        bw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


17: 将数组写入到文件中并逆序输出:

package com.cdd.util;
import java.io.*;
public class ReadFile {
    
public static void main(String args[]){
    int bytes[]={1,2,3,4,5};    //定义写入文件的数组
    try {
        //创建RandomAccessFile类的对象
        File file = new File("Example9.txt");
        if(!file.exists()){             //判断该文件是否存在
            file.createNewFile();       //新建文件
        }
        RandomAccessFile raf=new RandomAccessFile(file,"rw");   //定义RandomAccessFile对象
        for(int i=0;i<bytes.length;i++){        //循环遍历数组
            raf.writeInt(bytes[i]);             //将数组写入文件
        }
        System.out.println("逆序输出信息");
        for(int i=bytes.length-1;i>=0;i--){     //反向遍历数组
            raf.seek(i*4);                      //int型数据占4个字节
            System.out.println(+raf.readInt());
        }
        raf.close();                    //关闭流
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}


18: 合并多个文件    

import java.io.*;
import java.util.*;
public class UniteFile {
    byte b1[];
    FileInputStream fi1;
    FileOutputStream fo;    
public void writeFiles(List<File>  files, String fileName) {      
    try {
        fo = new FileOutputStream(fileName, true);  //根据文件保存地址创建FileOutputStream对象
        for (int i = 0; i < files.size(); i++) {    //循环遍历要复制的文件集合        
            File file =  files.get(i);  //获取集合中文件对象
            fi1 = new FileInputStream(file);    //创建FileInputStream对象
            b1 = new byte[fi1.available()];     //从流中获取字节数
            fi1.read(b1);               //读取数据
            fo.write(b1);               //向文件中写数据
        }
    } catch (Exception e) {            
        e.printStackTrace();
    }        
} 
}

19: 文件锁定

package com.cdd.encrypt;

import java.io.*;
import java.nio.channels.FileLock;

class EncryptInput {
    
    public static void fileLock(String file) {
        FileOutputStream fous = null; // 创建FileOutputStream对象
        FileLock lock = null; // 创建FileLock对象
        try {
            fous = new FileOutputStream(file); // 实例化FileOutputStream对象
            lock = fous.getChannel().tryLock(); // 获取文件锁定
            Thread.sleep(60 * 1000); // 线程锁定1分钟
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        String file = "C://count.txt"; // 创建文件对象
        fileLock(file); // 调用文件锁定方法
    }
}


------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------

详情请查看:http://edu.csdn.net/heima/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值