Java输入输出

源代码见:点击打开链接引言:在平时java开发中,被输入输出搞得头疼。特此写下这篇博客,一是为了总结输入输出,二是为了和大家分享。如果大家觉得写得好,就请高抬贵手点个赞呗!!!1.输入格式,输出格式控制1.1输入处理java的输入,我们用到Scanner类,可以用它创建一个对象Scannerreader=newScanner(System.in);…

大家好,又见面了,我是你们的朋友全栈君。

源代码见:点击打开链接

引言:在平时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 data
        int 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 reading
        buf.limit(buf.position());
        buf.position(p);
    }

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

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner 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()时,发现字节流里面有东西,就没有阻塞等待输入了。

Java输入输出

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

Java输入输出

    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 stub
		for(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();
		}
	}
}

    运行结果:

Java输入输出

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 block
			e.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);
	}

}

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124592.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 词向量总结「建议收藏」

    词向量总结「建议收藏」词向量词向量是自然语言理解的重要工具,它的核心思想是把词映射到一个向量空间,并且这个向量空间很大程度上保留了原本的语义。词向量既可以作为对语料进行数据挖掘的基础,也可以作为更复杂的模型的输入,是现在nlp的主流工具。下面就总结一下nlp中经典的词向量方法。主要有:onehot、glove、cbow、skip-gram

  • 如何解决Mac上网速度很慢的问题(多种可能分析)[通俗易懂]

    如何解决Mac上网速度很慢的问题(多种可能分析)[通俗易懂]问题:我发现在我的Mac上上网的速度很慢。第一种分析:问题分析:虽然Mac上的运行速度很慢,但同时在我的两台手机上面的运行速度都比较快。我刚开始怀疑是路由器的问题,如果是路由器的问题,那么手机肯定不会很块,手机也会很慢,可以断定肯定是我的mac设置出了问题,我按个这个步骤寻找,去掉8.8.8.8,问题解决了。将上面的DNS地址8.8.8.8去掉就好了分析8.8.8……

  • opc服务器配置PLC信号,plc配置OPC服务器

    opc服务器配置PLC信号,plc配置OPC服务器plc配置OPC服务器内容精选换一换云耀云服务器(HyperElasticCloudServer,HECS)是可以快速搭建简单应用的新一代云服务器,具备独立、完整的操作系统和网络功能。提供快速应用部署和简易的管理能力,适用于网站搭建、开发环境等低负载应用场景。具有高性价比、易开通、易搭建、易管理的特点。云耀云服务器与弹性云服务器的主要区别:云耀云服务器:云耀云服务器是精简视图提供了云服务器…

  • 大学生一个暑假学会5个神仙赚钱技能 | 你学会了几个?记得收藏哟

    大学生一个暑假学会5个神仙赚钱技能 | 你学会了几个?记得收藏哟非常建议我的大学生粉丝以及朋友在这个炎热的夏天暑假拿出一部分来学会或提升这5个神仙技能、尤其是当你对你的大学专业不满意的时候,但不仅能帮你的大学不知识更加优秀,还可以让你的毕业后都有赚钱的第二副业技能、记得必须选一个学会哟、目前我自己除了视频剪辑不会之外、其他的多多少少、术业有专攻、只是熟练程度不一样目录一、学习编程:java入门书籍推荐:进阶书籍推荐:推荐学习平台:二、学习PS:怎样学习PS?三、学习摄影:怎样学习摄影?四、学习剪辑:怎样学习剪辑?..

  • Request对象接收Form表单提交[通俗易懂]

    Request对象接收Form表单提交[通俗易懂]转自:http://www.cnblogs.com/xdp-gacl/p/3798347.htmlForm表单:   HTML的form表单Html的Form表单元素编  号(文本框):size=”2″maxlength=”2″>用户名(文本框):密  码(密码框):性 

  • Java对象拷贝_对象的拷贝有几种方法

    Java对象拷贝_对象的拷贝有几种方法大多时候时候使用的是Apache或Spring“BeanUtils,今天,我们来看一下一个更高效的属性拷贝方式:BeanCopier。https://github.com/cglib/cglibhttps://github.com/cglib/cglib/blob/master/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java首先梳理出来现在有哪些对象拷贝的方式:Apache的BeanUtils:BeanUtils是Apach.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号