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 --输入输出的主要内容,如果未能解决你的问题,请参考以下文章

Java 布尔运算

Java - 35 Java 实例

Java While 循环

Java 字符串

Java If ... Else

JAVA.包 JAVA类 JAVA APPLET .......等跟JAVA挨得上边得都要!