• Java IO操作


    文件操作相关

    列出某个目录中的所有文件

    例子:

    package com.ylfeiu.io;
    
    import java.io.File;
    
    public class ShowFileInfo {
    
    	public static void main(String[] args) {
    
    		File f = new File("d:" + File.separator + "txt");
    		show(f);
    	}
    
    	private static void show(File f) {
    		if (f.isDirectory()) {
    			File[] res = f.listFiles();
    			if (res != null) {
    				for (int i = 0; i < res.length; i++) {
    					show(res[i]);
    				}
    
    			}
    		}
    		System.err.println(f);
    
    	}
    
    }
    

    创建带目录的文件

    例子:

    package com.ylfeiu.io;
    
    import java.io.File;
    import java.io.IOException;
    
    public class CreateDirectorFile {
    
    	public static void main(String[] args) {
    		File f = new File("d:" + File.separator + "test" + File.separator
    				+ "hello.txt");
    
    		if (!f.getParentFile().exists()) {
    			f.getParentFile().mkdirs();
    		} else {
    			try {
    				f.createNewFile();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    
    	}
    
    }
    

    字节流与字符流

    输入输出流,分为字节流(InputStream,OutPutStream),字符流(Writer,Reader),它们4个都是抽象类,实例化靠其子类对象;传输中用字节流.字符流在操作时用到了缓冲区,若在使用字符流操作后,不关闭输出流操作,那么该缓冲区的内容不会被输出,这个时候得去调用flush()强制清空缓冲区的内容进行输出.字节流这不存在该情况

    java.lang.Object

             |-java.io.InputStream

                       |-java.io.FileInputStream

    java.lang.Object

             |-java.io.Reader

                       |-java.io.InputStreamReader

                                |-java.io.FileReader

    通过以上继承关系可以看出,所有字符数据都是需要转换的,依靠转换流操作,真正保存或传输的数据是以字节流来完成的

    转换操作流

    字节流与字符流的转换采用:OutputStreamWriter,InputStreamReader

    package com.ylfeiu.io;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    
    public class CreateDirectorFile {
    
    	public static void main(String[] args) throws Exception {
    		File f = new File("d:" + File.separator + "test" + File.separator
    				+ "hello.txt");
    		if (!f.getParentFile().exists()) {
    			f.getParentFile().mkdirs();
    		} else {
    			f.createNewFile();
    		}
    		OutputStream out = new FileOutputStream(f);
    
    		Writer w = new OutputStreamWriter(out);
    		w.write("你好啊");
    		w.flush();
    	}
    
    }
    

    内存操作流

    构造:输入流构造需要传参(操作对象),输出流构造函数中没有操作对象

    public ByteArrayInputStream(byte buf[])

    使用ByteArrayInputStream,ByteArrayOutputStream对内存进行输入输出操作

    例子:

    package com.ylfeiu.io;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    public class ByteArrayIO {
    
    	public static void main(String[] args) throws Exception {
    
    		String str = "hello";
    		InputStream in = new ByteArrayInputStream(str.getBytes());
    		OutputStream w = new ByteArrayOutputStream();
    
    		int tmp = 0;
    		while ((tmp = in.read()) != -1) {
    			w.write((char)Character.toUpperCase(tmp));
    		}
    		
    		w.close();
    		in.close();
    
    		String newStr = w.toString();
    		System.err.println(newStr);
    	}
    
    }
    

    字节打印流与字符打印流

    PrintStream,PrintWriter

    构造public PrintStream (OutputStream out)

    这里虽然传参的是OutputStream型的对象,但是打印流使用的是打印流的方法,并不是使用OutputStream的子类的实际对象的方法

    System类的err,out,in这三个常量都是PrintStream的实例(该3个常量在JDK早期出现,所以并不是大写的)

    System.out本身就属于PrintStream的对象,而它又是OutputStream的子类,所以有了下面的代码:

    package com.ylfeiu.io;
    
    import java.io.OutputStream;
    
    public class SysIn {
    
    	public static void main(String[] args) throws Exception {
    		OutputStream out = System.out;
    		String info = "你好啊  world";
    		out.write(info.getBytes());
    	}
    
    }
    
    打印流例子
    package com.ylfeiu.io;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    public class PrintIO {
    
    	public static void main(String[] args) throws Exception {
    		String str = "hello world!";
    
    		InputStream in = new ByteArrayInputStream(str.getBytes());
    		OutputStream out = new ByteArrayOutputStream();
    		PrintStream echo = new PrintStream(out);
    		int tmp = 0;
    		while ((tmp = in.read()) != -1) {
    			echo.print((char)Character.toUpperCase(tmp));
    		}
    
    		String newStr = out.toString();
    		out.close();
    		in.close();
    		System.err.println(newStr);
    	}
    
    }
    
    中文乱码的产生
    package com.ylfeiu.io;
    
    import java.io.InputStream;
    
    /**
     * 
     * @author Administrator 本程序演示中文乱码的产生
     */
    public class MessyCode {
    
    	public static void main(String[] args) throws Exception {
    		InputStream in = System.in;
    		StringBuffer buf = new StringBuffer();
    		System.out.println("请输入数据");
    		int tmp = 0;
    		while ((tmp = in.read()) != -1) {
    			if (tmp == '
    ') {
    				break;
    			}
    			buf.append((char) tmp);
    		}
    
    		System.err.println("输入的内容是:" + buf);
    
    	}
    
    }
    
    BufferedReader缓冲区操作
    从缓冲区读取数据
    
    解决中文输入产生的乱码
    package com.ylfeiu.io;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class BufRead {
    
    	public static void main(String[] args) throws Exception {
    		BufferedReader buf = new BufferedReader(
    				new InputStreamReader(System.in));
    		System.out.println("请输入数据");
    		String info = buf.readLine();
    		System.err.println("输入地 数据是:" + info);
    
    	}
    
    Scanner(放在java.utils包中)
    Jdk1.5之后推出的,方便进行输入操作,在程序开发过程中,如果通过程序输出,则采用PrintStream打印流,若存在中文,推荐使用PrintWriter,而对于程序输入数据,建议使用Scanner
    例子
    package com.ylfeiu.io;
    
    import java.util.Scanner;
    
    public class ScannerInput {
    
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		System.err.println("请输入数据");
    		if (in.hasNext()) {
    			String info = in.next();
    			System.err.println("输入的数据是:" + info);
    		}
    
    	}
    
    }
    

    对象输入/出流

    采用ObjectInputStream,ObjectOutputStream进行对象的输入与输出,这两个类与打印流的设计相似,都是需要接收父类的实例化对象

    例子

    对象序列化

    对象序列化可以将内存中的对象转换成2进制数据(必须实现Serializable接口),如果不想某个对象的属性被序列化,则采用transient关键字

    例子

    把对象信息写入到文件中:

    package com.ylfeiu.io;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class ObjInputIO {
    
    	public static void main(String[] args) throws Exception {
    		Person p = new Person(20, "ylfeiu");
    		File f = new File("d:" + File.separator + "p.ser");
    
    		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
    		out.writeObject(p);
    		out.close();
    
    	}
    
    }
    
    class Person implements Serializable {
    	transient int age;
    	String name;
    
    	Person(int age, String name) {
    		this.age = age;
    		this.name = name;
    	}
    
    }
    
    从二进制文件中读取数据
    package com.ylfeiu.io;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    public class ObjReadIO {
    
    	public static void main(String[] args) throws Exception {
    		File f = new File("d:" + File.separator + "p.ser");
    
    		ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
    		Person p = (Person) in.readObject();
    		in.close();
    
    		System.err.println(p.name);// 若给age字段添加private属性,则编译不通过
    		System.err.println(p.age);
    	}
    
    }
    

    字符编码

    GBK/GB2312:表示国际中文编码,其中GBK包含简体与繁体中文,而GB2312只包含简体中文ISO 8859-1:一种国际通用编码,可以表示任何文字?查一下

    Unicode:一种16进制编码,可以便是任何语言文字?

    UTF-8:部分编码使用了Unicode,而另一些则采用了ISO-8859-1,它适合网络传输,在项目开发过程中推荐采用此编码?(为什么)

    产生乱码的原因:编码与解码不统一

      

      

      

      

      

      

      

      

      

     

  • 相关阅读:
    oracle安装常见问题
    VM EXSI安装使用
    虚拟机---无法获取所有权
    Http常用状态码
    翻译:CommonJS的wiki
    如何在ie6/ie7/ie8中实现iframe背景透明
    网页版俄罗斯方块
    HTML5之pushstate、popstate操作history,无刷新改变当前url
    我们是如何做好前端工程化和静态资源管理
    dns-prefetch—DNS预解析技术
  • 原文地址:https://www.cnblogs.com/ylfeiu/p/3597315.html
Copyright © 2020-2023  润新知