java --输入输出
Posted T,X
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java --输入输出相关的知识,希望对你有一定的参考价值。
1. 字节流
2. File类
3. 字符流
1. 字节流
1.1 InputStream和OutputStream
这是两个接口
(1)InputStream
abstract int read() 读一个字节 int read(byte[] b) 读字节到此数组 int read(byte[] b,int off,int len) 最多读len个字节到b的偏移off处 long skip(long n) 跳过n个字节 int available() 返回在不阻塞的情况下可获取的字节数
(2)OutputStream
1.2 FileInputStream和FileOutputStream
1.3 BufferedInputStream和BufferedOutputStream
1.4 对象序列化
将实现了Serializable接口的对象转换成一个字节序列,并能在以后将这个字节序列完全恢复成原来的对象,可跨网络、跨平台进行。
序列化时不仅保存了对象的全部信息,而且跟踪对象内包含的引用,并保存引用指向的对象,并一直往下追溯。
(1)ObjectOutputStream
(2)ObjectInputStream
(3)例子
序列化一个Date对象,然后还原
1 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("date.dat")); 2 Date a = new Date(); 3 System.out.println("原来的对象:"+a.toString()); 4 oos.writeObject(a); 5 oos.close(); 6 7 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("date.dat")); 8 Date x = (Date)ois.readObject(); 9 System.out.println("恢复的对象:"+x.toString()); 10 ois.close();
(4)序列号
创建一个某类对象,然后将其序列化保存;修改类成员,然后试图根据之前序列化的文件恢复对象。会发生错误:
java.io.InvalidClassException: com.company.TestCollection; local class incompatible: stream classdesc serialVersionUID = -7422208144105093601, local class serialVersionUID = -4251096331699201662
序列化时需要序列号,默认序列号与类成员关联,因为修改了类的成员,因此恢复时由于序列号不匹配无法恢复。
解决:为类添加序列号
IDEA设置对实现Serializable接口的类,如果没有加序列号成员则报警告
1.5 标准输入输出流
public static final InputStream in 字节输入流 ------System.in public static final PrintStrean out 字节输出流-------System.out
---------------------------------------------------------------------------------------------------
2. File类
文件和目录的抽象表示
类静态成员:
File.pathSeparator
File.pathSeparatorChar
File.separator
File.separatorChar
File.listRoots() 获取可用根目录(windows就是所有可用盘符)
构造:
File(File parent,String child)
File(String pathname)
File(String parent,String child)
File(URI uri)
常用方法:
1 //创建 2 boolean createNewFile() 如果文件不存在,则原子性的创建此文件 3 boolean mkdir() 创建目录 4 boolean mkdirs() 创建目录(如果指定的父级目录不存在,则也会创建其父级目录) 5 //删除 6 boolean delete() 删除相对路径指定的文件或目录 7 //获取 8 File getAbsoluteFile() 获取绝对路径 9 String getAbsolutePath() 获取据对路径 10 File getCanonicalFile() 获取绝对路径,会解析如 . .. 这样表示当前目录和父目录的符号 11 String getCanonicalPath()获取绝对路径,会解析如 . .. 这样表示当前目录和父目录的符号 12 String getName() 文件或目录名 13 String getParent() 父目录相对路径名 14 File getParentFile() 父目录相对路径 15 String getPath() 转成字符串类型的路径 16 long lastModified() 最后的修改时间 17 long length() 文件长度,单位字节 18 //判断 19 boolean exists() 此文件或目录是否存在 20 boolean isAbsolute() 是否是绝对路径 21 boolean isDirectory() 是否是一个目录 22 boolean isFile() 是否是一个文件 23 boolean isHidden() 是否是隐藏文件 24 //修改 25 boolean renameTo(File dest) 重命名 26 boolean setExecutable(boolean executable) 设置owner的可执行权限 27 boolean setExecutable(boolean executable,boolean ownerOnly) 设置owner或所有人的可执行权限
例子:
(1)列出某目录下所有文件和目录
File x = new File("D:\\\\CodeEnv\\\\iedaPros"); File [] files = x.listFiles(); for(File f:files) { if(f.isFile()) { System.out.println("文件:"+f.getName()+" 长度:"+f.length()); } else if(f.isDirectory()) { System.out.println("目录:"+f.getName()+" 长度:"+f.length()); } else { continue; } }
(2)给一个相对路径或相对路径下的某一个文件,找其所在目录下所有java文件(包括子目录下的)
1 void fun(File file) throws IOException{ 2 if(file.isDirectory()) { 3 File[] files = file.listFiles(); 4 for (File f : files) { 5 if (f.isFile()) { 6 if (f.getName().endsWith(".java")) { 7 System.out.println(f.getName()); 8 } 9 } 10 else if (f.isDirectory()) { 11 fun(f); 12 } 13 } 14 } 15 else if(file.isFile()) { 16 File tmp = file.getAbsoluteFile(); 17 File p = tmp.getParentFile(); 18 fun(p); 19 } 20 } 21 22 23 24 File x = new File("test.txt"); 25 fun(x);
(3)删除指定目录
先删除该目录下所有子目录和文件,然后才能删除该目录本身
1 void funDelete(File file) throws IOException { 2 if(file.isDirectory()) { 3 File[] files = file.listFiles(); 4 for(File f:files) { 5 if(f.isFile()) { 6 f.delete(); 7 } 8 else if(f.isDirectory()) { 9 funDelete(f); 10 } 11 } 12 file.delete(); 13 } 14 } 15 16 17 18 File x = new File("xt"); 19 funDelete(x);
-------------------------------------------------------------------------------------------------------
3. 字符流
处理Unicode编码的字符
3.1 Reader和Writer
Reader方法:
Writer方法:
void write(int c) void write(String str) void write(String str,int off,int len) void write(char[] cbuf) void write(charp[] vbuf,int off,int len)
3.2 FileReader和FileWriter
字符输入输出流
(1)
FileReader的构造:
FileReader(File file)
FileReader(FileDescriptor fd)
FileReader(String fileName)
(2)
FileWriter的构造:
FileWriter(File file) FileWriter(File file,boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName,boolean append)
(3)简单例子
例子:先以追加方式写数据到文件,然后读出显示
一次读一个字符:
1 FileWriter w = new FileWriter("D:\\\\CodeEnv\\\\iedaPros\\\\test.txt",true); 2 w.write("FileWriter类1\\n"); 3 w.write("FileWriter类2\\n"); 4 w.write("FileWriter类3\\n"); 5 w.flush(); //刷新缓冲 6 w.close(); 7 8 FileReader r = new FileReader("D:\\\\CodeEnv\\\\iedaPros\\\\test.txt"); 9 int ch; 10 while((ch=r.read()) != -1) { 11 System.out.print((char)ch); 12 } 13 r.close();
使用字符数组,每次读多个字符:
FileReader r = new FileReader("D:\\\\CodeEnv\\\\iedaPros\\\\test.txt"); char ch[] = new char[5]; //一次最多读5个 int len = 0; while((len=r.read(ch)) != -1) { System.out.print(new String(ch,0,len)); } r.close();
3.3 BufferedReader、BufferedWriter
字符缓冲流:读入或写到字符输入输出流(FileReader、FileWriter),但是缓冲各个字符,对单个字符、数组、字符串的写入、读取更高效
(1)BufferedWriter
构造:
BufferedWriter(Writer out) BufferedWriter(Writer out,int sz)
方法:
void newLine() 写入一个换行符[换行符根据系统确定]
(2)BufferedReader
构造:
BufferedReader(Reader in) BufferedReader(Reader in,int sz)
方法:
String readLine() 读入一行,不包括换行符
(3)例子
1 BufferedWriter bw = new BufferedWriter(new FileWriter(filepath,true)); 2 bw.write("BufferedWriter类-1\\n"); 3 bw.write("BufferedWriter类-2\\n"); 4 bw.close(); 5 6 BufferedReader br = new BufferedReader(new FileReader(filepath)); 7 char chs[] = new char[5]; 8 int len = 0; 9 while((len=br.read(chs)) != -1) { 10 System.out.print(new String(chs,0,len)); 11 } 12 br.close();
3.4
-------------------------------
4. 打印流
(1)PrintStream
(2)PrintWriter
以上是关于java --输入输出的主要内容,如果未能解决你的问题,请参考以下文章