Scanner读取问题

演示代码如下

import java.util.Scanner;

public class TestScanner {
public static void main(String[] args) {
Scanner  sc = new Scanner(System.in);
System.out.print("Input Your Name: ");
String name = sc.nextLine();
System.out.print("Input Your Age: ");
int age = sc.nextInt();
System.out.print("Input Your SchoolName: ");
String schoolName = sc.nextLine();
System.out.println("姓名为: " + name + "    年龄为:" + age + "    学校名字为:" + schoolName);
}

}


比如    要输入的名字为:   Jim  Smith          年龄为 :   23       学校为:  Peking University       最后学校出问题      
怎么解决呢 ? 求大神解答

回答: Scanner读取问题

  1. 当你输入到sc.nextInt的时候,他会先读取你所输入的数字,然后再把回车当做缓存储存起来,当你后面的sc.nextLine的时候,就会自动读取缓存,如果你在学校的那里使用sc.next,那么它则不能读取空格,因为空格被视为结束当前输入。所以可以new一个Scanner,那样的话就不存在上述问题。
    import java.util.Scanner;
     
    public class tests1 {
        public static void main(String[] args) {
            Scanner  sc = new Scanner(System.in);
            System.out.print("Input Your Name: ");
            String name = sc.nextLine();
            System.out.print("Input Your Age: ");
            int age = sc.nextInt();
            System.out.print("Input Your SchoolName: ");
            //String schoolName= sc.nextLine();    //会导致前面的nextInt输入完后所储存的回车缓存直接调用进来,从而结束输入
            //String schoolName= sc.next();        //那样无法输入空格,空格被视为结束当前输入
            Scanner sc1= new Scanner(System.in);   //所以这是最优选择
            String schoolName = sc1.nextLine();   
            System.out.println("姓名为: " + name + "    年龄为:" + age + "    学校名字为:" + schoolName);
        }
         
    }

问:在PDA的WINCE系统下开发条形码扫描的项目方向?

  1. Q
    现在有一台集成了 条形码扫描 的PDA,系统是WINCE,目的是要把读取的条形码中的信息读出来,通过PDA的无线接口(GPRS,BlueTooth,.etc)传输到PC上去。

    小弟是嵌入式这方面的白纸,接触的时间还不超过1天,想听听大虾的意见。

    PDA是opticon PHL 5300,内部装了一个opticon scanner(扫描条形码的驱动),就是不知道该从哪里下手。是要从这个opticon scanner读取条形码信息呢,还是WINCE开发就提供了读取条形码信息的接口呢?

    另外WINCE开发就装WINCE.net 4.2就OK了吗? (好像4G+,好大啊)

    还看见了许多 什么EVC阿等等的,不知道有什么区别
  2. A
    我也顶

怎样用Scanner构造器从文件中读取数据?

  1. Q
    下面这个程序是想构造从文件读取数据的Scanner,但是怎样读出来呀,我不会接下来的代码,请帮我完成。

    import java.util.*;

    public class Test
    {
    public static void main(String[] args)
    {
    Scanner in = new Scanner("E:\\java练习程序\\abc.txt");
    }
    }


    文件abc.txt中是有内容的,怎样读出来呢?
  2. A
    放到 工具环境中。

关于JAVA Scanner类的nextInt方法接收到非法输入问题

  1. Q
    我想用Scanner接收一个整型输入,并在出现输入非整型情况时抛出异常提示,同时要求用户重新输入,用了如下代码:

    import java.util.Scanner;

    public class HelloWorld{

        public static void main(String[] args){

            int i = 0;

            Scanner sc = new Scanner(System.in);

            System.out.println("请输入数量:");

            while(true) {

                try {

                    i = sc.nextInt();

                    System.out.println("i="+i);

                    break;

                } catch(Exception e) {

                    System.out.println("请输入一个整型数字:");

                }

            }

        }

    }

    执行如下:

    请输入数量:

    a

    请输入一个整型数字:

    请输入一个整型数字:

    请输入一个整型数字:

    ……

    在接收到一个非法输入a时,程序重复不断抛出异常提示“请输入一个整型数字:”,而不能中断接收新的输入,请问这是为什么,错在哪里?


  2. A
    看nextInt的源码
    当你输入不是整数时
    会抛出异常,并且它的流指针不会往下移
    所以多次读取的都是同一个数据
    抛出异常不会执行后面的代码,即不输出信息也不会break跳出循环
    异常被处理了没有上抛所以也不报错只运行

java读取Excel

  1. Q
    代码:

    import java.io.*;
    import java.util.*;
    import jxl.*;
    import jxl.read.biff.BiffException;

    public class ReadExcel{

    public static void main(String[] args) {
      try {
       Workbook book = Workbook.getWorkbook(new File("1.xls"));
       Sheet sheet = book.getSheet(0);
       System.out.println("请输入要读取的单元格");
       Scanner in = new Scanner(System.in);
       int x = in.nextInt();
       in = new Scanner(System.in);
       int y = in.nextInt();  

       Cell cell1 = sheet.getCell(x,y);
       if (cell1.getType() == CellType.NUMBER) {
       NumberCell nc = (NumberCell) cell1;
       System.out.println("value : " + nc.getValue());
       System.out.println("type : " + cell1.getType());
       System.out.println("Format : " + cell1.getCellFormat());
       System.out.println("NumberFormat: " + nc.getNumberFormat());
       System.out.println("Font"  + cell1.getCellFeatures());
       System.out.println("Colum   "+ cell1.getColumn());
       System.out.println("Class   "+ nc.getClass());
       System.out.println("");
      }

    else {
    System.out.println("Cell(x, y)" + " value : " + cell1.getContents()
      + "; type : " + cell1.getType()+"Format"+cell1.getCellFormat() );    
    }
     
      book.close();
      } catch (BiffException e) {
       // TODO 自动生成 catch 块
       System.out.println(e);
      } catch (IOException e) {
       // TODO 自动生成 catch 块
       System.out.println(e);;
      }
     

    }
    }

    输出:

    请输入要读取的单元格
    3
    3
    value : 67.0
    type : Number
    Format : jxl.biff.XFRecord@1ac33c92
    NumberFormat: java.text.DecimalFormat@7d1f1
    Fontnull
    Colum   3
    Class   class jxl.read.biff.NumberValue



    问题:

    为什么Format : jxl.biff.XFRecord@1ac33c92
    NumberFormat: java.text.DecimalFormat@7d1f1
    这两个输出这些啊?是什么?
  2. A
    这是因为这两处返回的都是对象,返回对象时会调用对象所在类的toString()方法,返回的格式一般为:类名@XXXX(对象在内存中所指向引用的地址),若想返回其他信息,需要重写toString()方法
    例如
    package my.util;
    public class MyUtil {
    	//测试方法
    	public static void main(String[] args) {
    		Demo1 demo1 = new Demo1();
    		Demo2 demo2 = new Demo2();
    		System.out.println("当前打印的对象是:" + demo1);
    		System.out.println("当前打印的对象是:" + demo2);
    	}
    }
    //测试类1
    class Demo1 {
    }
    //测试类2
    class Demo2{
    	//重写toString方法
    	@Override
    	public String toString() {
    		return "我是Demo2的对象";
    	}
    }

    显示结果为(根据你的内存占用情况,第一行结果会不一样)
    当前打印的对象是:my.util.Demo1@1fb8ee3
    当前打印的对象是:我是Demo2的对象
    
    

读取本地json

  1. Q
    {"position":{"id":128,"name":"高级GUI设计师","corporation_id":1228457111,"corporation_name":"上海四五网络科技","nature":"","architecture_name":"设计部","number":2,"number_up":1,"salary_begin":10,"salary_end":15,"is_negotiable":"N","age_begin":0,"age_end":0,"experience_begin":3,"experience_end":0,"is_manager":"N","subordinate":0,"subordinate_up":1,"manager":0,"manager_up":1,"degree_name":"","degree":1,"degree_above":"Y","expect_degree":0,"language_ids":"1,5","language_other":"","language":"[{\"l\":\"\\u82f1\\u8bed\",\"c\":\"\\u56db\\u7ea7(CET-4)\"}]","gender":"U","description":"1、负责2345软件产品界面的UI设计,重点是PC客户端浏览器的UI设计; \\n2、参与产品前期界面UI研究、设计流行趋势分析; \\n3、设定客户端产品的视觉风格和UI设计(软件界面和图标); \\n4、分享设计经验、推动和提高团队的设计能力。","requirement":"1、专科及以上学历,三年或三年以上互联网行业相关工作经验,有软件界面及网页设计经验优先; \\n2、精通PHOTOSHOP\/IIIUSTRATOR或Coredraw等绘图软件; \\n3、具备较高的审美意识和创新设计能力,以及较好的开拓设计思维和团队合作意识; \\n4、对PC客户端、尤其是浏览器有浓厚兴>趣的设计师优先; \\n5、愿意学习新的软件布局工具,能承受较大压力不断推进软件UI进步、技术实现者优先; \\n6、面试时可持个人作品,独立完成的平面设计、WEB GUI设计。","985_211":"N","industry_type":1,"history_experience":"Y","status":0,"artificial_status":0,"is_distribution":0,"artificial_reasons":"","artificial_uid":0,"is_urgent":0,"user_id":19,"source":0,"is_show":0,"workplace":"[]","position_features":"[]","profession":"","favor_corporations":"","rank":"","zhiji":"","functions":"","hope_industries":"[]","favor_schools":"[]","view_time":25,"source_unique":"128@51job","jiezhiriqi":0,"insert_at":1398686556,"insert_update":1400890553,"created":1386818947,"updated":1386853804,"is_deleted":"N"}}


    上面是一个存在本地的json文件,现在想把这个json文件在Java中读取,并且得到  id,corporation_id,等几个字段,求大神给出完整代码
  2. A
    package com.sinosig.cams.interfaces.shualianchedai.dao;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;

    import com.google.gson.JsonArray;

    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;

    public class Test {
    public static void main(String[] args) {
    //String json_str="{\"total\":920,\"data\":[{\"ID\":\"634\",\"Name\":\"于东\"}]}";
    //转换返回的json对象
    JSONObject jsonObject = new JSONObject().fromObject(parseJson());
    //根据json的键获得对应的值
    String position = jsonObject.getString("total");
    //data返回的是一个数组对象
    JSONArray  array = jsonObject.getJSONArray("data");

    for(int i=0;i<array.size();i++){
    //获得数组i
    Object obj = array.get(i);
    //转换
    JSONObject json = new JSONObject().fromObject(obj);
    //打印输出
    System.out.println(json.getString("Name"));

    }

    // System.out.println(position);
    // System.out.println(jsonObject.get("data"));
    // String name = ((JSONObject) jsonObject.get("data")).getString("Name");
    //
    // System.out.println(name);
    }

    public static String parseJson(){

    String fullFileName = "文件路径";
            
            File file = new File(fullFileName);
            Scanner scanner = null;
            StringBuilder buffer = new StringBuilder();
            try {
                scanner = new Scanner(file, "utf-8");
                while (scanner.hasNextLine()) {
                    buffer.append(scanner.nextLine());
                }
     
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
             e.getMessage();
     
            } finally {
                if (scanner != null) {
                    scanner.close();
                }
            }
             
            return buffer.toString();


    }

    }
    这个可以用。。今天花了点时间测试了

Scanner类抛出java.util.NoSuchElementException: No line found的异常

  1. Q
    我需要在程序的不同的地方创建多个scanner对象读取一整行信息,每次用完后都很自然得调用了close方法关掉,当第二个scanner对象调用nextLine时就会出现NoSuchElementException: No line found的异常。
    如果第一个scanner对象不关掉,就不会报错。想知道为什么。
    个人认为这是我们大家都会经常犯的错,但是网上找不到解释。希望大神出现。

    简化的代码如下所示
    import java.util.Scanner;


    public class TempTest{
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    //if(sc.hasNext())
    String s=sc.nextLine();
    sc.close();

    Scanner sc2=new Scanner(System.in);
    sc2.nextLine();
    sc2.close();
    }
    }
  2. A
    你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
    如果通过cmd运行java命令就好了

Java的一个读取文件的超简单问题,为什么会出错!!

  1. Q
    直接上代码:
    public class FCADSTREE {
    public static void main(String[] args) throws IOException {
    File filefca = new File("teamStatis.txt");
    Scanner inputfca = new Scanner(filefca);
    TEAM[] teams = new TEAM[4];
    for (int i = 0; i < 1; i++) {
    teams[i].name = inputfca.next();////这行报错!!!
    teams[i].attack = inputfca.nextInt();
    teams[i].control = inputfca.nextInt();
    teams[i].defend = inputfca.nextInt();
    }
    inputfca.close();
    for (int i = 0; i < 1; i++)
    System.out.println(省略了);
    }
    }


    TEAM类为:
    public class TEAM {
    String name=new String();
    int attack;
    int control;
    int defend;
    }


    报错信息为:java.lang.NullPointerException

    teamStatis.txt这个文件肯定没有问题,因为如果我用
    String string=inputfca.next();
    则可以正常读取。

    请问程序错在哪里了??
  2. A
    在for循环里在加一句teams [i]=new TEAM();

qt如何读取ucs2编码的文本文件?

  1. Q
    我在自己的程序里需要读取一个其他程序的ini配置文件,但是这个ini文件是ucs2编码,我应该怎样才能将他正确的读出来?
  2. A
    首先:你需要确定,你提到的UCS编码到底是指代 UTF16-be,UTF16-le,还是带BOM的UTF16

    其次:你需要判断,你的 ini 文件是和 QSettings兼容的 ini文件,还是只能用QFile去读取

大神们过来了帮帮小弟我(关于Scanner和引用引用传递的知识)

  1. Q
    题目如下;
    Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
    数据规模与约定
    1 <= n <= 1,000,000。

    我的代码;
    import java.util.Scanner;
    public class Case03 
    {

    public static void main(String[] args) 
    {
    Scanner input = new Scanner(System.in);
    System.out.println("请输入一个正数");
    int n = input.nextInt();
    int count=0;
    if (n>=1&&n<=1000000) 
    {
    int a =  count(n);
    System.out.println("余数为"+a);
    }
    else
    System.out.println("请输入1~1000000之间的数");
    }
    public static int count(int n)
    {
    if (n!=1&&n!=2) 
    {
    return (count(n-1)+count(n-2))%10007;
    }
    else
    return 1;
    }

    正确代码如下;
    import java.util.Scanner;
    public class My09
    {
        public static void main(String[] args) 
        {
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt() ;  
            int[] a = new int[num+2] ;
            a[1] = a[2] = 1;
            if (num == 1) {
                a[num] = 1 ;
            }else if (num == 2) {
                a[num] = 1 ;
            }else {
                for (int i = 3; i <= num; i++) 
                {
                    a[i] = (a[i - 1] + a[i - 2]) % 10007;
                }
            }
            System.out.println(a[num]);
        }
    }

    问题如下;
    1、在第二个代码中当num=1000000000时,为什么会出现这样的的错误的?这的数也没有超出int类型啊!,那是什么原因了?
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.ixh.cui.My09.main(My09.java:10)

    2、为什么当输入的整数越大时第一个代码的运行速度会变的那么慢,而第二个代码没什么明显的变化,这是什么原因了?
    请大神们具体说明情况!!!
  2. A
    1.应该是开不了这么大的数组    放在main函数外面可以   全局变量
    2.第二个是先把所有的都算出来,存在数组中,需要哪一个输出哪一个,时间复杂度是线性的,速度快。而第一个用递归,每找一个都要重新计算并且递归要调用栈什么什么的很麻烦。。。
    个人也是小白,不对的地方批评指正