Java中输入输出

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中输入输出相关的知识,希望对你有一定的参考价值。

Java中输入输出

  • 目前Java支持文件I/O和流式I/O,数据流可分为二进制流和文本流,也称为字节流和字符流
  • 它们处理信息的基本单位分别为字节和字符
  • java.io.File类用来表示物理磁盘上的实际文件或者目录,但是它不表示文件中的数据
import java.io.File;
import java.io.IOException;
public class FileDemo {
    public static void main(String[] args){
        File file = new File("Hello.text") ;//创建一个表示文件的对象,此时文件还不存在
        try{
            boolean success = false ; //表示文件是否创建成功
            System.out.println(file.exists()) ; //创建的文件是否存在,此时,文件并不存在
            success = file.createNewFile() ;//创建文件
            System.out.println(success) ;//文件创建成功
            System.out.println(file.exists()) ; //输出文件是否存在
            System.out.println(file.length()) ; //输出文件的长度
            file.delete() ; //删除文件
            System.out.println(file.lastModified()) ; //最后一次修改的时间
        }catch(IOException e){ //捕获异常并处理
            System.out.println(e.toString()) ;
        }
    }
}

  • 使用FileOutputStream对象向文件output.dat文件中写入10个10-99的随机整数
  • 然后使用FileInputStream对象从output.dat文件中读出这10个数并输出
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class OutputInputDemo {
    public static void main(String[] args) throws IOException { //抛出异常
        //向文件中写数据
        File outputFile = new File("output.dat") ;//创建文件对象
        try(FileOutputStream out = new FileOutputStream(outputFile) ;){ //以文件对象创建文件输出流对象
            for(int i=0; i<10; i++){
                int x = (int)(Math.random() * 90 + 10) ; //随机生成两位整数
                out.write(x) ; //写入文件中
            }
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
        //从文件中读出数据
        File file = new File("output.dat") ; //创建文件对象
        try(FileInputStream in = new FileInputStream(file) ;){
            int c = in.read() ; //读出数据
            while(c != -1){ //当文件中无数据时结束循环
                System.out.print(c + " ") ;
                c = in.read() ; //读出下一个字节
            }
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
        System.out.println("数据读取完毕!") ;
    }
}
  • 常用的二进制输入输出流包括:FileInputStream类和FileOutputStream类:它们用来实现文件的输入输出处理,
  • 由它们提供的方法可以打开本地机上的文件,并进行顺序的读写。
  • BufferedInputStream类和BufferedOutPutStream类:用来实现缓冲功能,减少数据的读写次数,加快数据的输出速度
  • DataInputStream类和DataOutputStream类:使用它们可以实现基本数据类型的输入输出
  • 下面使用DataOutputStream流将数据写到文件中,使用DataInputStream流读取数据并在控制台输出
import java.io.*;
public class DataStreamDemo {
    public static void main(String[] args){
        //向文件中写入数据
        try(FileOutputStream output = new FileOutputStream("data.dat");//使用文件名创建文件输出流对象
            //将文件输出流对象包装成缓冲输出流,最后包装成数据输出流对象
            DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(output));){
            dataOutputStream.writeDouble(123.456) ; //写入double型数据
            dataOutputStream.writeInt(100) ; //写入整形数据
            dataOutputStream.writeChar('s') ; //写入字符型数据
            dataOutputStream.writeBoolean(true) ; //写入布尔型数据
            dataOutputStream.writeUTF("Java语言") ; //将字符串按UTF-8格式输入
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
        //从文件读出数据
        try(FileInputStream input = new FileInputStream("data.dat") ;
            DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(input)) ;){
            //只要文件中有数据,则循环
            while(dataInputStream.available() > 0){ //必须依次读入
                double d = dataInputStream.readDouble() ;
                int i = dataInputStream.readInt() ;
                char c = dataInputStream.readChar() ;
                boolean b = dataInputStream.readBoolean()  ;
                String s = dataInputStream.readUTF() ;
                System.out.println("d = " + d + " i = "+ i + " c = " + c + " b = "+ b + " s = " + s) ;
            }
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
    }
}

  • 以字符为单位的文本I/O流,也称为字符I/O流
  • 抽象类的Reader和Writer分别是文本输入输出流的根基,它们实现了字符的读写
  • FileReader类和FileWriter类是文件输入输出流
  • FileReader类是InputStreamReader的子类,实现二进制输入流向文本流转换的功能
  • FileWriter类是OutputStreamWriter的子类,实现文本输出流向二进制流转换的功能
  • 下面使用FileReader和FileWriter将input.txt的内容复制到output.txt中

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopyDemo {
    public static void main(String[] args){
        File inputFile = new File("input.txt") ;
        File outputFile = new File("output.txt") ;
        try(FileReader in = new FileReader("inputFile") ;
            FileWriter out = new FileWriter("outputFile.txt") ;){
            int c = in.read() ;
            while(c != -1){
                out.write(c) ;
                c = in.read() ;
            }
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
    }
}
  • BufferedReader和BufferedWriter类分别是实现了具有缓冲功能的字符输入输出流,
  • 两个类用来将其它的字符类包装成缓冲字符流,以提高数据的读写效率。
import java.io.BufferedReader;
import java.io.FileReader;

public class Main {

    public static void main(String[] args) throws Exception{
        String fileName = "article.txt" ; //定义一个名为article的文本文件
        FileReader inFile = new FileReader(fileName) ; //以文件名创建文件输入流对象
        BufferedReader reader = new BufferedReader(inFile) ; //将文件输入流对象包装成缓冲输入流对象
        int sum = 0 ;
        String aLine = reader.readLine() ;
        while(aLine != null){
            String [] words = aLine.split("[,. ]") ; //按空格,逗号和点号分割字符串
            sum = sum + words.length ; //统计每行单词个数
            aLine = reader.readLine() ; //继续读下一行
        }
        reader.close() ; //关闭文件输入流对象
        System.out.println("sum = " + sum) ; //打印单词个数
    }
}
  • PrinterWriter类实现字符打印输出流,随机产生10个100-200的整数
  • 然后使用PrinterWriter对象输出文件到number.txt中

import java.io.*;

public class PrintWriterDemo {
    public static void main(String[] args) throws IOException {
        String fileName = "number.txt" ;
        FileWriter out = new FileWriter(fileName) ;
        PrintWriter printWriter = new PrintWriter(out,true) ;//创建文件打印输出流对象,并在输出时候 自动刷新输出流
        //向文件中随机写入10个整数
        for(int i=0; i<10; i++){
            int number = (int)(Math.random() * 101) + 100 ;
            printWriter.println(number) ; //将数字输出到文件中
        }
        //从文件中读10个整数
        FileReader fileReader = new FileReader(fileName) ; //创建文件输入流对象
        BufferedReader bufferedReader = new BufferedReader(fileReader) ; //将文件输入流包装成缓冲输入流
        String aLine = bufferedReader.readLine() ; //按行读入
        while(aLine != null){
            System.out.println(aLine) ; //输出每行
            aLine = bufferedReader.readLine() ; //继续读入下一行
        }
        printWriter.close() ;
        bufferedReader.close() ;
    }
}
  • 使用Scanner类从键盘读取数据,在创建Scanner对象时,将标准输入设备System.in作为其构造方法的参数
  • 使用Scanner还可以关联文本文件,从文本文件中读取数据
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class TextFileDemo {
    public static void main(String[] args){
        File file = new File("number.txt") ;
        try(FileInputStream input = new FileInputStream(file) ;
            Scanner scanner = new Scanner(input) ;){//用指定的输入流构成一个Scanner对象
            while(scanner.hasNextInt()){ //该文件还有下一个标记时循环
                int token = scanner.nextInt() ;
                System.out.println(token) ;
            }
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
    }
}

以上是关于Java中输入输出的主要内容,如果未能解决你的问题,请参考以下文章

(转) Java中的负数及基本类型的转型详解

java代码在片段活动中不起作用

java输入输出程序代码

有没有办法关闭代码片段中的命名建议?

华为OD机试真题Java实现单词反转真题+解题思路+代码(2022&2023)

java 怎么输入输出中文,我写的代码输出会乱码