zoukankan      html  css  js  c++  java
  • Java Stream、File、IO

    Java流(Stream)、文件(File)和IO

    java.io包几乎包含了所有操作输入、输出的类。所有这些流类代表了输入源和输出目标。

    java.io包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

    一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

    Java为I/O提供了强大而灵活的支持,使其更广泛地应用到文件传输和网络编程中。


    读取控制台输入

    Java的控制台输入由System.in完成。

    为了获得一个绑定到控制台的字符流,你可以把System.in包装在一个BufferReader的对象中来创建一个字符流。

    下面是创建BufferedReader的基本语法:

    BufferedReader br=new BufferedReadder(new InputStreamReader(System.in));
    

    BufferedReader对象创建后,我们便可以使用read()方法从控制台读取一个字符,或者用readLine()方法读取一个字符串。  


    从控制台读取多字符输入

    从BufferedReader对象读取一个字符要使用read()方法,它的语法如下:

    int read() throws IOException
    

    每次调用read()方法,它从输入流读取一个字符并把该字符作为整数值返回。当流结束的时候返回-1。该方法抛出IOException。

    下面的程序示范了用read()方法从控制台不断读取字符直到用户输入“q”。

    import java.io.*;
    public class BRRead{
    public static void main(String[]args) throws IOException{
    char c;
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("输入字符,按下'q'退出。");
    do{
    c=(char)br.read();
    System.out.println(c);
    }while(c!='q');
    }
    }

    从控制台读取字符串 

    从标准输入读取一个字符串需要使用BufferedReader的readLine()方法。

    一般格式:

    String readLine() throws IOException  

    下面的程序读取和显示字符行直到你输入了单词”end“。

    import java.io.*;
    public class BRReadLines{
    public static  void main(String []args) throws IOException{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String str;
    System.out.println("Enter lines of texts.");
    System.out.println("Enter 'end' to quit.");
    do{
    str=br.readLine();
    System.out.println(str);
    }while(!str.equals("end"));
    }
    }
    

    控制台输出

    此前介绍过,控制台的输出由print()和println()方法完成。这些方法都由类PrintStream定义,System.out是该类对象的一个引用。

    PrintStream继承了OutputStream类,并且实现了方法write()。这样,write()也可以用来往控制台写操作。

    PrintStream定义了write()的最简单格式如下所示:

    void write(int byteval)

    实例

    import java.io.*;
    public class WriteDemo{
    public static void main(String[] args){
    int b;
    b='A';
    System.out.write(b);
    System.out.write('
    ');
    }
    }
    

    注意:write()方法不经常使用,因为print()和println()方法用起来更为方便。  


    读写文件

    如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。

    下图是一个描述输入流和输出流的类层次图。

    下面将要讨论的两个重要的流是FileInputStream和FileOutputStream:

    FileInputStream

    该流用于从文件读取数据,它的对象可以用关键字new来创建。

    有多种构造方法可以用来创建对象。

    可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

    InputStream  f=new FileInputStream("C:/java/hello");
    

    也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用File()方法来创建一个文件对象:

    File f=new File("C:/java/hello");
    InputStream out=new FileInputStream(f);
    

    创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。

      

    除了InputStream外,还有一些其他的输入流:

    • ByteArrayInputStream
    • DataInputStream 

    FIleOutputStream

    该类用来创建一个文件并向文件中写数据。

    如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。

    有两个构造方法可以用来创建FileOutputStream对象。

    使用字符串类型的文件名来创建一个输出流对象:

    OutputStream f=new FileOutputStream("C:/java/hello")
    

    也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()文件来创建一个文件对象:

    File f=new File("C:/java/hello");
    OutputStream f=new FileOutputStream(f);
    

    创建OutputStream对象完成后,就可以使用下面的方法来写入流或者进行吗其他的流操作。  

    除了OutputStream外,还有一些其他的输出流:

    • ByteArrayOutputStream
    • DataOutputStream  

    实例

    下面演示InputStream和OutputStream用法的例子:

    package pkg2020华南虎;
    import java.io.*;
    /**
     *
     * @author yl
     */
    public class FileStreamTest {
        public static void main(String[] args) {
            try{
            byte[] bWrite={11,21,4,40,5};
            OutputStream os=new FileOutputStream("test.txt");
            for(int x=0;x<bWrite.length;x++){
            os.write(bWrite[x]);
            }
            os.close();
            InputStream is=new FileInputStream("test.txt");
            int size=is.available();
            for(int i=0;i<size;i++){
                System.out.print((char)is.read()+" ");
            }
            is.close();
            }catch(IOException e){
                System.out.print("Exception");
            }
        }
    }
    

    上面的程序首先创建文件test.txt,并把给定的数字以二进制形式写进该文件,同时输入到控制台上。

    以上代码由于是二进制写入,可能存在乱码,你可以使用以下代码实例来解决乱码问题:

    package pkg2020华南虎;
    import java.io.*;
    /**
     *
     * @author yl
     */
    public class FileStreamTest2 {
        public static void main(String[] args) throws IOException {
            File f=new File("a.txt");
            FileOutputStream fop=new FileOutputStream(f);
            OutputStreamWriter writer=new OutputStreamWriter(fop,"UTF-8");
            writer.append("中文输入");//写入到缓冲区
            writer.append("
    ");//换行
            writer.append("English");//刷新缓存,写入到文件,如果下面没有写入的内容,直接close也会写入。
            writer.close();//关闭写入流,同时会把缓冲区内容写入文件,
            fop.close();
            FileInputStream fip=new FileInputStream(f);
            InputStreamReader reader=new InputStreamReader(fip,"UTF-8");
            StringBuffer sb=new StringBuffer();
            while(reader.ready()){
            sb.append((char)reader.read());
            }
            System.out.println(sb.toString());
            reader.close();
            fip.close();
        }
    }
    

    文件和I/O

    还有一些关于文件和I/O的类:

    • File Class
    • FileReader Class
    • FileWriter Class

    Java中的目录

    创建目录

    File类中有两个方法可以用来创建文件夹:

    • mkdir()方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
    • mkdirs()方法创建一个文件夹和它的所有父类文件夹。

    下面的例子创建“/tmp/user/java/bin"文件夹:

    import java.io.File;
    public class CreateDir{
    public static void main(String args[]){
    String dirname="/tmp/user/java/bin";
    File d=new File(dirname);
    d.mkdirs();
    }
    }
    

    注意:Java在UNIX和windows自动按约定分辨文件路径分隔符。如果你在Windows版本的Java中使用分隔符(/),路径仍然能够被正确解析。


    读取目录

    一个目录其实就是一个File对象,它包含其他文件和文件夹。

    如果创建一个File对象并且它是一个目录,那么调用isDirectory()方法会返回true。

    可以通过调用该对象上的list()方法,来提取它包含的文件和文件夹的列表。

    下面展示的例子说明如何使用list()方法来检查一个文件夹中包含的内容:

    import java.io.File;
    public class DirList{
    public static void main(String []args){
    String dirname="/tmp";
    File f1=new File(dirname);
    if(f1.isDirectory()){
    System.out.println("目录:"+dirname);
    String [] s=f1.list();
    for(int i=0;i<s.length;i++){
    File f=new File(dirname+"/"+s[i]);
    if(f.isDirectory()){
    System.out.println(s[i]+"是一个目录");
    }else{
    System.out.println(s[i]+"是一个文件");
    }
    }
    }
    else{
    System.out.println(dirname+"不是一个目录“);
    }
    }
    }

    删除目录或文件

    删除文件可以使用java.io.File.delete()方法。

    以下代码会删除目录/tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。

    import java.io.File;
    public class DeleteFileDemo{
    public static void main(String[]args){
    File folder=new File("/tmp/java/");
    deleteFolder(folder);
    public static void deleteFolder(File folder){
    File[] files=folder.listFiles();
    if(files!=null{
    for(File f:files){
    if(f.isDirectory()){
    deleteFolder(f);
    }else{
    f.delete();
    }
    }
    }
    folder.delete();
    }
    }

    什么他妈的叫他妈的惊喜!
  • 相关阅读:
    例题6-8 Tree Uva548
    例题6-7 Trees on the level ,Uva122
    caffe Mac 安装
    Codeforces Round #467 (Div. 1) B. Sleepy Game
    Educational Codeforces Round37 E
    Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
    Good Bye 2017 E. New Year and Entity Enumeration
    Good Bye 2017 D. New Year and Arbitrary Arrangement
    Codeforces Round #454 D. Seating of Students
    浙大紫金港两日游
  • 原文地址:https://www.cnblogs.com/2020yl/p/12252844.html
Copyright © 2011-2022 走看看