Java输入输出

article/2025/10/2 9:21:34

源代码见:点击打开链接

引言:在平时java开发中,被输入输出搞得头疼。特此写下这篇博客,一是为了总结输入输出,二是为了和大家分享。如果大家觉得写得好,就请高抬贵手点个赞呗!!!

1.输入格式,输出格式控制

1.1输入处理

    java的输入,我们用到Scanner类,可以用它创建一个对象

    Scanner reader=new Scanner(System.in);

    然后reader对象调用nextBoolean(),nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble()方法来从输入流中获取数据。这些方法在执行时都会阻塞,程序等待用户在输入流中输入enter键(\n)时继续执行。这里的nextInt,hasNextInt()这些方法的调用,会判断当前字节流里面是否有东西,没有就阻塞等待输入直到用户按enter键(\n)结束输入,在Scanner类中有一个变量needInput,当需要读取数据时,needInput=true(也就是调用nextInt,hasNextInt()这些函数的时候)。有一个readInput方法,当字节流中有东西可读时,让needInput=false(表示不需要阻塞等待输入);下面是Scanner.class源码:

 // Tries to read more input. May block.private void readInput() {if (buf.limit() == buf.capacity())makeSpace();// Prepare to receive dataint p = buf.position();buf.position(buf.limit());buf.limit(buf.capacity());int n = 0;try {n = source.read(buf);//这儿} catch (IOException ioe) {lastException = ioe;n = -1;//这儿}if (n == -1) {sourceClosed = true;needInput = false;//这儿}if (n > 0)needInput = false;/这儿// Restore current position and limit for readingbuf.limit(buf.position());buf.position(p);}

    总之,在调用next(),hasNext()方法时,字节流里面有东西,就不用等待,没有东西就阻塞等待。例如:

	public static void main(String[] args) {// TODO Auto-generated method stubScanner s=new Scanner(System.in);int a,b;a=s.nextInt();System.out.println(a);b=s.nextInt();System.out.println(b);/*a=s.nextInt();b=s.nextInt();System.out.println(a+"  "+b);*/}

    当在命令行时输入时,我可以这样输入(在一行就输入两个数据再按enter),当运行到b=s.nextInt()时,发现字节流里面有东西,就没有阻塞等待输入了。

    当然我们也可以这样输入(第一行输入2后,按enter键,然后在输入3,再按enter键)。运行过程是这样的,首先,当运行到a=s.nextInput()时发现,字节流里面没东西,等待输入,于是我们在命令行的第一行输入了2,按回车确认,这时程序继续执行。当运行到b=s.nextInt()时,发现字节流里面没东西,则阻塞等待输入,于是我们在命令行第三行输入3,按enter键确认,程序继续执行。

    Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配(当然可以自定义分隔符)。

     在下面1.3中我们举一个输入控制实例来熟练输入控制的使用。

 

1.2 hasNext源码解析

首先我们分输入源是System.in(也就是控制台),和从文件中读取(FileInputStream)。

(1)对于System.in,不管如何都是要返回true的。我们看源码:

        /*这是测试代码*/Scanner scanner=new Scanner(System.in);while (scanner.hasNext()){System.out.println(scanner.next());}

 我们进入hasNext()函数


public boolean hasNext() {ensureOpen();saveState();while (!sourceClosed) {/*看buffer里面是否有东西,有就返回ture*/if (hasTokenInBuffer())return revertState(true);/*没有就从System.in中读入数据。该方法可能会阻塞*/readInput();}/*对于从控制台中读入数据,这两句代码是永远不会被执行的。相当于从控制台读入数据永远不会结束,sourceClosed永远为false*/boolean result = hasTokenInBuffer();return revertState(result);
}

(2) 从文件中读取(FileInputStream)

 Scanner scanner1=new Scanner(new FileInputStream("/home/fengli/a.txt"));while (scanner1.hasNext()){System.out.println(scanner1.next());}

 在进入hasNext()方法:

public boolean hasNext() {ensureOpen();saveState();while (!sourceClosed) {/*看buffer里面是否有东西,有就返回ture*/if (hasTokenInBuffer())return revertState(true);/*没有就从System.in中读入数据。该方法可能会阻塞*/readInput();}/*用文件中读取,sourceClosed就可能为ture。所以这个方法就可以返回false*/boolean result = hasTokenInBuffer();return revertState(result);
}

 

1.3 输出处理

    可用System.out.println()或System.out.print()来向屏幕进行输出。jdk1.5新增了和C语言中printf函数类似的数据输出方法,

System.out.printf(“格式控制部分”,表达式1,表达式2,……,表达式n)

    格式控制部分由格式控制符号:%d,%c,%f,%s和普通字符组成,普通字符原样输出。格式控制符用来输出表达式的值。

    %d:输出int类型数据值

    %c:输出char类型数据

    %f:输出浮点型数据,小数点部分最多保留6位

    %s:输出字符串数据

    %md:输出int型数据占m列

    %m.nf:输出的浮点型数据占m列,小数点保留n位

格式字符串语法:

    每个格式控制以%开始,以空格或标点符号结尾。

    

 

1.3输入输出实例--读入指定形状,输出指定形状

    实例为输出九九乘法表,源码如下:

public class Main {public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=1;i<=9;i++){for(int j=1;j<=i;j++){System.out.printf("%2d X%2d=%3d ",j,i,i*j);}System.out.println();}}
}

    运行结果:

2.从文件输入,输出

2.1实现方法

    可通过重定向标准输入输出流的方法来实现从文件中输入输出数据。具体使用到的方法如下:

    

static void setIn(InputStream in)//重定向标准输入
static void setOut(PrintStream out) //重定向标准输出

   

2.2从文件输入输出实例--拷贝

    通过重定向的方法,实现从一个文件拷贝东西到另外一个文件。

    代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stub/** FileInputStream里面的路径可以写绝对路径又可以写相对路径,为了程序的移植性,推荐使用相对路径,相对路径* 的根路径是Copy*/FileInputStream fis = null;PrintStream fos=null;try {fis = new FileInputStream("src/source");fos=new PrintStream("src/dest");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.setIn(fis);//重定向标准输入//接下来就和从标准输入流读入数据一样了Scanner sc = new Scanner(System.in);String s=sc.nextLine();System.out.println(s);//重定向输出流System.setOut(fos);//接下来就和从标准输出流读入数据一样了System.out.println(s);}}

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/2m1CJDJh.shtml

相关文章

JAVA的输入输出

1.Java的输出 System,out,println(); //输出且换行 System.out.print(); //输出不换行 System.out.printf(); //提供字符格式化 示例 class Output{public static void main(String args[]){System.out.println("1.println");System.out.println("2.println&qu…

[JAVA]java中的打印输出语句

java中的打印语句分为三种&#xff1a; System.out.print(); System.out.println(); System.out.printf(); 1.System.out.print(); 打印在引号里的字符串 int x 5; System.out.print("今天是周" x); 打印结果&#xff1a; 2.System.out.println(); 和print…

java怎么完成输出语句

我们在前面的文章和案例中&#xff0c;其实早就知道Java是如何实现输出功能的了。没错&#xff0c;就是利用System.out.println()语句来实现的&#xff01;接下来壹哥就给大家详细解读一下这个语句的作用及其含义。 1. System 我们先来看看System是个什么东东。 System是Jav…

Java的输出语句与注释

控制台输出语句 在Java中想要用控制台输出语句首先得先初步认识如下代码&#xff1a; 一&#xff0c;代码块System.out.print("输出内容");注意&#xff1a;Java严格区分大小写&#xff0c;大小写不能搞错。括号里要打引号。代码块结束之后加上; 二&#xff0c;方法…

Java中简单的输入输出语句

Java中简单的输入输出语句 一、输入语句 1.使用Scanner类 使用步骤&#xff1a; (1)导包 import java.util.Scanner; 这一步是必须要做的&#xff01;&#xff01;&#xff01; (2)使用Scanner创建对象 Scanner scnew Scanner(System.in);//sc是你所创建的变量名&#…

Java016——Java输入输出语句

一、输出语句 Java常用的输出语句有三种&#xff1a; 1&#xff09;System.out.println(); 换行输出&#xff0c;输出后会自动换行。 //示例 System.out.println("Hello"); System.out.println("World");//输出 Hello World2&#xff09;System.out.pri…

【单元测试】Junit 4(七)--junit4 TestRunnner

Test Runners 我没想到一个特别合适的词来形容Test Runners的作用&#xff0c;所以多说几句&#xff1a; Test Runners 是具有特殊功能的执行测试用例的通道&#xff0c;也可以理解为测试的执行者&#xff0c;例如可以同时运行多个测试用例&#xff0c;也可以具有这个测试执行…

浅谈单元测试 Junit4

JUint是Java编程语言的单元测试框架&#xff0c;用于编写和运行可重复的自动化测试。本文主要针对Junit4要点进行梳理总结。 一、浅谈单元测试 1.1 什么是单元测试 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。对于…

JUnit4高级篇-由浅入深

JUnit4是JUnit框架有史以来的最大改进&#xff0c;其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation&#xff0c;这个单词一般是翻译成元数据。元数据是什么&#xff1f;元数据就是描述数据的数据。也就是说&#xff0c;这个东西在…

Junit4Junit5对比

Junit是Java编程语言的单元测试框架&#xff0c;用来编写单元测试代码。随着Junit5的盛行&#xff0c;与Junit4有何差异。 JDK支持 Junit4需要Java5版本 Junit5需要Java8版本 Maven依赖 Junit4不区分模块&#xff0c;只有一个jar&#xff1a; <dependency><groupId>…

eclipse中Junit4(单元测试)的配置和使用

在项目的实际开发中&#xff0c;我们需要在完成每层的功能代码实现之后去对该功能的代码进行测试&#xff0c;这是因为如果在所有的代码都写完之后在测试的话&#xff0c;会造成调试困难&#xff0c;代码修改起来也很繁琐&#xff0c;这样开发效率会大大降低&#xff0c;不利于…

IDEA中添加junit4的三种方法

1、第一种方法 首先创建一个工程&#xff0c;创建好一个测试类&#xff0c;类的名称最好不要取Test&#xff0c;接下来写下一个注解Test&#xff0c;此时会报错。 报错的原因是创建的工程项目没有导入Junit4依赖&#xff0c;具体查看是在左上角 file–>project structure …

JUnit 4 与 TestNG 对比

Junit 4 和 TestNG 都是 Java 方面非常流行的单元测试框架。在功能上两个框架都非常类似。到底哪个比较好&#xff1f;在Java项目中我们应该选择哪个框架&#xff1f; 下图将会对Junit 4 和 TestNG 做个功能特征的对比。 注解支持 Junit 4 和 TestNG 在注解方面的实现非常相似。…

Junit 4 Tutorials(Junit 4 教程) 一、Junit简介及Junit Eclipse 教程

Junit 测试框架简介 测试框架是最流行的Java单元测试框架。Junit被用来开发对Java类的单元测试。它就是一个类包&#xff0c;提供了各种方法来测试Java类中的方法(method)。 Junit 4 特性 简单的注解&#xff0c;提供书写Junit测试的基本特性断言方法(Assert Methods)比较测试…

JUnit4 与 JUnit 5 常用注解对比

JUnit4 与 JUnit 5 常用注解对比 JUnit4JUnit5说明TestTest表示该方法是一个测试方法。JUnit5与JUnit 4的Test注解不同的是&#xff0c;它没有声明任何属性&#xff0c;因为JUnit Jupiter中的测试扩展是基于它们自己的专用注解来完成的。这样的方法会被继承&#xff0c;除非它…

JUnit4教程(一):基本应用

一、简介 这个估计大家都比我清楚了&#xff0c;JUnit是一个单元测试框架&#xff0c;我们可以基于它编写用来测试代码的代码&#xff0c;从而更方便地进行回归测试。 二、编写测试与断言&#xff08;Assertion&#xff09; 在Junit4中&#xff0c;编写一个测试方法只需要使用…

JUnit4使用教程-快速入门

序言 大学刚学java的时候就听说过JUnit了&#xff0c;单元测试框架&#xff0c;很好用的测试框架&#xff0c;JUnit测试框架将测试更加便捷和容易&#xff0c;编写测试代码也是简单、明了&#xff0c;功能强大。今天我给大家简单分享一下最新JUnit4的使用&#xff0c;几分钟入…

单元测试——junit4入门例子

简单的Junit4 单元测试入门例子 新建第一个测试test case 这次我使用一个简单的例子来介绍如何写一个简单的单元测试&#xff0c;这里所用的测试工具是eclipse。 点击下载->涉及的项目源代码下载 被测文件 Calculate.java package com.junit4.main;public class Calcul…

JUnit4教程

因jdk5中的新特性&#xff0c;JUnit4也因此有了很大的改变。确切的说&#xff0c;Junit4简直就不是3的扩展版本&#xff0c;而是一个全新的测试框架。下面详细介绍JUnit4的使用方法 1.测试方法&#xff1a; 在junit4之前&#xff0c;测试类通过继承TestCase类&#xff0c;并使用…

JUnit4 jar包下载

JUnit4 jar包 链接&#xff1a;https://pan.baidu.com/s/112B-PaQvlTAzEXxHcpC9Sw 密码&#xff1a;ktrn