• Java 学习笔记 IO流与File操作


    可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件

    读文件示例代码

    	File file = new File("D:\test\t.txt");
    	//这里的有两条斜杠,其实实际的路径为D:	est	.txt,多的那一条斜杠是转义用的
    	InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "GBK");
    	//利用之前的File对象,创建了一个`FileInputStream`对象,之后作为InputStreamReader的构造方法参数传入
    	//第二个参数是编码,一般使用GBK或者是UTF-8
    	BufferedReader reader = new BufferedReader(inputStreamReader);
    	//把InputStreamReader作为参数构造一个BufferedReader
    	String s;
    	while((s=reader.readLine())!=null){
    		System.out.println(s);//循环,将该文件里面的内容全部打印出来
    	}
    

    写文件示例代码

    与上面的类似,解释就不多写啦

    	File file = new File("Q:\t.txt");
    	OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK");
    	BufferedWriter writer = new BufferedWriter(outputStreamWriter);
    	writer.write("hello world");
    	writer.close();//必须要调用close才能成功地将内容写入文件
    

    文件不存在的话会自动生成该文件,但是如果是带有文件夹的话,就得考虑到文件夹不存在的情况

    例如:

    	File file = new File("Q:\test\t.txt");
    	File temp = file.getParentFile();
    	if (!temp.exists()) {
    		temp.mkdirs();//文件夹不存在,则新建一个文件夹
    	}
    	OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK");
    	BufferedWriter writer = new BufferedWriter(outputStreamWriter);
    	writer.write("hello world");
    	writer.close();
    

    复制文件

    这里使用的是字节流,把t.txt复制到Q盘中的MY文件夹中,并改名

    	FileInputStream inputStream = new FileInputStream("Q:\t.txt");
    	FileOutputStream outputStream = new FileOutputStream("Q:\MY\t1.txt");
    	int c;
    	//读到尾部则是返回-1
    	while ((c = inputStream.read()) != -1) {
    		outputStream.write(c);
    	}
    	inputStream.close();
    	outputStream.close();
    

    PS:这里和之前一样,如果文件夹不存在,就得调用mkdirs方法进行创建文件夹的操作,除了txt文件,其他的文件也是可以这样复制

    File类(文件类)

    File对象代表磁盘中实际存在的文件和目录

    静态属性
    File.separator 分隔符 windows操作系统是,linux操作系统则是/

    构造方法

    • File(File parent, String child) 通过给定的父抽象路径名和子路径名字符串创建一个新的File实例
    • File(String pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

    常用方法

    • public String getName() 返回由此抽象路径名表示的文件或目录的名称。
    • public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null
    • public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名的file对象,如果此路径名没有指定父目录,则返回 null
    • public String getPath() 将此抽象路径名转换为一个路径名字符串
    • public boolean exists() 判断此抽象路径名表示的文件或目录是否存在
    • public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录
    • public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
    • public boolean delete() 删除此抽象路径名表示的文件或目录
    • public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
    • public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件

    IO流笔记

    主要的还是两种,字节流字符流

    所有的文件在硬盘或在传输时都是以字节的方式进行,包括图片等,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。

    字节流

    1.InputStream(输入)

    • FileInputStream(主要)
    • ByteArrayInputStream
    • ObjectInputStream
    • PidedinputStream

    2.OuputStream(输出)

    • FileOutputStream(主要)
    • ByteArrayOutputStream
    • ObjectOutputStream
    • PidedOutputStream

    字符流

    1.Reader(输入)

    • FileReader
    • CharArrayReader
    • PipedReader
    • StringReader

    2.Writer(输出)

    • FileWriter
    • CharArrayWriter
    • PipedWriter
    • StringWriter

    缓冲流

    上面字节流和字符流一般不会直接使用,实际上,缓冲流是一个装饰类,可以给字符流和字节流添加缓冲这功能。

    BufferReader
    BufferWriter
    其实这两个也是包括在字符流里面的
    使用的时候传入一个Writer或者是Reader对象即可

    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter());
    BufferedReader bufferedReader = new BufferedReader(new FileReader());
    

    异常处理笔记

    **1. try把reader,writer等对象放在括号内,可以自动关闭输入/输出流,并释放资源(输出流会自动调用close方法) **
    如果有多个资源,使用分号隔开
    ps: jdk1.7+支持
    例如:

    try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(""))){
    	...
    }catch(Excetion e){
    	...
    }
    

    2. 可以使用|来捕获多个异常

    try{
    	...
    }catch(NullPointerException | ArrayIndexOutOfBoundsException e){
    	//捕获了两个异常
    }
    

    使用字节流获取图片

    URL url = new URL("http://wx3.sinaimg.cn/large/00689t5lgy1g11hi5nzmtg30m80jghe3.gif");
            URLConnection connection=url.openConnection();//打开链接
            InputStream inputStream = connection.getInputStream();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("e:\wan\download.gif")));
            int c;
            byte[] temp = new byte[1024 * 2];//提供个缓冲区
            while ((c = bufferedInputStream.read(temp)) != -1) {
                bufferedOutputStream.write(temp,0,c);//读多少,写多少
            }
            bufferedOutputStream.close();
    				inputStream.close();
    

    使用字节流转字符流获取网页内容

    基本如上面代码一样,只是输出的时候需要使用bufferwriter输出

    ObjectInputStream和ObjectOutStream

    序列化和反序列化

    序列化:把内存中的序列对象保存在二进制文件中
    反序列化:把二进制文件读取,获得原来的文件

    需要类实现序列化接口serializable
    标识接口里面没有任何的内容
    transient关键字 可以让类的某个属性在序列化的过程中不进行写入

    List<Book> books = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                Book book = new Book("机战风暴"+i,"乱",56);
                books.add(book);
            }
            
            ObjectOutputStream objectOutputStream = null;
            try {
                objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("e:\out.bin")));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            for (Book book : books) {
                objectOutputStream.writeObject(book);
            }
            objectOutputStream.writeObject(null);//写入一个null,防止之后出现EOFException
            objectOutputStream.close();
    
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("e:\out.bin")));
            Object o = null;
            try {
                while ((o = objectInputStream.readObject()) != null) {
                    Book book = (Book) o;
                    System.out.println(book.toString());
                }
            }
            catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
        }
    
  • 相关阅读:
    Android 开发工具类 06_NetUtils
    Android 开发工具类 05_Logcat 统一管理类
    Android 开发工具类 04_KeyBoardUtils
    Android 开发工具类 03_HttpUtils
    Android 开发工具类 02_DensityUtils
    Android 开发工具类 01_AppUtils
    APP 渠道推广【摘自网络】
    Android SDK 在线更新镜像服务器资源
    使用 Chrome 生成 UUID
    解决div里插入img下边缝隙问题
  • 原文地址:https://www.cnblogs.com/stars-one/p/10205282.html
Copyright © 2020-2023  润新知